日期:2014-05-16  浏览次数:20699 次

linux 环境变量相关的库函数学习

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呢?