Linux学习笔记:
https://blog.csdn.net/2301_80220607/category_12805278.html?spm=1001.2014.3001.5482
前言:
环境变量(Environment Variables)是操作系统与应用程序之间的重要桥梁。它们为进程提供运行时配置信息,在操作系统的资源管理和应用程序的灵活性方面扮演了关键角色。本文将全面介绍进程环境变量的概念、常见环境变量、操作指令,以及如何通过C语言中的
getenv
和
setenv
函数对环境变量进行操作,配以代码示例和表格,帮助你深入理解这一重要知识点。
一、环境变量的基础概念
1.1 什么是环境变量?
环境变量是键值对形式的全局变量,定义了系统和进程的运行环境。它们用于存储系统配置、用户信息以及运行时参数,供操作系统和应用程序读取和使用。
环境变量的基本格式为:
KEY=VALUE
- KEY:变量名(大小写敏感)。
- VALUE:变量值,可以是路径、字符串、数字等。
1.2 环境变量的作用
环境变量的主要作用包括:
- 配置程序运行环境:如定义程序搜索路径、语言环境等。
- 传递系统信息:提供系统版本、主机名等信息。
- 控制进程行为:通过变量值影响程序的行为和运行逻辑。
我们来讲一下一个常见的环境变量的作用:程序搜索路径(PATH)
PATH时我们在打开系统时就会存在的环境变量,我们可以通过下面的指令查看PATH环境变量的内容:
echo $PATH
我们可以查看到一串的路径,那么这些路径有什么特殊之处吗?
我们可以看这样一个例子,对于我们自己生成的一个可执行文件,比如myproc,要想运行必须是./myporc,而不能是.myproc,原因就是我们执行一个文件时是需要先找到它的位置的,我们需要告诉系统它是在当前路径下的
但是我们也知道有一些指令,比如pwd指令,我们并没有告诉系统它所在的位置,但是它仍然能够被执行,这又是为什么呢?这就与我们上面PATH中的路径有关了
之所以系统指令比如pwd,ls等可以不指明路径的原因就是它们的路径其实就是上面PATH中的路径,这些路径是系统默认搜索路径,而我们自己创建的路径并不包含在其中,但其实我们可以通过操作将我们的路径添加进去,比如:
PATH = $PATH:/home/zwt
此时我们就发现我们将我们自己的路径也添加到PATH中去了
另外我们使用which查找指令时就是从PATH环境变量中搜索的,所以此时我们也可以使用which查找我们自己写的可执行文件,比如上面提到的myproc
二、常见环境变量
以下是操作系统中常见的环境变量及其作用:
环境变量描述示例
PATH
定义可执行程序的搜索路径,多个路径用冒号分隔。
/usr/bin:/bin:/usr/local/bin
HOME
当前用户的主目录。
/home/username
USER
当前用户名。
username
SHELL
用户默认的Shell路径。
/bin/bash
LANG
语言和区域设置,影响程序的语言显示。
en_US.UTF-8
LD_LIBRARY_PATH
动态链接库搜索路径。
/usr/local/lib:/usr/lib
TEMP
或
TMP
临时文件的存储路径。
/tmp
EDITOR
默认文本编辑器。
vim
示例:查看系统中的环境变量
# 查看所有环境变量
env
# 打印特定环境变量
echo $PATH
三、环境变量的特性
3.1 环境变量的继承
环境变量在进程的生命周期中由父进程传递给子进程。当一个进程创建子进程时,子进程会继承父进程的环境变量。
- 父进程修改环境变量,不影响已运行的子进程。
- 子进程修改环境变量,也不会影响父进程。
示例:父子进程环境变量继承
#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环境变量修改了,但是父进程的没有被修改
输出说明:
- 子进程的修改不会影响父进程的环境变量。
3.2 环境变量的生命周期
- 环境变量的生命周期与进程绑定。
- 进程终止时,其环境变量也会被销毁。
四、管理环境变量的常用指令
在Linux中,可以通过命令行轻松管理环境变量。
指令描述示例
echo $VAR
查看环境变量的值。
echo $HOME
export VAR=value
设置环境变量,并导出到子进程。
export MYVAR=123
unset VAR
删除环境变量。
unset MYVAR
env
或
printenv
查看当前进程的所有环境变量。
env
五、C语言中的环境变量操作
在C语言中,可以通过标准库函数操作环境变量,包括获取、设置和删除。
5.1 获取环境变量:
getenv
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;
}
5.2 设置环境变量:
setenv
setenv
函数用于设置或更新环境变量的值。
函数原型
int setenv(const char *name, const char *value, int overwrite);
name
:环境变量名。value
:环境变量值。overwrite
:是否覆盖已有值(非零值表示覆盖)。
示例:设置环境变量
#include <stdio.h>
#include <stdlib.h>
int main() {
// 设置环境变量
if (setenv("MYVAR", "Hello, World!", 1) == 0) {
printf("MYVAR set to: %s\n", getenv("MYVAR"));
} else {
perror("Failed to set environment variable");
}
return 0;
}
5.3 删除环境变量:
unsetenv
unsetenv
函数用于删除指定的环境变量。
函数原型
int unsetenv(const char *name);
示例:删除环境变量
#include <stdio.h>
#include <stdlib.h>
int main() {
setenv("MYVAR", "Hello, World!", 1);
printf("Before unset: MYVAR = %s\n", getenv("MYVAR"));
unsetenv("MYVAR");
printf("After unset: MYVAR = %s\n", getenv("MYVAR")); // 输出NULL
return 0;
}
5.4 遍历所有环境变量:
environ
全局变量
environ
存储了所有环境变量的指针数组,可以用来遍历当前进程的环境变量。
示例:打印所有环境变量
#include <stdio.h>
extern char **environ;
int main() {
char **env = environ;
while (*env) {
printf("%s\n", *env);
env++;
}
return 0;
}
六、环境变量的安全性与常见问题
6.1 环境变量的安全性
环境变量可能存储敏感信息(如API密钥、密码等),因此需要注意以下几点:
- 避免敏感信息暴露:尽量不要在环境变量中存储明文密码。
- 限制环境变量的访问范围:不要轻易导出变量到子进程。
- 验证外部输入:防止外部程序通过环境变量注入恶意代码。
6.2 常见问题与解决方案
问题原因解决方案环境变量未被子进程继承未使用
export
导出环境变量。使用
export
命令显式导出。环境变量过长导致错误部分系统对环境变量大小有限制(如ARG_MAX)。尽量缩短环境变量的值,或使用文件存储配置信息。修改环境变量无效修改变量后未启动新进程。确保变量在进程启动前已正确设置。
七、总结
环境变量是操作系统与应用程序之间的重要接口,它以简单而灵活的方式为进程提供运行时的配置信息。从本文中,我们学习了环境变量的基本概念、常见变量、管理方式,以及如何使用C语言操作环境变量。通过理论分析和代码示例,希望你能在实际开发中更好地理解和应用环境变量。
在实际学习和工作中,合理使用环境变量能够极大提高程序的可配置性和灵活性,同时也需要注意其安全性,避免泄露敏感信息。
感谢各位大佬观看,创作不易,还请各位大佬点赞支持!!!
版权归原作者 GG Bond.ฺ 所有, 如有侵权,请联系我们删除。