main函数的参数问题
我们在写程序的时候,一般main
函数中是没有参数的,但是实际上是有三个参数的,下面我们来说明前两个参数。
即main(int argc,char *argv[])
,第一个参数代表我们输入的命令行参数的个数,第二个指针数组指向了把命令行参数进行分隔后的每一个“字符串”,下面我们用代码来说明。
把我们命令行的每一个字符串打印出来
可以看到命令行上的./mytest -1 -2 -3 -4
被分隔成了四个字符串,为什么会这样输入呢,其实不难发现比如Linux中我们常用的ls
命令他也有-a .-l
等不同的选项,我们可以通过不同的选项来调用同一个可执行程序的不同功能。
下面我们用代码来举例子
规定输入两个参数,第二个参数的不同决定执行不同的代码
所以argv本质上就是在命令行上输入指针数组,我们在bash上输入的字符串会被拆分为一个一个的字串放到一个数组中来进行维护。
环境变量
PATH USER PWD HOME…
所谓环境变量不止一个,在系统中是一堆!它们之间并没有什么联系,是系统中内置的有特殊用途的变量。
变量的本质其实就是开辟空间,往他里面放置数据,环境变量也是如此,是操作系统自己开辟的一块空间给予了这块空间名字和内容
。
我们在Linux中敲出这些常见的ls,pwd
等指令和运行我们自己的可执行程序的时候,难道不会疑惑吗?为什么系统的指令可以直接运行,而我们自己的需要加上./
,这是因为系统有一个环境变量PATH
,它里面存储了一长串的路径,我们平常输入的指令,系统就会在PATH
路径下依次查找
可以用:echo $PATH
指令来查看
这些路径使用:
分隔开的,当我们输入指令时,如果系统在PATH路径下没有查看到的话就会报错,这也就是我们为什么不能直接输入自己的可执行程序运行的原因!
当然我们也可以把自己的可执行程序加入到PATH当中
PATH=你的路径
就可修改
可以看到这时候我们直接输入可执行程序的名字就可以执行了。
但现在的问题是你把路径改了之后,我们系统的这些命令运行不了了啊!😅😅兄弟莫慌!我们只需要重新启动Xshell即可,原因我们后面再说。
接下来我们还可以看看其它的环境变量
USER
:记录当前的用户
PWD
:记录当前路径
HOME
:记录家目录
这些变量都是全局变量,是在进入main函数之前就被初始化了的,所以登录的时候才会默认我们的用户,家目录等等。
那我们如何创建环境变量呢?
export
xxx=xxxxx
并且我们自己定义的在重启Xshell后依然会失效,原因同样后面说。
下面还有一个指令:env
查看所有的环境变量
可以看到我们自己定义的环境变量和几个系统常见的。
那不管是echo
还是env
我们都是在命令行上面操作的,有没有办法在我们的可执行程序中打印出我们的环境变量呢?
答案是当然可以!😏
库里面有一个函数getenv
来得到我们想得到的环境变量
这是单个取出我们想要的环境变量的值
其实这些环境变量也被维护在一个指针数组中叫作char*env[]
,这就是main函数中的第三个参数,下面我们来通过这个参数打印环境变量。
可以看到我们把所有的环境变量都打印出来了
另外我们还可以通过第三方变量environ
来获取环境变量数组,libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时 要用extern声明。
打印出来的环境变量是一样的,所以我们可以得出:bash会维护一张环境变量表,存储着不同的环境变量,main参数env
,以及外部的变量envrion
,和命令行的env,
它们的环境变量表都是bash所维护的同一章表😎
大家也可以把它们的地址打印出来比较看是不是相同的
环境变量的继承
环境变量是可以继承的,何出此言?通过代码来说明
可以看到子进程继承了父进程的那张环境变量表,而我们在命令行调用的进程,都是bash的子进程,因此我们的在命令行调用的所有进程,不管是子进程,孙子进程…全部可以继承到bash的环境变量表!😵
所以我们知道了程序在运行时会维护两张表,一张表是参数命令表,一张是环境变量表,这两张表格是在程序启动时由操作系统设置和传递给程序的。
所以之前的问题,环境变量表是存在哪里的呢?为什么我们添加了自己的环境变量或者是修改了系统的环境变量重新启动Xshell后会恢复原样呢?
环境变量表的存储
其实环境变量是存储在磁盘中的,我们每次启动,会把环境变量从磁盘拷贝到内存中,然后组成了一张表,所以我们对它修改添加只是在内存中修改而已,并没有修改磁盘中锁存放的环境变量。
这个磁盘我们也可以查看
是在家目录中的一个隐藏文件
我们打开它可以看到
其余的环境变量是放在.bashrc
中的
修改磁盘中的环境变量
当然如果我们在这个文件中修改的话,那就是修改的磁盘中的环境变量了
重启后可以看到我们自己定义的环境变量生效了。
OK到这里环境变量的问题以及main函数中的参数问题也就讲明白了,如有错误,还请指正,谢谢大家!