Linux是一个多用户的操作系统,用户登入系统后,都会有一个专用的运行环境,这个默认环境实际上就是一组环境变量的定义。用户可以定制自己的运行环境,修改相应的系统环境变量。
常见的环境变量有:
HOSTNAME指主机的名称。
LANG指和语言相关的环境变量。
应用程序常常增加一些环境变量,例如使用JAVA就要设置JAVA_HOME和CLASSPATH等,输入法增加环境变量XMODIFIERS=@im=fcitx等。
在Shell中常用的环境变量命令:
1. 显示环境变量HOME
$echo $HOME
2. 设置一个新的环境变量 WELCOME
$export WELCOME="Hello!"
3. 使用env显示所有的环境变量
$env
4. 使用set命令显示所有本地定义的shell变量
$set
5. 用unset命令清除环境变量
$unset
6. 使用readonly命令设置只读环境变量
$readonly TEST
在应用程序中,可以使用C函数getenv,setenv,unsetenv来设置环境变量。
举个例子,说明父进程与子进程之间环境变量的传递。
在父进程中,通过setenv设置http_proxy环境变量值,然后调用wget程序去拿文件。wget这个子进程通过getenv得到环境变量,根据此设置去下载文件。
在父进程中,执行一个子进程函数如下:
static int execve_program(char **argv,int isWait)
{
pid_t pid, childpid;
int status, istatus;
printf("execve_program:%s %s start/n",argv[0],argv[1]);
pid = vfork ();
if (pid == 0)
{ // we are the child
execvp (argv[0], argv);
_exit (1);
}
else if(isWait)
{
childpid = wait (&status);
istatus=WEXITSTATUS(status);
}
printf("execve_program:%s %s end/n",argv[0],argv[1]);
return istatus;
}
实践证明,使用execvp函数,可以将环境变量传递给子进程。当时试过execve函数,不太清楚如何设置最后一个参数,最后一个参数若为NULL,子进程通过getenv不能得到主进程设置的环境变量。