1.Linux的变量种类
按变量的生存周期来划分,Linux变量可分为两类:
1.1 永久的:添加到/etc/profile,变量永久生效。
例:export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
1.2 临时的:使用export命令声明即可,变量在关闭shell时失效。
例:在当前shell输入 export PATH=/usr/local/sbin
2.程序中使用环境变量
2.1 函数getenv 获取环境变量
2.2 函数setenv,putenv 设置环境变量
2.3 函数unsetenv取消环境变量
注意:当起进程A时,此时进程A会继承当前环境变量的值(也就是说,进程A 执行前,环境变量USER=X,进程A 执行起来后,你即使在shell export USER=Y,进程A 中USER的值还是X),但是进程A可以通过 setenv来修改环境变量的值(setenv设置的环境变量只在本进程和子进程有效),来达到进程A的需求。
当进程A fork 子进程B时,同理,子进程会优先继承父进程的环境变量 。
例:#A.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/prctl.h>
int createProcess(char* path)
{
int pid = fork();
if(pid == -1)
{
printf("fork failed\n");
return -1;
}
else if(pid == 0)
{
int currentPid = getpid();
prctl(PR_SET_PDEATHSIG, SIGTERM);
setpgid(currentPid, currentPid);
int ret = execl(path, path, NULL);
if(ret < 0)
{
printf("execl failed\n");
}
}
return pid;
}
int main(int argc,char ** argv)
{
printf("1 father USER:%s\n",getenv("USER"));
setenv("USER","ROOT1",1);
printf("2 father USER:%s\n",getenv("USER"));
createProcess("B");
sleep(5);
return 1;
}
#B.c
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char ** argv)
{
printf("child USER:%s\n",getenv("USER"));
return 1;
}
编译后运行: