Linux系统编程:环境变量
目录
一.环境变量
1.1PATH引入
1.2HOME和SHELL
二.查看所有环境变量的方法
2.1命令行
2.2系统调用接口
2.2.1第三方变量
三.如何通过环境变量理解权限
四.命令行参数
4.1main函数的指令参数
4.2main函数的环境变量参数
4.3如何理解环境变量的全局性
4.4本地变量和环境变量的区别
4.5常规命令和内建命令
总结
一.环境变量
1.1PATH引入
问题1:我们平时使用的指令也是可执行程序,但为什么可以直接运行,而我们自己编译过的就需要加上./呢?
可执行程序就是一个进程,其实也是一个文件,查找文件都是必须需要路径的,我们输入的指令程序的路径是被存储到了OS可以默认查找的路径下面所以可以直接运行,但是我们自己编译的却是在当前目录下,并不是在OS默认查找路径下,所以需要使用相对路径查找,./code.c就是使用的相对路径,告诉OS我的可执行程序是在当前目录下,不用乱找了!
问题2:OS默认查找的路径在哪里储存呢?
-->PATH环境变量中;
OS默认搜索的路径储存在PATH环境变量中,我们可以使用"echo $PATH"查看PATH变量,其中:为分隔符;
我们平时使用的指令就是在usr/bin目录下;
我们自己的程序直接执行,会出现"commend no find",是因为-bash命令行在默认PATH路径下查找过了,没有找到;
问题3:如果我向将自己的程序也想指令一样使用,该如何做呢?
办法就是把我们自己的可执行程序放在默认查找路径中,有两种方法:
1.把可执行程序放在已存在的PATH路径下;
2.把可执行程序所在的目录添加到PATH中
问题4:如何添加PATH呢?
1.PATH=.....:这种方法是直接对PATH变量赋值,会覆盖掉原来的路径,但是即使我们一不小心使用了,问题也不大,像我们的指令都是内存级文件,每次启动shell都会自动加载的!
2.PATH=$PATH:...:这种方法就是追加目录,也就是新增路径;
1.2HOME和SHELL
HOME环境变量:通常用于指定用户的主目录,也就是我们登录shell打开时默认所处的目录;我的默认用户目录就是ubuntu;
SHELL变量:存储命令行解释器的所在路径,也就是-bash的路径
二.查看所有环境变量的方法
2.1命令行
指令:env
2.2系统调用接口
系统接口getenv()
通过getenv获取指定环境变量;
2.2.1第三方变量
第三方环境变量:extern char** environ (二级指针)
三.如何通过环境变量理解权限
我们知道权限的对象是使用者也就是usr;那么我们可以通过环境变量获取USER,来判断对应的权限;
四.命令行参数
4.1main函数的指令参数
我们的main函数是可以带参数的,因为它也是一个函数;
我们平时所使用的指令也是如此,诸如很多的选项就是这样执行的;
4.2main函数的环境变量参数
main除了argc和argv外还有环境变量参数-->env
结论->两张向量表:
1.命令行参数表
2.环境变量参数表
4.3如何理解环境变量的全局性
我们知道了main函数的参数中是隐含了一张环境变量表的;我们的bash进程中也必然有环境变量表;
而我们所使用的进程都是继承与bash,所以环境变量表也会被继承下去,每一个进程中都可以使用,所以就相当于是全局了;
根据前面的知识。如果是先创建了进程,然后再修改了环境变量,那么新创建的子进程必然会被继承下去(共享数据),但如果创建了子进程然后修改了环境变量并不会影响父进程的环境变量,因为会发生写时拷贝
4.4本地变量和环境变量的区别
问题1:什么是本地变量?
本地变量就是我们通常定义的普通局部变量,处于栈上的变量;
问题2:和环境变量有什么区别?
本地变量存储在栈上,而环境变量存储在数据段,也就是全局变量区;
set ——>查看所有的环境变量的本地变量
export ……——>将本地变量变成环境变量
unset……——>清除环境变量
4.5常规命令和内建命令
之前我们提到过,如果我们不小心将环境变量覆盖了,那么就会导致大部分的指令用不了,但是并不是所有的指令都用不了!! 比如echo、pwd、cd…… 因为他们是内建命令
常规命令:通过子进程创建
内建命令:不是由bash 创建子进程完成,而是由bash亲自执行
总结
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,通常具有全局属性,并且一般来讲都有其特殊的用途(比如我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但 是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。)
环境变量表本质是一个二级指针;