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. Android-Service和Thread

    Android-Service和Thread 学习自 郭霖的博客 服务是运行在主线程上的 可能在我们第一次接触到Service的时候都是对于 __服务是运行在主线程上的 __这一现象不太理解,但是事实 ...

  2. 用python做一个图片验证码

    看一下做出来的验证码长啥样 验证码分析 1. 有很多点 2. 有很多线条 3. 有字母,有数字 需要用到的模块: 1. random 2. Pillow  (python3中使用pillow) 安装p ...

  3. android touch事件分发流程

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 三个方法:分发触摸事件dispatchTouchEvent.在触摸事件的时候onTouc ...

  4. [Go] 通过 17 个简短代码片段,切底弄懂 channel 基础

    关于管道 Channel Channel 用来同步并发执行的函数并提供它们某种传值交流的机制. Channel 的一些特性:通过 channel 传递的元素类型.容器(或缓冲区)和 传递的方向由“&l ...

  5. TCP握手与socket通信细节

    http://www.jianshu.com/u/5qrPPM http://www.jianshu.com/p/f86512230707

  6. .NET轻量级ORM组件Dapper葵花宝典

    一.摘要 为什么取名叫<葵花宝典>? 从行走江湖的世界角度来讲您可以理解为一本"武功秘籍",站在我们IT编程的世界角度应该叫"开发宝典". 如果您在 ...

  7. delphi中单独编译pas生成dcu文件

    delphi中单独编译pas生成dcu文件 在网上下载了一个带源码的组件,结果碰到提示说缺少xxx.dcu.一看它的目录下确实没有,那能不能生成一个呢? 当然可以! 方法是使用delphi的安装目录\ ...

  8. lufylegend:图形变形2

    下面来详细讲解一下drawtriangles函数的使用方法.并且使用drawtriangles函数实现下面这种处理效果 因为这个方法是从AS3移植而来,所以它的使用方法和AS3基本一致,这里是AS3的 ...

  9. Android 数据存储02之文件读写

    Android文件读写 版本 修改内容 日期 修改人 V1.0 原始版本 2013/2/25 skywang Android文件读写的有两种方式.一种,是通过标准的JavaIO库去读写.另一种,是通过 ...

  10. 如何快速分析一款ios软件或需求的大流程,然后在业务层实现,不牵扯到界面?

    如何快速分析一款ios软件或需求的大流程,然后在业务层实现,不牵扯到界面?