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;
}
編譯後運行: