getenv/putenv/setenv/unsetenv

来源:互联网 发布:如何在淘宝上交水电费 编辑:程序博客网 时间:2024/05/22 18:22

Linux环境变量操作函数

getenv - get an environment variable

#include <stdlib.h>char *getenv(const char *name);//Returns:与name相关的value的指针, NULL if not found
  • 我们应该总是使用getenv来获取环境的特殊值,而不是直接访问environ
  • 下章我们会知道我们可以仅仅影响当前进程和其子进程的环境
  • 我们不能影响父进程的环境,父进程经常是shell
  • 环境变量删除容易,增加难(栈上面存放环境变量的空间是无法扩充的)

ISO C没有定义任何环境变量。一些环境变量是由单一Unix规范的POSIX.1定义的。

单一Unix规范定义的环境变量如下:
figure 7.7

putenv - change or add an environment variable

#include <stdlib.h>int putenv(char *string);int setenv(const char *name, const char *value, int overwrite);int unsetenv(const char *name);//Returns: 0 if OK, nonzero on errorint clearenv(void);

putenv:用形式为name=value的字符串放入环境列表,如果已经存在,则替换旧值
setenv:set name to value. 如果name已经存在,若overwrite为真,已经存在的值被覆盖。如果overwrite为假,name不变,name值不变为value,且不产生error
unsetenv:移除任何name的定义。如果定义(definition)不存在,不产生错误
clearenv:移除environment list的所有entries

putenv和setenv的区别

  1. setenv必须分配空间给name = value string
  2. putenv是直接将参数传给环境
  3. 如果putenv传入的string是在stack上分配的,会出错。

修改、增加环境变量的几种情况

  • 如果我们修改环境变量
    • 新值尺寸小于等于旧值尺寸,直接复制
    • 反之,malloc获得新string的空间,替代环境列表中旧的指针
  • 增加新name
    • 第一次增加新值,在heap上给environment list分配空间
    • 不是第一次,之前已经为环境列表在heap上分配了新空间,直接调用realloc分配更大的空间来保存更多的pointer
0 0
原创粉丝点击