由浅入深的了解进程(5)--环境变量

avatar
作者
猴君
阅读量:0

环境变量

前言

在上一篇文章中简单的介绍了环境变量,但是没有讲述的比较全面了,所以现在再写一篇来介绍环境变量。

环境变量

在上一篇文章中,我们已经简单的学习了如何进行对于环境变量的修改并且能够知道环境变量在家目录的文件中修改才能够保证每一次的登录都是保存了我们自己添加的路径的。

1、更多的环境变量及添加和删除

env:查看所有的环境变量 echo $HOME:家目录的环境变量 echo $PWD:当前目录的环境变量 echo $SHELL:命令行解释器 echo $HISTSIZE:表示的是操作系统会记住用户最新的多少条指令 

那我们能不能直接自己定义一个环境变量呢?

export THIS_IS_MY_PATH=(自己的地址) 

在这里插入图片描述
此时的添加也是内存级别的,所以说重新登陆的话,就不能看到我们这次的操作了。
那导入有了,怎么删除?

unset THIS_IS_MYPATH:删除环境变量 

如果不用export的话,直接设置的话,这就不算是环境变量,只能说是一个本地的变量。
在这里插入图片描述

2、整体理解环境变量系统

在这里插入图片描述


这就展示了,我们能够通过C/C++的代码的方式获得环境变量。所以根据上一章写过的在运行程序之前会有bash的命令执行的话,说明环境变量默认也是可以被子进程拿到的。环境变量默认存在的就是在bash内部(不过我们还没说能够被子进程修改从父进程那得到的数据)。
那环境变量的话在bash中是怎么管理的?
把环境变量存在指针数组之中!所以我们刚刚的程序能够得到所有的环境变量。此时的这个指针数组的最后一个位置也必须要是NULL。
所以现在bash进程启动的时候,默认会生成两个表,argv[]命令行参数表,env[]环境变量表,bash通过各种方式交予进程。
命令行参数表是用户在执行可执行文件输入命令行得到的,环境变量表是从OS的配置文件中得到的。
相信上面其中的environ二级指针的含义应该也是能够理解的了,因为environ中的每一个元素都得是一个字符串,但是C语言中没有string的含义,所以每个字符串,只能够用char*的指针来表示,那数组值中存储的每一个元素都是指针,那指向这个数组的指针的话,那也必须要用到二级指针了啊。要么就直接是指针数组直接表示这个环境变量表。
那我们除了这种方式能够实现环境变量的传入,那我们还能够怎么实现呢?其实第二种实现的的方式就是通过main函数传参,原理其实也相似于命令行参数的原理。
在这里插入图片描述在这里插入图片描述
环境变量本身具有系统级别的全局属性,因为环境变量本身能够被子进程继承下去。

getenv:单个获取环境变量的内容 //获取成功的话为非0,获取失败的话等于NULL 

在这里插入图片描述
在这里插入图片描述
总结: 获得环境变量的三种方式。
1、extern char **environ
2、通过main函数参数
3、getenv(“path”)

可是我们上面使用的extern添加path的时候难道不也是bash下创建的一个子进程吗?那子进程的数据这么能够给到bash父进程呢?
因为export,echo的一些命令,这些命令叫做内建命令(80%的命令都是bash创建子进程进行的,但是剩下的一些就是由bash亲自进行的)。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!