Установить переменные окружения в C

Есть ли способ установить переменные окружения в Linux с помощью C?

Я пробовал setenv () и putenv () , но, похоже, они не работают для меня.

32
задан Simon 2 June 2018 в 17:19
поделиться

4 ответа

Я собираюсь сделать здесь безумное предположение, но обычная причина того, что эти функции не работают, заключается не в том, что они не работают, а в том, что пользователь на самом деле не понимает, как работают переменные среды. Например, если у меня есть эта программа:

int main(int argc, char **argv)
{
  putenv("SomeVariable=SomeValue");
  return 0;
}

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

48
ответ дан 27 November 2019 в 20:28
поделиться

Любая программа UNIX выполняется в отдельном процессе от процесса, который ее запускает; это «дочерний» процесс.

Когда программа запускается - будь то из командной строки или любым другим способом - система создает новый процесс, который является (более или менее) копией родительского процесса. Эта копия включает переменные среды в родительский процесс, и это механизм, с помощью которого дочерний процесс «наследует» переменные среды своего родительского процесса. (это все, в основном, то, что здесь сказали другие ответы)

То есть, только процесс когда-либо устанавливает свои собственные переменные среды.

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

Примите во внимание следующее:

% cat envs.c
#include <stdio.h>
int main(int argc, char**argv)
{
    int i;
    for (i=1; i<argc; i++) {
        printf("ENV%d=%s\n", i, argv[i]);
    }
}
% echo $ENV1

% ./envs one two
ENV1=one
ENV2=two
% eval `./envs one two`
% echo $ENV1
one
% 

Встроенный eval оценивает свой аргумент, как если бы этот аргумент был введен в приглашении оболочки.Это пример в стиле sh; вариант в стиле csh оставлен как упражнение!

11
ответ дан 27 November 2019 в 20:28
поделиться

Переменная среды, заданная с помощью setenv () / putenv (), будет установлена ​​для процесса, который выполнил эти функции, и будет унаследована запущенными ею процессами. Однако он не будет транслироваться в оболочку, которая выполняла вашу программу.

Почему моя оболочка вокруг setenv () не работает?

5
ответ дан 27 November 2019 в 20:28
поделиться

Блок среды является локальным для процесса и копируется в дочерние процессы. Таким образом, если вы меняете переменные, новое значение влияет только на ваш процесс и дочерние процессы, порожденные после изменения. Конечно, это не изменит оболочку, из которой вы запустили.

1
ответ дан 27 November 2019 в 20:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: