Установить системную переменную из C ++ - PullRequest
3 голосов
/ 23 ноября 2011

Этот сценарий оболочки

#!/bin/csh
set VAR=12345
echo $VAR

будет мирно выдавать вывод 12345 в оболочке. Мне нужно использовать C ++, чтобы сделать то же самое в некоторой части кода:

string str = "12345";
retValue="set var1= "+str;      
system(retValue1.c_str());
system("echo $var1");

Это не создает системную переменную var1 и echos null, что понятно, поскольку каждая системная функция создаст дочерний процесс с различными переменными среды. Поэтому я объединяю их следующим образом, используя только одну системную функцию ... но она снова выдает ноль.

retValue="set var1= "+str;
retValue1=retValue+";\n echo $var1";
system(retValue1.c_str());

Может кто-нибудь подсказать, как настроить системную переменную через C ++. Большое спасибо заранее!

Ответы [ 5 ]

10 голосов
/ 23 ноября 2011

Посмотрите на setenv in <cstdlib>:

#include <cstdlib>

setenv("VAR", "12345", true);
1 голос
/ 23 ноября 2011

Вы можете использовать putenv().

#include <cstdlib>
...
putenv("VAR=12345");

Это очень удобно, но строка не копируется putenv.Это означает, что если вы измените его позже, то вы измените среду.Это не проблема для литерала, но способ формирования строк с использованием std::string не совсем совместим с putenv().

Альтернативой является использование setenv()

* 1012.*

С помощью setenv() создаются копии ввода, и вы можете избавиться от строк после вызова setenv().

0 голосов
/ 23 ноября 2011

Над ответами правильно объясняется, как установить переменную окружения из программы на C ++, которая в основном setenv()

Единственное, что я хотел сказать, это то, что почему ваш подход не работает? Причина в том, что при загрузке процесса команда system загружается с новым контекстом - эквивалентом новой оболочки. На самом деле ваша переменная окружения устанавливается , но когда вы возвращаетесь, она теряется.

См. Это http://pubs.opengroup.org/onlinepubs/007904975/functions/setenv.html.

Infact, setenv() устанавливает переменные env parent process! Вот почему это работает для вас.

0 голосов
/ 23 ноября 2011

Вы в принципе не можете этого сделать.

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

Выможет иметь соглашение об использовании вашей программы на C ++, например, что она выводит некоторые команды оболочки для получения (или eval -ed) пользователем.Примером этого является ssh-agent -s.

0 голосов
/ 23 ноября 2011

Функция, которую вы хотите, вероятно, putenv().Вы не указали, в какой ОС вы работаете, поэтому я буду использовать Linux, потому что это man-страница, которая мне пригодится:

int putenv (char * string);

Функция putenv () добавляет или изменяет значение переменных окружения.Строка аргумента имеет форму имя = значение.Если имя еще не существует в среде, то строка добавляется в среду.Если имя существует, то значение имени в среде изменяется на значение.Строка, на которую указывает строка, становится частью окружения, поэтому ее изменение изменяет окружение.

IIRC, также есть wintenv на win32.Наконец, вы можете попробовать посмотреть на этот вопрос, возможно, дуплекс

...