我正在尝试查找当前正在运行的进程的环境变量。
让可执行文件为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