Как использовать setenv() для экспорта переменной в С++?

Мне нужно экспортировать несколько переменных, чтобы они выглядели следующим образом в командной строке

export ROS_HOSTNAME=xxx

Как мне использовать setenv() в С++ для достижения этого?

Спасибо.


person return 0    schedule 29.07.2013    source источник
comment
По какой причине вы упомянули тег command-line в контексте вашего вопроса? Вам нужно будет 'экспортировать' куда? Разработайте это, пожалуйста!   -  person πάντα ῥεῖ    schedule 29.07.2013
comment
В каком контексте эти переменные среды должны быть видны? Если они должны быть видны только внутри программы, вызывающей setenv, все в порядке. Если вам нужно, чтобы они были видны в вашей оболочке после запуска программы, скажите об этом; есть (косвенные) способы сделать это, но я не собираюсь отвечать на этот вопрос, пока вы его не зададите.   -  person Keith Thompson    schedule 29.07.2013
comment
Экспорт — это функция оболочки. setenv() всегда экспортируйте environ/envp, если разветвленному дочернему элементу не передается настроенный envp, т. е. execle().   -  person    schedule 03.04.2016


Ответы (3)


Из setenv() ручной записи:

ОБЗОР

#include <stdlib.h>  
int setenv(const char *envname, const char *envval, int overwrite);

ОПИСАНИЕ
Функция setenv() должна обновлять или добавлять переменную в среде вызывающего процесса. Аргумент envname указывает на строку, содержащую имя переменной среды, которую необходимо добавить или изменить. Переменной среды должно быть присвоено значение, на которое указывает envval. Функция завершится ошибкой, если envname указывает на строку, содержащую символ '='. Если переменная среды, названная envname, уже существует и значение перезаписи не равно нулю, функция должна вернуть успех, и среда должна быть обновлена. Если переменная среды с именем envname уже существует, а значение перезаписи равно нулю, функция должна вернуть успех, а среда останется неизменной.

Если приложение изменяет окружение или указатели, на которые оно указывает, поведение setenv() не определено. Функция setenv() должна обновить список указателей, на которые указывает окружение.

Строки, описанные envname и envval, копируются этой функцией.

Функция setenv() не обязательно должна быть реентерабельной. Функция, не требующая повторного входа, не обязана быть потокобезопасной.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
После успешного завершения возвращается ноль. В противном случае должно быть возвращено -1, errno установлено для указания ошибки, а среда не должна изменяться.

Так что вы должны позвонить

setenv("ROS_HOSTNAME","xxx",1); // does overwrite

or

setenv("ROS_HOSTNAME","xxx",0); // does not overwrite

для вашего случая. Зависит от того, хотите ли вы перезаписать возможно существующее определение.

ПРИМЕЧАНИЕ:

Вы не можете использовать setenv() для экспорта переменных из вашего процесса в вызывающий процесс (оболочку)! Дочерние процессы, созданные с помощью fork, унаследуют текущие определения среды процессов, а также ваши изменения и дополнения.

person πάντα ῥεῖ    schedule 29.07.2013

Здесь подпись для функции setenv

#include <stdlib.h>

int setenv(const char *envname, const char *envval, int перезапись);

Ссылка: http://pubs.opengroup.org/onlinepubs/009695399/functions/setenv.html

В вашем случае вы называете это так:

setenv("ROS_HOSTNAME", "xxx", true);

последний логический аргумент указывает, хотите ли вы перезаписать значение переменных среды, если оно уже существует.

person elmadj    schedule 29.07.2013

Сделайте так:

setenv("ROS_HOSTNAME", "xxx", true);

Обратите внимание и на синопсис:

#include <stdlib.h>

int setenv(const char *envname, const char *envval, int overwrite);

Подробнее о setenv() см. эту ссылку. .

person Shumail    schedule 29.07.2013