每个进程在启动的时候都会收到一张环境表。环境表是由一个字符指针数组组成,每个指针包含一个以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指向新的环境表。

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

linux编程:环境表的更多相关文章

  1. Linux编程环境介绍(2) -- shell(Bash) 介绍

    1. 在计算机科学中,Shell俗称壳(用来区别于核),是指“提供使用者使用界面”的软件(命令解析器).它类似于DOS下的command和后来的cmd.exe. 2. bash (Bourne Aga ...

  2. Linux编程环境介绍(1) -- linux的历史

    1. linux是什么? "Hello everybody out there using minix——I'm doing a (free) operating system"  ...

  3. Linux编程环境介绍(3) -- linux下的c/c++程序开发

    目录: 1. 编辑器( Vi ) [vi 与 vim] vi(visual interface)是linux系统最重要的文本编辑器, 所有的 Unix-Like 系统都会内置vi文本编辑器.  vim ...

  4. 【Linux】 Linux编程规范&Linux 编程环境搭建

    一.通过Samba映射网络驱动器 菜单栏-计算机-映射网络驱动器 English 菜单栏-Home -Easy access-Map as drive 编辑代码使用 Windows 编译 运行程序在 ...

  5. Linux编程环境

    yum -y install gcc gcc-c++ libtool-ltdl libtool-ltdl-devel openssl openssl-devel curl curl-devel lib ...

  6. linux 编程环境搭建过程记录

    1, 安装centos 7 最小版  过程略 ...... 2, 安装桌面安装yum groupinstall "GNOME Desktop" 更新系统运行级别ln -sf /li ...

  7. [坑]Linux MySQL环境表名默认区分大小写

    不区分大小写设置 1.用ROOT登录,修改/etc/my.cnf 2.在[mysqld]下加入一行:lower_case_table_names=1 3.重新启动数据库即可 systemctl res ...

  8. linux网络环境下socket套接字编程(UDP文件传输)

    今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...

  9. Linux下搭建C/C++编程环境

    Linux下搭建C/C++编程环境 1.KDevelop下载 wget -O KDevelop.AppImage https://download.kde.org/stable/kdevelop/5. ...

随机推荐

  1. CentOS7 安装Docker报错

    安装报错: Transaction check error:  file /usr/lib/systemd/system/blk-availability.service from install o ...

  2. 计算圆周率 Pi (π)值, 精确到小数点后 10000 位 只需要 30 多句代码

    大家都知道π=3.1415926……无穷多位, 历史上很多人都在计算这个数, 一直认为是一个非常复杂的问题.现在有了电脑, 这个问题就简单了.电脑可以利用级数计算出很多高精度的值, 有关级数的问题请参 ...

  3. 二进制序列化框架easypack发布啦!

    简介 easypack是基于boost.serialization的二进制序列化框架,使用极其方便. Examples 基本类型 int age = 20; std::string name = &q ...

  4. oc中的block使用心得

    typedef void (^ simpleBlock) (void); typedef double (^multiplyTwoValues)(double, double); typedef vo ...

  5. 结合源码看nginx-1.4.0之nginx多进程机制详解

    目录 0. 摘要 1. nginx多进程设计思想 2. nginx多进程设计数据结构 3. nginx进程间通信机制 4. 一个简单的多进程例子 5. 小结 6. 参考源码

  6. 获取客户端的IP地址

    /// <summary> /// 获取客户端的IP地址 /// </summary> /// <returns></returns> public s ...

  7. 《Cortex-M0权威指南》之体系结构---栈空间操作

    转载请注明来源:cuixiaolei的技术博客 栈空间作为一种存储器使用机制,是"先入先出"的结构,在系统空间中用作临时数据的存储.栈空间操作的关键之一为栈指针寄存器,每次执行栈操 ...

  8. oracle优化辅助SQL语句

    --查询正在执行的SQL语句 select a.program, b.spid, c.sql_text,c.SQL_FULLTEXT,c.SQL_ID from v$session a, v$proc ...

  9. hdu 4725 最短路

    思路:将每个layer拆成两个点,编号为N+x,和N+N+x.对所有属于layer   x的点i,建N+x到i的有向边,在建i到N+N+x的有向边.最后对所有x号layer和x+1建一条N+N+x到N ...

  10. 转: Android官方培训课程中文版(v0.9.5)

    转: https://segmentfault.com/a/1190000004279679 1. 胡凯 tx SNG的一个开发者. http://hukai.me/android-training- ...