每个进程在启动的时候都会收到一张环境表。环境表是由一个字符指针数组组成,每个指针包含一个以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. Java_基础_内存管理

    把没几多年,完全忘记了把自己学的东西记录下来了,现在也基本不知道怎么去记录会更好了,不过好歹妹是把住了~也要毕业了,继续回来写东东记录自己的学习...... 一个Java程序在运行时的内存分布主要如上 ...

  2. windows和linux中检查端口是否被占用

    一.windows 1.查询端口占用情况 cmd > netstat -ano 2.查询8080端口是否被占用 cmd > netstat -ano|findstr 8080 3.查询哪个 ...

  3. nodejs 安装 postgresql module

    # npm -gd install node-gyp # export PATH=$PATH:/usr/local/pgsql/bin # npm -gd install pg for test: # ...

  4. 构建项目AppFuse+QuickStart

    AppFuse是一个完整的框架来构建web应用程序.它最初是为了构建新的web应用程序少走弯路.多年来,它已成为一个非常成熟的可测试和创建基于java的web应用安全系统.在其核心,AppFuse是项 ...

  5. ios 代码截屏模糊问题解决办法

    我们常用的截图方法如下所示: //尺寸是按照 UIGraphicsBeginImageContext(CGSizeMake(, )); //currentView 当前的view 创建一个基于位图的图 ...

  6. VMware系统运维(九)VMware vSphere Client 安装

    1.点击下一步 2.接受协议,下一步 3.选择安装位置,下一步 4.开始安装 5.安装完成,进行登录测试. VMware vsphere 5.1 登录名为administrator    VMware ...

  7. 剑指Offer02 替换空格

    /************************************************************************* > File Name: 02_Replac ...

  8. ZOV压敏电阻

    http://www.zov.net.cn/download/spd_07D.htm http://item.taobao.com/item.htm?spm=a1z10.5.w4002-1369342 ...

  9. JavaWeb 学习的第一阶段总结

    本人从事Asp.net开发三年,结合市场情况,综合考虑后决心转向JavaWeb方向.于是开始了自学Java的历程. 首先,我用马士兵的Java基础教学视频,快速地学习了一遍Java基础.因为有C#基础 ...

  10. sql的基本用法-------修改字段默认值和属性

    修改表中已有的字段属性 ALTER TABLE 表名 ALTER COLUMN 字段名 varchar(500) --sqlserver建表表时设置字段的默认值 create table 表(id i ...