? ? ? ? 这是一个常见的main函数,那么main函数可以带参吗?
int main()
{
return 0;
}
? ? ? ? ?答案是可以的!
? ? ? ? 我们先看这样一段代码,首先给main函数带上两个参数。
? ? ? ? 然后我们来看输出的结果。
????????这样一组字符串是命令行解释器(bash)给我们输出的。
? ? ? ? 后面是一串字符串,也就是命令行参数。
? ? ? ? bash 帮我们维护一个数组数组里面存储着我们输入的命令行参数的地址,bash读取命令行参数以空格为间隔,将这串字符传给main函数,也就造成了上面我们看见的情况。
? ? ? ? 同时这段代码可以这样修改。
? ? ? ? 同时也验证了argv[] 数组最后存储的是null,因为argv[i] == null 判断为假,循环结束。
? ? ? ? 那么命令行参数有什么用呢?答命令行参数是Linux指令选项的基础。使得一个函数可以执行许多不同的功能。下面我们用命令行参数的形式来模拟一下±计算器。
? ? ? ? 其实在Linux下,我们经常用一些命令行是带参数的 如 ls -l? ls -al 。
? ? ? ? 比如在使用gcc命令时,gcc -o -E -S -c -g -static 这是都是相同的命令但使用其中不同的功能。
????????环境变量(environment variables)一般是指在操作系统开辟的一块内存,用来指定操作系统运行环境的一些参数。
????????如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
????????环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。
? ? ? ?在Linux系统下,我们不难发现执行自己的可执行程序 需要 ‘./ ’ ,而执行ls 诸如此类的命令(也是可执行程序),却不需要 ‘./’ 这是为什么呢?这是因为系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找。我们没有告诉他在当前路径下寻找,而且path中有没有就会报“-bash: myprocess: command not found”
? ? ? ? 那么如何查看PATH呢? $PATH
? ? ? ? 那么怎么样才能使自己自己的程序不需要加 ‘./ ’ 也能执行呢?将自己的可执行程序放到上面的路径下(每一个路径都已 ‘ : ’ 为分隔符),或者将自己可执行程序的路径放到PATH中。
? ? ? ? 1.将自己的可执行程序放到上面的路径下? ?
? ? ? ? 但是,将自己的可执行程序当到操作系统的目录下会污染系统内置的环境变量。所以不建议这么做。
2.或者将自己可执行程序的路径放到PATH中
? ? ? ? 如果不小心改掉环境变量,那么关闭xshell 从新登录一下就行。
? ? ? ? 还有一些环境变量时存储当前,路径,用户名,家目录的如:
? ? ? ? 如何查看全局的环境变量呢? env?
? ? ? ? ?如何自己设置一个环境变量呢? export
? ? ? ? 删除一个环境变量:unset?
?????????环境变量是由bash创建的那么是否可以传给main函数呢?答案是可以的,bash在创建子进程时,同时创建了两张表,一张命令行参数表,一场环境变量表,都传递给了其创建的子进程。
? ? ? ? 代码:
????????执行内容:
????????可以得出main函数确实可以继承bash 的环境变量。
????????那么父进程可以继承子进程的环境变量吗?答案是可以的。
? ? ? ? 首先我们在全局自定义一个环境变量,看看子进程内是否有。
? ? ? ? 修改代码。
????????说明环境变量确实有全局性,并且子进程可以继承父进程的属性。
? ? ? ? 如果要获得某给特定的环境变量呢?就要使用 getenv。
????????代码:??
????????
? ? ? ? 本地变量不是环境变量,没有全局属性,同时也不会被子进程继承。
????????本地变量可以直接在命令行上定义,不需要像环境变量上加export。
? ? ? ? 同时使用set 查看本地所有的变量,包括环境变量。
? ? ? ? unset取消本地变量和环境变量。
????????来写一段代码验证一下,环境变量可以被继承,而本地变量却不可以。
? ? ? ? ?执行结果说明环境变量可以被继承,本地变量却不行,只能在本地(bash进程)使用。