【C语言】【unix c】环境变量(续)
程序员文章站
2023-12-21 22:27:52
...
一、环境变量
bash下的环境变量
每个进程都默认从父进程继承环境变量
bash本身就是一个程序,这个程序运行的时候,是bash进程
可以定义只能在自己的这个进程中使用的变量,称之为自定义变量
用户可以使用【export 环境变量名字】 将自定义变量变为环境变量,环境变量可以被子进程继承
如何使用程序访问环境变量:
系统维护着一个全局变量(extern char **environ;)这个全局变量的名字就是环境变量列表的首地址 ????? //**environ也就是指针数组和*argv[]其实一样,只是前者是变量,后者是常量
借用这个全局变量,遍历环境变量列表(trav_l.c)
[email protected]:~/day/day31$ cat trav_l.c
#include <stdio.h>
extern char **environ; //这里作用仅是扩充作用域
int main(void) {
while(*environ != NULL) {
printf("%s\n", *environ);
environ++;
}
return 0;
}
C语言的完整开头:
int main(int argc, char *argv[], char *envp[])//第三个参数可以改变环境变量
只用这种方式来遍历环境变量的列表(trav_l1.c)
#include <stdio.h>
int main(int argc, char *argv[], char *envp[]) {
int i = 0;
for(; envp[i] != NULL; i++)
printf("%s\n", envp[i]);
return 0;
}
[email protected]:~/day/day31$ a.out
SSH_AGENT_PID=1875
GPG_AGENT_INFO=/tmp/keyring-RH8OwI/gpg:0:1
TERM=xterm
SHELL=/bin/bash
XDG_SESSION_COOKIE=d3194bb0b9dac9419f2d00d200000009-1502412776.464108-1366998638
WINDOWID=60820196
OLDPWD=/home/tarena
...
几个操作环境变量的函数
getenv(3)
#include <stdlib.h>
char *getenv(const char *name);
功能:找到名字为name的环境变量,返回一个指针(该字符串值的首地址)(即获取环境变量的值)
参数:
name:指定了环境变量的名字
返回值: NULL 找不到匹配的
找到了就返回环境变量值字符串的首地址
举例:环境变量的操作(env_op.c)
#include <stdio.h>
#include <stdlib.h>
int main(void) {
printf("%s\n", getenv("name"));
return 0;
}
[email protected]:~/day/day31$ a.out
Beijing
注意:环境中得有name变量才可以,否则是段错误(返回NULL)
putenv(3)
#include <stdlib.h>
int putenv(char *string);
功能:增加或改变环境变量的值
参数:
string:必须遵循name=value格式,如果name不存在,增加环境变量列表,如果存在,改变环境变量的值为value
返回值:成功 0
失败 非0
举例:接上例
#include <stdio.h>
#include <stdlib.h>
int main(void) {
putenv("CHINA=beijing");
printf("%s\n", getenv("CHINA"));
return 0;
}
[email protected]:~/day/day31$ a.out
beijing
[email protected]:~/day/day31$ env|grep CHINA
没有值
但是: 在env中察看变量是查不到的
原因: a.out是bash子进程,在子进程里添加了环境变量,但是父进程是无法继承子进程的环境变量的,程序执行结束后用env察看环境变量时是在bash进程下,所以没有
setenv(3)
#include <stdlib.h>
int setenv(const char *name, const char *value, int overwrite);
功能:增加或改变一个环境变量
参数:
name:指定环境变量的名字
value:指定环境变量的值
overwrite:如果环境变量存在,overwrite设置为非0的情况下,改变环境变量的值为value
如果overwrite设置为0,环境变量的值不改变
返回值:0 成功
-1 错误 errno被设置
int unsetenv(const char *name);
功能:删除环境变量
参数:
name:指定要删除的环境变量
返回值:0 成功
-1 错误 errno被设置
举例:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
printf("%s\n", getenv("name"));
putenv("CHINA=beijing");
printf("before...%s\n", getenv("CHINA"));
setenv("CHINA", "Nanjing", 1);
printf("after...%s\n", getenv("CHINA"));
unsetenv("name");
printf("%s\n", getenv("name"));
return 0;
}
overwrite=0:
[email protected]:~/day/day31$ a.out
Beijing
before...beijing
after...beijing //如果overwrite设置为0,环境变量的值不改变
段错误 (核心已转储) //删除后变量没有了,指向NULL,产生段错误
overwrite=1:
[email protected]:~/day/day31$ a.out
Beijing
before...beijing
after...Nanjing //为非0的情况下,改变环境变量的值为value
段错误 (核心已转储)
clearenv(3)
#include <stdlib.h>
int clearenv(void);
功能:清楚环境变量
参数:无
返回值:0 成功
非0 失败