Я пытаюсь найти переменные среды текущего запущенного процесса.
Пусть исполняемый файл будет test
. Что я делаю:
./test // first run test
Внутри программы у меня есть оператор print, выполняющий getpid()
, который печатает pid текущего процесса, когда исполняемый файл начинает выполняться.
Затем, используя распечатанный на консоль pid, я делаю,
strings /proc/<pid>/environ
Теперь, есть ли другой способ указать pid, не выписывая его явно?
Я видел в одном из видео, что они указывают pid с помощью команды, подобной этой:
seed@ubuntu:~/test$ strings /proc/$/environ | grep LOGNAME
LOGNAME=seed
Я не совсем правильно понял. Предполагая test
в качестве исполняемого файла, я попытался:
seed@ubuntu: ./test$ strings /proc/\$\$/environ | grep LOGNAME
Но он возвращает:
bash: /test$: No such file or directory
Что я делаю не так?
ОС: Seed Ubuntu 16.04 (32-разрядная версия), работающая в Virtual Box GCC Версия: 5.4.0
В расшифровке стенограммы терминального сеанса,
seed@ubuntu:~/test$ strings /proc/$$/environ | grep LOGNAME
seed@ubuntu:~/test$
часть является просто строкой приглашения пользователя - фактическая команда
strings /proc/$$/environ | grep LOGNAME
Здесь, $$
(без обратных косых черт), PID оболочки, как описано в Special parameters
раздел man bash
:
$ Expands to the process ID of the shell. In a () subshell, it expands to the process ID of the current shell, not the sub‐ shell.
Таким образом, эта команда возвращает значение LOGNAME
в среде оболочки - это действительно не предназначено для исследования среды процесса, вызванного от оболочки (хотя в целом, процесс наследует среду оболочки).
В программе C можно получить значения переменных среды намного более непосредственно, с помощью getenv
функция:
GETENV(3) Linux Programmer's Manual GETENV(3) NAME getenv, secure_getenv - get an environment variable SYNOPSIS #include <stdlib.h> char *getenv(const char *name);
Так, например,
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
char *envval;
if((envval = getenv("LOGNAME")) != NULL) {
printf("Value of LOGNAME is: %s\n", envval);
}
else {
printf("LOGNAME not found in environment\n");
}
return 0;
}
таким образом, что
$ gcc -o getenv_test getenv_test.c
$ LOGNAME=foo ./getenv_test
Value of LOGNAME is: foo