[size=medium][b]进程环境[/b][/size]
进程的环境是一个以 NULL 字符结尾的字符串之集合。在程序中可以用一个以 NULL结尾的字符型指针数组来表示它。系统规定,环境中每个字符串形式如下:
Linux 系统提供了 environ 指针,通过它我们可以在程序中访问其环境内容。在使用 environ 指针前,应该首先声明它:
showenv.c
下面这个程序的输出为:
如果要为进程指定新的环境,则需要使用 exec 系列中的两种系统调用:execle()和execve()。它们在 Linux 系统函数库 unistd.h中的函数声明如下:
查找系统的指定名称环境变量的值的实现
在 Linux 的系统函数库 stdlib.h 中提供了一个系统调用 getenv(),它完成与findenv()同样的工作。另外还有一个与 getenv()相配对的系统调用 putenv(),它用于改变和扩充环境,其使用方法为:
进程的环境是一个以 NULL 字符结尾的字符串之集合。在程序中可以用一个以 NULL结尾的字符型指针数组来表示它。系统规定,环境中每个字符串形式如下:
name=somethin
Linux 系统提供了 environ 指针,通过它我们可以在程序中访问其环境内容。在使用 environ 指针前,应该首先声明它:
extern char **environ;
showenv.c
#include <stdio.h>
#include <unistd.h>
extern char** environ;
main()
{
char** env = environ;
while(*env){
printf("%s\n",*env++);
}
}
下面这个程序的输出为:
TERM=vt100
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=219.221.98.71 3474 22
SSH_TTY=/dev/pts/40
HISTFILESIZE=1000
USER=tomotoboy
MAIL=/var/mail//tomotoboy
PATH=/usr/bin:/usr/local/bin:/usr/local/mysql/bin:/opt/SunStudio_11/SUNWspro/bin
:/usr/ccs/bin:/usr/sfw/bin:.
PWD=/home/l/g/tomotoboy/process
LANG=C
TZ=PRC
PS1=$PWD >
SHLVL=1
HOME=/home/l/g/tomotoboy
LOGNAME=tomotoboy
SSH_CONNECTION=219.221.98.71 3474 192.168.1.10 22
OLDPWD=/home/l/g/tomotoboy
_=./pro_5
如果要为进程指定新的环境,则需要使用 exec 系列中的两种系统调用:execle()和execve()。它们在 Linux 系统函数库 unistd.h中的函数声明如下:
int execle( const char *path, const char *arg , ..., char * const envp[]);
int execve ( const char *filename, char *const argv [], char* const envp[]);
它们的调用方法分别类似于 execl()和 execv(),所不同的是它们增加了一个参数 envp,这是一个以NULL指针结束的字符数组, 它指出了新进程的环境。 下面的程序演示了execve()的用法,它用 execve()把新的环境传送给上面的程序程序showenv:
#include <unistd.h>
main()
{
char *argv[]={"showenv", NULL},
*envp[]={"foo=bar", "bar=foo", NULL};
execve("./showenv",argv,envp);
perror("exeve failed.");
return;
}
查找系统的指定名称环境变量的值的实现
#include <stdio.h>
#include <unistd.h>
extern char** environ;
//用于查找系统的环境变量的值
char* findenv(char* name)
{
int len;
char **p;
for(p=environ;*p;p++)
{
if((len=pcmp(name,*p))>=0 &&*((*p)+len)=='=')
{
char *s=((*p)+len+1);
return s;
}
}
return NULL;
}
//比较两个字符串是否相等,不等返回-1,相等返回第一个字符串的长度
int pcmp(char* s1, char* s2)
{
int i=0;
while(*s1) {
i++;
if (*s1++!=*s2++)
return -1;
}
return i;
}
main(){
char* name="PATH\0";
char* s;
s=findenv(name);
printf("%s\n",s);
}
//输出为:
/usr/bin:/usr/local/bin:/usr/local/mysql/bin:/opt/SunStudio_11/SUNWspro/bin:/usr
/ccs/bin:/usr/sfw/bin:.
在 Linux 的系统函数库 stdlib.h 中提供了一个系统调用 getenv(),它完成与findenv()同样的工作。另外还有一个与 getenv()相配对的系统调用 putenv(),它用于改变和扩充环境,其使用方法为:
putenv(“newvariable=value”);
如果调用成功,其就返回零。需要注意的是,它只能改变调用进程的环境,而父进程的环境并不随之改变。