日期:2014-05-16 浏览次数:20744 次
1. 打印系统中的所有环境变量的值。
系统中有一个二维指针变量environ,它指向一个数组指针,
这个数组指针里面的每个元素都是指向一个环境变量的指针。
#include <stdlib.h>
extern char **environ;
int main(int argc, char **argv[])
{
while (*environ)
{
printf("%s\n", *environ);
environ++;
}
exit(0);
}
# gcc -o main main.c
编译源代码。
运行main程序,可以看到环境变量会一个一个打印出来。
在linux系统下,可以进入shell然后通过export或者env等命令来查看是否正确。
sh-# export
export CONSOLE="/dev/console"
export HOME="/"
export LD_LIBRARY_PATH="......"
export OLDPWD
export PATH="/bin:/usr/bin:/sbin:/usrbin"
export PWD="/"
export RUNLEVEL="S"
export SHLVL="3"
export TERM="vt100"
sh-#
可以看到,源代码中打印的环境变量和命令打印的环境变量是一样的结果。
刚刚发现再一次执行就不能打印环境变量的值了,原来是因为程序中将environ指向了
环境变量表的末尾了。
所以,正确的做法应该是:
char **env = environ;
这样移动这个局部变量env就不会有问题了。
2. 使用setenv库函数修改环境变量PATH的值。
#include <stdlib.h>
int main(int argc, char **argv[])
{
char *path = null;
path = malloc(1024*sizeof(char));
if (null == path)
{
printf("\nmemory not enough");
exit(-1);
}
path = getenv("PATH");
printf("\nPATH=%s", path);
setenv("PATH", "/bin:/sbin:/usr/bin:/usr/sbin", 1);
path = getenv("PATH");
printf("\nPATH=%s", path);
exit(0);
}
编译程序测试运行,从控制台输出的日志信息来看,结果和预期的相符。
另外,在linux shell下通过env命令查看,也是正确的。
sh-# env | grep PATH
3. 使用setenv和unsetenv库函数来增加和删除一个环境变量。
#include <stdlib.h>
int main(int argc, char **argv[])
{
char *path = null;
setenv("MY_ENVIRON", "my_environment", 1);
path = getenv("MY_ENVIRON");
printf("\n%s", path);
sleep(10);
unsetenv("MY_ENVIRON");
exit(0);
}
通过控制台输出的日志信息可以看到,新增加的环境变量MY_ENVIRON可以打印出来其值。
但是在linux shell下面通过set/env/export等命令查看却都看不到MY_ENVIRON。
这是为何?
试一下看打印environ这个环境变量表是否可以打印出来?
将环境变量表environ打印出来,仍然看不到新增加的环境变量MY_ENVIRON。
待确认问题:
1. 为什么增加一个环境变量MY_ENVIRON却没有增加成功?
2. 为什么unsetenv一个环境变量LD_LIBRARY_PATH后,从环境变量表environ中已经找不到了‘
但是通过linux命令set/env/export等仍然可以查到环境变量LD_LIBRARY_PATH呢?