linux编程:环境表
每个进程在启动的时候都会收到一张环境表。环境表是由一个字符指针数组组成,每个指针包含一个以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编程:环境表的更多相关文章
- Linux编程环境介绍(2) -- shell(Bash) 介绍
1. 在计算机科学中,Shell俗称壳(用来区别于核),是指“提供使用者使用界面”的软件(命令解析器).它类似于DOS下的command和后来的cmd.exe. 2. bash (Bourne Aga ...
- Linux编程环境介绍(1) -- linux的历史
1. linux是什么? "Hello everybody out there using minix——I'm doing a (free) operating system" ...
- Linux编程环境介绍(3) -- linux下的c/c++程序开发
目录: 1. 编辑器( Vi ) [vi 与 vim] vi(visual interface)是linux系统最重要的文本编辑器, 所有的 Unix-Like 系统都会内置vi文本编辑器. vim ...
- 【Linux】 Linux编程规范&Linux 编程环境搭建
一.通过Samba映射网络驱动器 菜单栏-计算机-映射网络驱动器 English 菜单栏-Home -Easy access-Map as drive 编辑代码使用 Windows 编译 运行程序在 ...
- Linux编程环境
yum -y install gcc gcc-c++ libtool-ltdl libtool-ltdl-devel openssl openssl-devel curl curl-devel lib ...
- linux 编程环境搭建过程记录
1, 安装centos 7 最小版 过程略 ...... 2, 安装桌面安装yum groupinstall "GNOME Desktop" 更新系统运行级别ln -sf /li ...
- [坑]Linux MySQL环境表名默认区分大小写
不区分大小写设置 1.用ROOT登录,修改/etc/my.cnf 2.在[mysqld]下加入一行:lower_case_table_names=1 3.重新启动数据库即可 systemctl res ...
- linux网络环境下socket套接字编程(UDP文件传输)
今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...
- Linux下搭建C/C++编程环境
Linux下搭建C/C++编程环境 1.KDevelop下载 wget -O KDevelop.AppImage https://download.kde.org/stable/kdevelop/5. ...
随机推荐
- socketpair理解
转载:http://liulixiaoyao.blog.51cto.com/1361095/533469/ 今天跟人谈到socketpair的问题,晚上回来写了个程序验证下自己的猜测! 先说说我的理解 ...
- Good subsequence( RMQ+二分)
Description Give you a sequence of n numbers, and a number k you should find the max length of Good ...
- Java基础知识强化之IO流笔记73:NIO之 Channel
1. Java NIO的Channel(通道)类似 Stream(流),但又有些不同: 既可以从通道中读取数据,又可以写数据到通道.但流的读写通常是单向的. 通道可以异步地读写. 通道中的数据总是要先 ...
- 【阿里云产品公测】云引擎ACE -discuz安装
作者:阿里云用户云想未来 谢谢支持.为什么写的比较简单就是为方便新手谁想要很麻烦?亲测按这个教程可以安装成功!时间紧迫不发图片了纯原创 排版您请谅解 进入创建新应用的信息填写界面,此处需要填写一个赠送 ...
- 重构4-Push Down Method(方法下移)
我们介绍了将方法迁移到基类以供多个子类使用的上移方法重构,今天我们来看看相反的操作.重构前的代码如下: public abstract class Animal { public void Bark( ...
- Redis入门(优势,环境,字符串,哈希,列表)
Redis从它的许多竞争继承来的三个主要特点: Redis数据库完全在内存中,使用磁盘仅用于持久性. 相比许多键值数据存储,Redis拥有一套较为丰富的数据类型. Redis可以将数据复制到任意数量的 ...
- Oracle基础 exp/imp 数据泵导入/导出 命令
一.导出方式: 使用exp/imp方式导出数据分为四种方式: 1.表方式导出:一个或多个指定的表,包括表的定义.表数据.表的所有者授权.表索引.表约束,以及创建在该表上的触发器.也可以只导出结构,不导 ...
- jquery plugins —— datatables 搜索后汇总
网上的例子 http://datatables.club/example/plug-ins/api.html只能对当前页面或所有数据进行汇总,不能对搜索结果数据汇总. 以下是对datatables自带 ...
- [转]oracle 11g 忘记 默认用户密码
本文转自:http://blog.csdn.net/huangbiao86/article/details/6595052 首先启动sqlplus 输入用户名:sqlplus / as sysdba ...
- HDU 4441 Queue Sequence
http://acm.hdu.edu.cn/showproblem.php?pid=4441 题意:对于一个序列,每次有三种操作 insert pos 表示在pos插入一个数,这个数是最小的正数 ...