Linux进程环境表

1.环境表


   每个进程都有一个环境表,存储当前进程的环境变量。每个环境变量由“name=value”这样的字符串组成。环境表的内存布局:  

 

2.环境表的操作函数


  char * getenv(const char *name);

    该函数用来获取名字为name的环境变量值,不存在时返回NULL。

  int putenv(const char * string);

    该函数用来改变或增加环境变量的内容。参数string的格式为“name=value”,如果该环境变量已经存在则会覆盖。

  int setenv(const char *name, const char * value,int overwrite);

    该函数用来改变或增加环境变量的内容。根据参数overwrite看是否覆盖。

  int unsetenv(const char *name);

    清除某个环境变量。

3.问题


  问题1:putenv和setenv的区别:putenv函数不会复制刚设置的环境变量的值(而是直接用当前的值),而setenv会把设置的环境值复制一份并分配内存。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
void addenv(char *key)
{
        char *p, buff[128];
        const char *value = "hello";
 
        sprintf(buff, "%s=%s", key, value);
        setenv(key, value, 0);              //putenv(buff);
 
        p = (char *)getenv(key);
        printf("[temp] %s:%s\n", key, p);   //输出[temp] MYENV:hello
}
 
int main()
{
        char *p;
 
        p = (char *)getenv("MYENV");
        printf("MYENV:%s\n", p);            //当前没有,所以输出NULL
 
        addenv("MYENV");
 
        p = (char *)getenv("MYENV");       //如果上面是用putenv()设置的,则addenv()返回后,局部变量buff已经释放,此时会得到NULL值(也可能程序崩溃)
        printf("MYENV:%s\n", p);           //如果上面是用setenv()设置的,则此时会得到正确的值,因为该函数设置环境变量值时会拷贝buff。
 
        return 0;
}

  上面的例子有个地方要注意,如果在addenv函数中,用这种方法设置环境变量:putenv("MYENV=HELLO");。则在函数返回后可以得到正确的值,这是因为这个常量字符串在静态区(而buff是在栈区),函数返回后不会释放。

 

posted on   能量星星  阅读(433)  评论(0编辑  收藏  举报

努力加载评论中...

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示