【原创】设置进程环境变量函数 putenv() 和 setenv() 的区别

putenv() 函数并不copy环境变量数值到进程环境表,只是存放环境变量数值的指针,而setenv()函数则完全copy环境变量数值到进程环境表。

实验如下:

[@more@]

第一:在main函数中调用putenv(),设置进程环境变量

源代码:

#include
#include

extern char **environ;
void setfun(void);

int main()
{
int i=0;
char tt[]="ORACLE_SID=test";
while(environ[i]!=NULL)
{
printf("n%s",environ[i]);
i++;
}

printf("nn");

if(putenv(tt)!=0)
{
printf("Error in putenv.n");
return 1;
}

i=0;

while(environ[i]!=NULL)
{
printf("n%s",environ[i]);
i++;
}
printf("n--END--n");

return 0;
}


运行结果如下:

[root@fsever cuitao]# ./put

HOSTNAME=fsever
TERM=vt100
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=10.1.5.243 2761 22
OLDPWD=/root
SSH_TTY=/dev/pts/0
USER=root
LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:
SSH_AUTH_SOCK=/tmp/ssh-ysCTm27384/agent.27384
MAIL=/var/spool/mail/root
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
INPUTRC=/etc/inputrc
PWD=/root/cpp/apue/cuitao
LANG=en_US.UTF-8
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
SHLVL=1
HOME=/root
LOGNAME=root
CVS_RSH=ssh
SSH_CONNECTION=10.1.5.243 2761 10.1.3.50 22
LESSOPEN=|/usr/bin/lesspipe.sh %s
G_BROKEN_FILENAMES=1
_=./put


HOSTNAME=fsever
TERM=vt100
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=10.1.5.243 2761 22
OLDPWD=/root
SSH_TTY=/dev/pts/0
USER=root
LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:
SSH_AUTH_SOCK=/tmp/ssh-ysCTm27384/agent.27384
MAIL=/var/spool/mail/root
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
INPUTRC=/etc/inputrc
PWD=/root/cpp/apue/cuitao
LANG=en_US.UTF-8
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
SHLVL=1
HOME=/root
LOGNAME=root
CVS_RSH=ssh
SSH_CONNECTION=10.1.5.243 2761 10.1.3.50 22
LESSOPEN=|/usr/bin/lesspipe.sh %s
G_BROKEN_FILENAMES=1
_=./put
ORACLE_SID=test
--END--
[root@fsever cuitao]#

第二:在单独的函数中采用自动变量的方式调用putenv()

源代码:

#include
#include

extern char **environ;
void setfun(void);

int main()
{
int i=0;
while(environ[i]!=NULL)
{
printf("n%s",environ[i]);
i++;
}

printf("nn");

setfun();

i=0;

while(environ[i]!=NULL)
{
printf("n%s",environ[i]);
i++;
}

printf("n--END--n");

return 0;
}
void setfun(void)
{
char tt[]="ORACLE_SID=test";
if(putenv(tt)!=0)
{
printf("Error in putenv.n");
}
}


运行结果如下:

[root@fsever cuitao]# ./putenv

HOSTNAME=fsever
TERM=vt100
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=10.1.5.243 2761 22
OLDPWD=/root
SSH_TTY=/dev/pts/0
USER=root
LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:
SSH_AUTH_SOCK=/tmp/ssh-ysCTm27384/agent.27384
MAIL=/var/spool/mail/root
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
INPUTRC=/etc/inputrc
PWD=/root/cpp/apue/cuitao
LANG=en_US.UTF-8
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
SHLVL=1
HOME=/root
LOGNAME=root
CVS_RSH=ssh
SSH_CONNECTION=10.1.5.243 2761 10.1.3.50 22
LESSOPEN=|/usr/bin/lesspipe.sh %s
G_BROKEN_FILENAMES=1
_=./putenv


HOSTNAME=fsever
TERM=vt100
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=10.1.5.243 2761 22
OLDPWD=/root
SSH_TTY=/dev/pts/0
USER=root
LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:
SSH_AUTH_SOCK=/tmp/ssh-ysCTm27384/agent.27384
MAIL=/var/spool/mail/root
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
INPUTRC=/etc/inputrc
PWD=/root/cpp/apue/cuitao
LANG=en_US.UTF-8
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
SHLVL=1
HOME=/root
LOGNAME=root
CVS_RSH=ssh
SSH_CONNECTION=10.1.5.243 2761 10.1.3.50 22
LESSOPEN=|/usr/bin/lesspipe.sh %s
G_BROKEN_FILENAMES=1
_=./putenv
鄑字縯字眶o?
--END--
[root@fsever cuitao]#

显然错误!

第三:在单独函数中使用serenv()设置进程环境变量表

源代码:

#include
#include

extern char **environ;
void setfun(void);

int main()
{
int i=0;
while(environ[i]!=NULL)
{
printf("n%s",environ[i]);
i++;
}

printf("nn");

setfun();

i=0;

while(environ[i]!=NULL)
{
printf("n%s",environ[i]);
i++;
}

printf("n--END--n");

return 0;
}

void setfun(void)
{
char ct_name[]="ORACLE_SID";
char ct_value[]="test";
if(setenv(ct_name,ct_value,1)!=0)
{
printf("Error in putenv.n");
}
}


运行结果如下:

[root@fsever cuitao]# ./setenv

HOSTNAME=fsever
TERM=vt100
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=10.1.5.243 2761 22
OLDPWD=/root
SSH_TTY=/dev/pts/0
USER=root
LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:
SSH_AUTH_SOCK=/tmp/ssh-ysCTm27384/agent.27384
MAIL=/var/spool/mail/root
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
INPUTRC=/etc/inputrc
PWD=/root/cpp/apue/cuitao
LANG=en_US.UTF-8
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
SHLVL=1
HOME=/root
LOGNAME=root
CVS_RSH=ssh
SSH_CONNECTION=10.1.5.243 2761 10.1.3.50 22
LESSOPEN=|/usr/bin/lesspipe.sh %s
G_BROKEN_FILENAMES=1
_=./setenv


HOSTNAME=fsever
TERM=vt100
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=10.1.5.243 2761 22
OLDPWD=/root
SSH_TTY=/dev/pts/0
USER=root
LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:
SSH_AUTH_SOCK=/tmp/ssh-ysCTm27384/agent.27384
MAIL=/var/spool/mail/root
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
INPUTRC=/etc/inputrc
PWD=/root/cpp/apue/cuitao
LANG=en_US.UTF-8
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
SHLVL=1
HOME=/root
LOGNAME=root
CVS_RSH=ssh
SSH_CONNECTION=10.1.5.243 2761 10.1.3.50 22
LESSOPEN=|/usr/bin/lesspipe.sh %s
G_BROKEN_FILENAMES=1
_=./setenv
ORACLE_SID=test
--END--
[root@fsever cuitao]#


如此验证了二者设置方式的不同。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7437037/viewspace-978040/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/7437037/viewspace-978040/

你可能感兴趣的:(【原创】设置进程环境变量函数 putenv() 和 setenv() 的区别)