环境变量的起源:无声的指引
每个进程的运行都需要依赖一组“默契”的参数和配置,这些参数与配置便以环境变量的形式存在。操作系统通过为每个进程分配一组环境变量,使得进程能够在运行时访问和调整系统资源,从而确保其能够与系统中的其他进程和资源和谐共处。进程环境变量是操作系统在进程生命周期中赋予的隐形助手,负责指引着进程走向其预定的目标。
本篇我们将全面介绍进程环境变量的概念、常见环境变量、操作指令,以及如何通过C语言中的getenv和setenv函数对环境变量进行操作,配以代码示例和表格,帮助你深入理解这一重要知识点。
环境变量是键值对形式的全局变量,定义了系统和进程的运行环境。它们用于存储系统配置、用户信息以及运行时参数,供操作系统和应用程序读取和使用。
环境变量的基本格式为:
KEY=VALUE环境变量的主要作用包括:
我们来讲一下一个常见的环境变量的作用:程序搜索路径(PATH)
PATH时我们在打开系统时就会存在的环境变量,我们可以通过下面的指令查看PATH环境变量的内容:
echo $PATH在输入上述指令与之前所学的pwd后,我们都得到了一串路径。那么二者之间有什么区别呢?

我们可以看这样一个例子,对于我们自己生成的一个可执行文件,比如myproc,要想运行必须是./myporc,而不能是.myproc,原因就是我们执行一个文件时是需要先找到它的位置的,我们需要告诉系统它是在当前路径下的
但是我们也知道有一些指令,比如pwd指令,我们并没有告诉系统它所在的位置,但是它仍然能够被执行,这又是为什么呢?这就与我们上面PATH中的路径有关了
之所以系统指令比如pwd,ls等可以不指明路径的原因就是它们的路径其实就是上面PATH中的路径,这些路径是系统默认搜索路径,而我们自己创建的路径并不包含在其中,但其实我们可以通过操作将我们的路径添加进去,比如:
PATH = $PATH:/home/ccc
此时我们就发现我们将我们自己的路径也添加到PATH中去了
另外我们使用which查找指令时就是从PATH环境变量中搜索的,所以此时我们也可以使用which查找我们自己写的可执行文件,比如上面提到的myproc
以下是操作系统中常见的环境变量及其作用:

示例:查看系统中的环境变量
# 查看所有环境变量
env
# 打印特定环境变量
echo $PATH
环境变量在进程的生命周期中由父进程传递给子进程。当一个进程创建子进程时,子进程会继承父进程的环境变量。
示例:父子进程环境变量继承
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
printf("Parent: PATH = %s\n", getenv("PATH"));
pid_t pid = fork();
if (pid == 0) {
// 子进程
setenv("PATH", "/tmp", 1);
printf("Child: PATH = %s\n", getenv("PATH"));
} else {
// 父进程
sleep(1); // 等待子进程修改完成
printf("Parent after fork: PATH = %s\n", getenv("PATH"));
}
return 0;
}
子进程的PATH环境变量修改了,但是父进程的没有被修改
输出说明:
在Linux中,可以通过命令行轻松管理环境变量。

在C语言中,可以通过标准库函数操作环境变量,包括获取、设置和删除。
getenv函数用于获取指定环境变量的值。如果环境变量不存在,则返回NULL。
函数原型:
char *getenv(const char *name);示例:获取环境变量值
#include <stdio.h>
#include <stdlib.h>
int main() {
char *path = getenv("PATH");
if (path) {
printf("PATH: %s\n", path);
} else {
printf("PATH not set.\n");
}
return 0;
}
setenv函数用于设置或更新环境变量的值。
函数原型:
int setenv(const char *name, const char *value, int overwrite);示例:设置环境变量