ISO C定义了一个函数getenv,可以用其取环境变量值。

#include <stdlib.h>
char* getenv(const char* name); //返回与name关联的value的指针,若没有找到则返回NULL。

除了取环境变量的值,有时也需要设置环境变量,但是不是所有的系统都支持,详细如下图:

clearenv不是SUS的组成部分,它被用来删除环境表中的所有项。

表中的三个函数原型是:

#include <stdlib.h>
int putenv(char *str); //将name=value的字符串放到环境表中,如果name已经存在,则先删除其原来的定义。
int setenv(const char* name, const char* value, int rewrite);
//将name设置value,如果name已经存在,那么(a)若rewrite非0,则首先删除其现有定义,(b)若rewrite为0,不删除
//现有定义,不设置新的value,也不出错。
int unsetenv(const char*name); //删除name的定义,如果不存在name也不出错。

三个函数返回值:如果成功则返回0,出错返回非0值。

环境表和环境字符串通常存放在进程存储空间的顶部,删除一个字符串很简单,只要现在环境表中找到该指针,然后将所有

后续指针都向环境首部顺次移动一个位置。但是增加一个字符串或者修改一个现有的字符串就困难的多。环境表和环境字符

串通常占用的是进程地址空间的顶部,所以不能再向高地址方面扩展,同时也不能移动在它之下的各栈帧,所以它也不能向

低地址方向扩展。

典型的存储器分配安排如下图所示:

1.如果修改一个现有的name:

a.如果新的value的长度少于或者等于现有value的长度,则只要在原字符串所用空间中写入新字符串。

b.如果新value的长度大于原长度,则必须调用malloc为新字符串分配空间,然后将新字符串复制到该空间,接着使环境

表中针对name的指针指向新分配区。

2.如果要增加一个新的name,首先调用malloc为name=value字符串分配空间,然后将该字符串复制到此空间中。

a.如果这是第一次增加一个新name,则必须调用malloc为新的指针表分配空间。接着将原来的环境表复制到新分配区,

并将指向新name=value字符串的指针存放在该指针表的结尾,然后又将一个空指针存放在其后。最后是environ指向新

指针表。

b.如果这不是第一次增加一个新name,则可知以前已调用malloc在堆中为环境标准分配了空间,所以只要调用realloc,

以分配比原空间多存放一个指针的空间。然后将指向新name=value字符串的指针存放在该表表尾,后面跟着一个空指针。

《UNIX环境高级编程》笔记--环境变量的更多相关文章

  1. UNIX环境高级编程笔记之文件I/O

    一.总结 在写之前,先唠几句,<UNIX环境高级编程>,简称APUE,这本书简直是本神书,像我这种小白,基本上每看完一章都是“哇”这种很吃惊的表情.其实大概三年前,那会大三,我就买了这本书 ...

  2. UNIX环境高级编程笔记 目录

    每一章的重点会使用加粗字体 第一章:UNIX基础知识:UNIX体系结构:文件和目录:输入和输出:程序和进程:出错处理:信号:时间值:系统调用和库函数 第三章:文件I/O:文件描述符:文件操作函数:文件 ...

  3. UNIX环境高级编程笔记之高级I/O

    本章说明了很多高级I/O功能: 非阻塞I/O——发一个I/O操作,不使其阻塞,记录锁,STREAMS机制 I/O多路转接——select和poll函数 readv和writev函数,以及存储映射I/O ...

  4. UNIX环境高级编程笔记之线程

    本章涉及到线程的一些基本知识点,讨论了现有的创建线程和销毁线程的POSIX.1原语,此外,重点介绍了线程同步问题,讨论了三种基本的同步机制:互斥量.读写锁.条件变量.

  5. UNIX环境高级编程笔记之进程控制

    本章重点介绍了进程控制的几个函数:fork.exec族._exit.wait和waitpid等,主要需要掌握的是父进程和子进程之间的运行机制,怎么处理进程的正常和异常终止.以及怎么让进程执行不同的程序 ...

  6. UNIX环境高级编程笔记之进程环境

    本章讲的都是一些非常基础的知识,目的是为了下一章讲进程控制做铺垫,所以,本章就不做过多的总结了,直接看图吧.

  7. UNIX环境高级编程笔记之标准I/O库

    一.总结 文件I/O一章讲了不带缓冲的I/O,本章讲的是带缓冲的I/O.不带缓冲针对的是内核的系统调用,而带缓冲针对的是用户空间的标准库函数,是基于带缓冲的I/O实现的.不带缓冲的I/O通过文件描述符 ...

  8. 《Unix环境高级编程》环境搭建

    用的是第三版的安装包:src.3e.tar.gz 地址:http://www.apuebook.com/ 1.解压:$ tar  -zxvf  *.tar.gz 2. $ cd apue.3e/ 3. ...

  9. UNIX环境高级编程——进程环境

    一.main函数 C程序总是从main函数开始.当内核执行C程序时,在调用main前先调用一个特殊的启动例程.可执行程序文件将此启动例程指定为程序的起始地址--这是由连接编译器设置的,而连接编译器则由 ...

  10. 《unix环境高级编程》学习笔记【原创】

    本文基于unix环境高级编程的学习的笔记,写的比较简如有不对,欢迎指点. 简单的描述下面函数的功能改变ctr+c信号原本的作用终止程序,在按下中断键的时候输出一句话. while循环主要读取用户的输入 ...

