zoukankan      html  css  js  c++  java
  • 《UNIX环境高级编程》笔记--环境变量

    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字符串的指针存放在该表表尾,后面跟着一个空指针。

  • 相关阅读:
    Python 中的 None 与真假
    AVR第5课:蜂鸣器
    Solr使用入门指南
    EJB究竟是什么,真的那么神奇吗??
    Android 各个版本号WebView
    android SQLite 使用实例
    BackTrack5 (BT5)无线password破解教程之WPA/WPA2-PSK型无线password破解
    腾讯QQ企业邮箱POP3/SMTP设置
    【LeetCode】Substring with Concatenation of All Words
    PreferenceFragment 使用 小结
  • 原文地址:https://www.cnblogs.com/pangblog/p/3402656.html
Copyright © 2011-2022 走看看