Переменные среды текущего процесса

Я пытаюсь найти переменные среды текущего запущенного процесса.

Пусть исполняемый файл будет 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

Ссылка на видео

1
задан 19 July 2019 в 01:37

1 ответ

В расшифровке стенограммы терминального сеанса,

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
2
ответ дан 7 December 2019 в 13:15

Другие вопросы по тегам:

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