随机推荐

  1. Ubuntu 18.04 安装 virtualbox

    1.安装包下载地址 [https://www.virtualbox.org/wiki/Linux_Downloads] 2.进入软件包的文件夹 sudo dpkg -i 安装包的名字.deb [注]如 ...

  2. HDU3439 Sequence

    今天下午学习了二项式反演,做了一道错排的题,开始了苦逼的经历. 显然答案是C(︀n,k)︀*H(n − k).其中H(i)为长度为i的错排序列 然后经过课件上一番二项式反演的推导 我就写了个扩展卢卡斯 ...

  3. Educational Codeforces Round 14 A. Fashion in Berland 水题

    A. Fashion in Berland 题目连接: http://www.codeforces.com/contest/691/problem/A Description According to ...

  4. Fiddler_解决Fiddler查看Post参数中文乱码的问题

    解决Fiddler查看Post参数中文乱码的问题 今天一个同事问我,为什么用Fiddler查看Post的中文参数,是一堆乱码,如下: 需要在注册表中增加一个键值: HKEY_CURRENT_USER\ ...

  5. 您该选择PRINCE2 还是 PMP认证

    您该选择PRINCE2 还是 PMP认证? 很多人都问我,这是一个非常常见的问题,作为一个项目经理,他们是否应选择PRINCE2或PMP认证,因为这两个认证都是全世界非常流行的. PRINCE2 是一 ...

  6. AVR Programming Methods

    AVR Programming Methods  There are many ways to program AVR microcontrollers. Since many people ask ...

  7. Hbase总结(五)-hbase常识及habse适合什么场景

    当我们对于数据结构字段不够确定或杂乱无章非常难按一个概念去进行抽取的数据适合用使用什么数据库?答案是什么,假设我们使用的传统数据库,肯定留有多余的字段.10个不行,20个,可是这个严重影响了质量. 而 ...

  8. 依赖注入(DI)和控制反转(IOC)的理解,写的太好了。

    学习过spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...

  9. OPTIMIZE TABLE ipc_analysisdatasyn, ipc_analysisdatatkv,ipc_autoupdateset, ipc_equipmentwaring,ipc_fguid, ipc_receivedata, ipc_senddata, tb_qualitativeanalysis, tb_quantifyresult, tb_quantifyresulthis

    OPTIMIZE TABLE ipc_analysisdatasyn, ipc_analysisdatatkv,ipc_autoupdateset, ipc_equipmentwaring,ipc_f ...

  10. 给第三方dll强签名

    假若我们要对第三方控件或者是其他的没有源代码的DLL文件想做类似的处理,增加强名称签名,怎么处理,是很多人都会面对的问题.     步骤: 1.首先采用反汇编工具ildasm生成中间语言. ildas ...