Отсутствуют новые переменные среды

#c #linux

#c #linux

Вопрос:

Я установил новую переменную среды в своей программе, но не могу найти ее из оболочки:

 int main()
{
    if(!setenv("TEST","22222",0)) perror("");
    sleep(1000);
    return 0;
}
  

Я пробую это с

 $ a.out amp;
[3] 605
$ Success

$ cat /proc/605/environ|grep 2222
$ ps e 605|grep 2222
$
  

Есть идеи?
Большое спасибо.

Комментарии:

1. FWIW, вот как вы можете это сделать 😉 int main(int argc, char **argv, char **envp){ strcpy(envp[0], "TEST=22222"); sleep(1000); } . Это приведет к перезаписи других переменных окружения, но это единственный способ, которым вы можете это сделать, поскольку /proc/<pid>/environ он не делает никакой магии, он просто отражает содержимое области виртуальной памяти процесса, начало и длина которой не меняются во время выполнения процесса.

2. И, кстати, будьте осторожны с 3-м аргументом setenv ; это означает «перезаписать»; если это 0 и TEST переменная уже присутствует в среде, ее значение останется неизменным и setenv вернет статус 0 ( успех ).

Ответ №1:

Как объяснено в man 5 proc (обратите внимание на выделенный жирным шрифтом абзац):

/proc/[pid]/environ

Этот файл содержит исходную среду, которая была установлена при запуске текущей исполняемой программы с помощью execve (2). Записи разделены нулевыми байтами ( '' ), и в конце может быть нулевой байт. Таким образом, чтобы распечатать среду процесса 1, вы должны сделать:

 $ cat /proc/1/environ | tr '00' 'n'
  

Если после execve (2) процесс изменяет свое
окружение (например, вызывая такие функции, как
putenv (3) или изменение переменной environ (7)
напрямую), этот файл не будет отражать эти изменения.

Ответ №2:

Переменная установлена. Вы можете подтвердить это через:

 printf ("%s n",getenv("TEST"));
  

который возвращает 22222 , как и ожидалось.