进程的环境列表
-
每一个进程都有与其相关的称之为环境列表(environment list)的字符串数组,或简称为环境(environment)。其中每个字符串都以名称=值(name=value)形式定义。因此,环境是“名称-值”的成对集合,可存储任何信息。常将列表中的名称称为环境变量(environment variables)。
-
新进程在创建之时,会继承其父进程的环境副本。这是一种原始的进程间通信方式,却颇为常用。环境(environment)提供了将信息从父进程传递给子进程的方法。由于子进程只
有在创建时才能获得其父进程的环境副本,所以这一信息传递是单向的、一次性的。子进程创建后,父、子进程均可更改各自的环境变量,且这些变更对对方而言不再可见。 -
环境变量的常见用途之一是在 shell 中。通过在自身环境中放置变量值,shell 就可确保把这些值传递给其所创建的进程,并以此来执行用户命令。例如,环境变量 SHELL 被设置为shell程序本身的路径名,如果程序需要执行 shell 时,大多会将此变量视为需要执行的 shell 名称。
从程序中访问环境
在 C 语言程序中,可以使用全局变量 char **environ 访问环境列表。(C 运行时启动代码定义了该变量并以环境列表位置为其赋值。)environ 与 argv 参数类似,指向一个以 NULL 结尾的指针列表,每个指针又指向一个以空字节终止的字符串。
修改环境接口
定义函数
char * getenv(const char *name);
函数说明:getenv()用来取得参数name环境变量的内容。参数name为环境变量的名称,如果该变量存在则会返回指向该内容的指针。环境变量的格式为name=value。
#include<stdlib.h>
#include<stdio.h>
int main()
{
char *p;
if(p = getenv("USER"));
printf("USER = %s\n", p);
return 0;
}
执行:USER = luxun
定义函数
int putenv(const char * string);
函数说明: putenv()用来改变或增加环境变量的内容。参数string的格式为name=value,如果该环境变量原先存在,则变量内容会依参数string改变,否则此参数内容会成为新的环境变量。
返回值:执行成功则返回0,有错误发生则返回-1。
#include<stdlib.h>
#include<stdio.h>
int main()
{
char *p;
if(p = getenv("USER"));
printf("USER = %s\n", p);
putenv("USER=ADMIN");
printf("USER = %s\n", getenv("USER"));
return 0;
}
执行:USER = luxun
USER = ADMIN
定义函数
int setenv(const char *name,const char * value,int overwrite);
函数说明:setenv()用来改变或增加环境变量的内容。参数name为环境变量名称字符串。
参数:value则为变量内容,参数overwrite用来决定是否要改变已存在的环境变量。如果overwrite不为0,而该环境变量原已有内容,则原内容 会被改为参数value所指的变量内容。如果overwrite为0,且该环境变量已有内容,则参数value会被忽略。
返回值:执行成功则返回0,有错误发生时返回-1。
#include<stdlib.h>
#include<stdio.h>
int main()
{
char *p;
if(p = getenv("USER"));
printf("USER = %s\n", p);
setenv("USER","ADMIN",5);
printf("USER = %s\n", getenv("USER"));
return 0;
}
执行:USER = luxun
USER = ADMIN