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. MOXA的Nport5600初始密码

    今天第一次弄Nport,看了半天手册没找到初始密码,网上也搜不到,按照说明书上想打电话问问,发现根本是空号... 后来灵感一来试了一下,居然是:moxa

  2. JFreeChart 之饼图

    JFreeChart 之饼图 一.JFreeChart 简介 JFreeChart是JAVA平台上的一个开放的图表绘制类库.它完全使用JAVA语言编写,是为applications, applets, ...

  3. Codeforces Round #375 (Div. 2) E. One-Way Reform 欧拉路径

    E. One-Way Reform 题目连接: http://codeforces.com/contest/723/problem/E Description There are n cities a ...

  4. 2013-2014 ACM-ICPC, NEERC, Southern Subregional Contest Problem D. Grumpy Cat 交互题

    Problem D. Grumpy Cat 题目连接: http://www.codeforces.com/gym/100253 Description This problem is a littl ...

  5. JavaScript学习笔记[0]

    JavaScript学习笔记[0] 使用的是廖雪峰JavaScript教程. 数据类型 Number 表示数字,不区分浮点整形. === 比较时不转化数据类型. == 反之. NaN与任何值都不想等, ...

  6. OS X - 在80端口启动Nginx

    不知道你是怎么在你的mac上安装nginx的,但是如果你跟我一样: brew install nginx 然后你会发现你的nginx.conf中的端口是8080. 于是你可能像我一样试着把端口改为80 ...

  7. CentOS 7下的KVM网卡配置为千兆网卡

    在KVM下可以生成两种型号的网卡,RTL8139和E1000,其实应该是底层生成不同芯片的网卡,而不是附带宿主机网卡是什么型号就是什么型号的,其中默认为100兆网卡,即RTL8319的螃蟹卡,另一种是 ...

  8. Mac 10.12使用free命令(fish)

    前提:要使用free命令,可以安装fish shell,然后在里面安装free插件. 安装fish brew install fish 安装free fish fisher free 使用 fish ...

  9. 导出文件在IE和火狐中文件名乱码问题的解决

    $ua = $_SERVER["HTTP_USER_AGENT"]; $filename = "客户数据.xls"; $encoded_filename = u ...

  10. delphi teechrt中TChart 一些属性设置

    把图片设置成黑白 2.设置颜色