扫码加入

  • 正文
  • 相关推荐
申请入驻 产业图谱

飞凌嵌入式ElfBoard-环境变量之获取环境变量

03/13 16:23
326
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

在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的时候自动退出循环。

相关推荐