在shell命令行中可以通过多种方式查看环境变量;shell本身就是一个进程,子进程会继承父进程的环境变量副本,可以直接通过env命令查看当前shell进程的所有环境变量;
如果想查看特定进程的环境变量,也可以使用 /proc 文件系统。例如,要查看进程ID为 PID 的进程的环境变量,可以执行以下命令:
| cat /proc/PID/environ | tr '\0' '\n' |
这里PID是实际需要查看进程的ID,/proc/PID/environ 文件包含该进程的环境变量,以空字符 (\0) 分隔。tr '\0' '\n' 命令用于将这些空字符替换为换行符,使输出更易读。
在应用程序中,可以通过多种方式获取当前运行环境的环境变量,main()函数的参数,getenv()函数,environ全局变量等。
1.main
1)函数原型
main()函数通常作为程序的执行起始点,有 3 种原型定义:
| int main(); /* 原型 1 */
int main(int argc, char *argv[]); /* 原型 2 */ int main(int argc, char *argv[], char *env[]); /* 原型 3 */ |
C语言标准(ISO/IEC 9899)定义了两个合法的 main 函数签名,原型 1 和原型 2 ,这两种形式是跨平台的标准写法,适用于所有符合标准的C语言编译器和平台。原型 3 提供了参数用来获取环境变量,这并不是标准C的main函数定义,不过有些系统可以使用它来接收环境变量(如Linux)。
在类Unix操作系统(如Linux、Mac OS)中,main 函数的一个常见扩展是增加了第三个参数 char **env,用来传递环境变量。虽然这种形式不是C语言标准规定的一部分,但它是类Unix操作系统上的惯用写法,因为环境变量是这些操作系统中的重要机制。
2)参数
argc:程序运行时发送给main函数的命令行参数的数目;
argv:是指向参数的各个指针所构成的数组。argv[0]指向程序运行的全路径名,后续的数组元素组成参数列表,argv[argc]值为 NULL;
env:字符串数组;其中每个元素都是环境变量的 "名称=值" 形式。
3)示例:(通过 main()函数的env 参数获取环境变量)
| #include <stdio.h>
int main(int argc, char *argv[], char **env){ for (int i = 0; env[i]; i++) { printf("%s\n", env[i]); } return 0; } |
通过运行这个程序,可以遍历的输出当前进程的环境变量;
2.getenv
想要获取某个指定的环境变量,可以使用 C 语言的标准库函数 getenv()。getenv()函数从当前进程的环境中查找指定名称的环境变量,并返回其值。
1)头文件
#include <stdlib.h>
2)函数原型
char *getenv(const char *name);
3)参数
name:是要获取的环境变量名,返回值为该变量的值。如果存在该环境变量,则返回该环境变量的值对应字符串的指针;如果不存在该环境变量,则返回 NULL。
4)返回值
返回一个指向环境变量值的指针(即环境变量的值的字符串),失败返回NULL。
5)示例:通过getenv()函数获取环境变量SHELL的值
| #include <stdio.h>
#include <stdlib.h> int main(int argc, char *argv[]){ char* env; env = getenv("SHELL"); printf("The SHELL value of the environment variable: %s\n", env); return 0; } |
6)运行结果
| The SHELL value of the environment variable: /bin/bash |
7)代码解析:
使用 getenv("SHELL") 获取名为 SHELL 的环境变量的值,并将返回值存储到 env 变量中,如果存在,返回该变量的值(类型为 char*);如果不存在,返回 NULL。用printf() 将 SHELL 环境变量的值以及描述信息打印到标准输出。
3.environ
在加载进程的时候,系统会为每一个进程复制一份系统环境变量副本,并保存在全局变量 environ 中。通过 environ,可以直接访问当前进程的所有环境变量。它的内容与 main(int argc, char *argv[], char **env) 中的 env 参数相同,只不过 environ 是一个全局变量,可以在程序的任何地方访问,而 env 是局部的。
environ本质上是一个全局变量,用于访问当前进程的环境变量数组。它在类Unix操作系统(如Linux、Mac OS)中比较常见;应用程序中只需要声明它就可以调用了。
| extern char **environ; // 申明外部全局变量 environ |
1)extern
extern 关键字用于声明一个外部变量,表明该变量是在其他地方(通常是在标准库中或操作系统的底层实现中)定义的,而不是在当前文件中定义的。通过 extern,告诉编译器这个变量在其他地方已经定义过,可以在此处使用。
2)示例:通过 environ 全局变量获取环境变量
| #include <stdio.h>
extern char **environ; int main(int argc, char *argv[]){ for (int i = 0; environ[i]; i++) { printf("%s\n", environ[i]); } return 0; } |
3)代码解析:
运行此程序会遍历的当前进程的环境变量。环境变量的存储方式是一个用NULL结尾的字符串数组,所以也可以通过判断 environ[i] 是否为 NULL 来确定数组的结尾。在 C 语言中,任何非零值都被视为 true,而 NULL(通常定义为 (void*)0)被视为 false。所以这里也是for循环查找到NULL的时候自动退出循环。
326