每个进程在启动的时候都会收到一张环境表。环境表是由一个字符指针数组组成,每个指针包含一个以NULL结束的字符串的地址,全局变量environ包含了指针数组的地址:

extern char **environ;

在linux中,环境变量由:name=value这样的字符串组成,下图是一个由5个环境变量组成的环境表结构:

如果是查看整个环境需要使用environ变量,如果只读取某个变量可以使用getenv和pucenv函数。

相关函数:

#include <stdlib.h>
char *getenv(const char *name);

说明:

函数的返回值是name=value中value字符串的地址,若未找到则返回NULL。

#include <stdlib.h>
int putenv(char *str);
int setenv(const char *name, const char *value, int rewrite);
int unsetenv(const char *name);

说明:

        函数返回值:若成功则返回0,出错则返回非0值。

        putenv的操作是将name=value字符串放到环境表中,若name存在,则先删除其原来的定义。

        setenv将name设置成value。如果在环境中name存在,当rewrite非0,则首先删除其现有的定义。当rewrite为0,则不删除其现有的定义(name不设置为新的value,而且也不出错);

        unsetenv删除name的定义。即使name不存在也不出错。

putenv和setenv的区别:

setenv必须分配存储区,以便依据其参数创建name=value字符串。同时,putenv则无需将传送给它的参数字符串直接放到环境中。

注意:在使用putenv时,将存放在栈中的字符串作为参数传送给该函数时就会发生错误,其原因是,从当前函数返回时,其栈帧占用的存储区可能将被重用。

修改环境表时的操作:

进程中的环境表和环境字符串通常放在进程存储空间的顶部。删除一个字符串很简单,只要在环境表中将字符串删除后将其后续的指针向环境表的顶部顺序移动一个位置即可;但增加或修改一个字符串则不同,因环境表通常占用进程地址空间的顶部,不能再向高地址方向(向上)扩展,也不能移动在它之下的个栈帧,所以也不能向低地址方向扩展。两者组合使得该空间的长度不能在增加。

修改一个现有的name:

如果新的value的长度少于或等于现有的value的长度,则只需直接修改其源内容即可。 如果新value的长度大于源长度,则必须调用malloc为新字符串分配空间,然后将name的指针指向新的字符串。

增加一个新的环境变量:

如果是第一次增加环境变量,则在给新的环境变量分配空间后需要将环境表复制到新的分配区,也就是重新为环境表分配一个空间,然后将新的环境变量的地址存放在环境表的表尾,最后在在环境表的尾部添加一个空指针即可。当然,需要将environ指向新的环境表。

如果不是第一次增加环境变量,则只需要将新的环境变量的地址添加进环境表的尾部,在在环境表的尾部增加一个新的空指针即可。

最新文章

  1. BCP 数据的导入和导出
  2. Arguments Optional
  3. BIEE 仪表盘的创建
  4. _EPROCESS结构简单了解!
  5. JAVA 想让类无法new,可以使用private将类的构造函数改为私有的,这样new的时候就会报错了
  6. startssl证书firefox支持配置
  7. Fiddler插件 --- 解密Elong Mapi请求参数及响应内容
  8. 【JAVASCRIPT】React学习- 杂七杂八
  9. TCP三次握手和四次挥手过程
  10. Redis多服务器负载均衡的实现
  11. python 练完这些,你的函数编程就ok了
  12. 微软连续12年成为Gartner分析和BI平台魔力象限的领导者
  13. 19.翻译系列:EF 6中定义自定义的约定【EF 6 Code-First约定】
  14. JavaSE学习总结(四)——Java面向对象十分钟入门
  15. centos7 卸载和安装最新版本docker-ce,配置阿里云加速
  16. 丑数(UVa136)
  17. C do {...} while (0) 在宏定义中的作用
  18. hadoop上线和下线节点
  19. 第十届蓝桥杯 试题 E: 迷宫
  20. Redis基本讲解

热门文章

  1. 如何在Linux下拷贝一个目录呢
  2. Spring3中js/css/jpg/gif等静态资源无法找到(No mapping found for HTTP request with URI)问题解决--转载
  3. 给学习IT、编程者的看
  4. C#生成DBF文件
  5. Oracle基础 (十三)日期函数
  6. PHP实现无级递归分类(ThinkPHP框架)
  7. React Native学习-CameraRoll
  8. javascript中Math ceil(),floor(),round()三个函数的对比
  9. P2022 有趣的数
  10. ASP.NET自定义错误页面