当前进程的环境变量

当前进程的环境变量

我正在尝试查找当前正在运行的进程的环境变量。

让可执行文件为test。我正在做的事情:

./test // first run test

在程序内部我有一个打印语句,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

我究竟做错了什么?

操作系统:种子 Ubuntu 16.04(32 位),在 Virtual Box GCC 版本上运行:5.4.0

视频链接

答案1

在终端会话记录中,

seed@ubuntu:~/test$ strings /proc/$$/environ | grep LOGNAME

seed@ubuntu:~/test$部分只是用户的提示字符串 - 实际的命令是

strings /proc/$$/environ | grep LOGNAME

这里,$$没有反斜杠)是 shell 的 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因此,此命令返回shell 环境中的值- 它实际上并不用于检查调用的进程的环境shell(尽管一般来说,进程会继承shell的环境)。


在 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

相关内容