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是在栈区),函数返回后不会释放。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步