#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
, как и ожидалось.