wordpress门户网站主题,风险报告查询系统,公司高端网站建,曲靖程序网站建设目录 前言#xff1a;
命令行参数#xff1a;
现象#xff1a;
这些参数的意义#xff1a;
为什么要这么做#xff1f;
这些事是谁做的呢#xff1f;
环境变量
现象#xff1a;
创建环境变量#xff1a;
结合程序理解#xff1a; 前言#xff1a; 我们在前…目录 前言
命令行参数
现象
这些参数的意义
为什么要这么做
这些事是谁做的呢
环境变量
现象
创建环境变量
结合程序理解 前言 我们在前一章就开始学习与进程相关的部分知识上一章是先学习到了进程优先级接下来就是补充一些额外知识。
命令行参数
现象 我们是否还记得我们在刚开始学习C语言的时候对于main函数的写法我是介绍过的我记得我说过main函数可以写成这样int main(int argc, char* argv[]) 。我们当然是可以选择这样写也可以直接选择int main()这样直接完事。下面我们来看下列的代码
输出结果 当然我们还可以再尝试一下 输入指令./test -a -b -c -d
这些参数的意义 我们在通过点斜杠运行可执行程序后通过添加-a或者-b这样的参数即可看到argc和argv的变化其实这些是和该进程匹配的选项这些选项以这些空格作为分隔符把他们放进一个指针数组里。 其实作为区分的本质是将空格转换成\0加以区分的
为什么要这么做 可以通过输入不一样的选项执行同一份代码的不同功能。以下通过代码举例子 命令行参数本质是交给我们程序不同的选项用来定制不同的程序功能。命令中会携带很多选项。
这些事是谁做的呢 主要还是由我们的父进程bash(命令行解释器)管理所以我们就可以得出以下结论父进程的数据默认能够被子进程看到并访问。命令行中启动的进程都会变成进程其实都是bash的子进程。 所以对我们之前通过点斜杠运行的可执行程序默认是输入给父进程bash的。 因为子进程能看到父进程的数据因此bash在识别几个-a -b -c后传递到argc并再malloc出argv[]这些都是子进程能看到的。现在我们也能理解为什么有些指令类似ls后面还会有一个-l或者-a这样的选项的意思了。
环境变量 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数如我们在编写C/C代码的时候在链接的时候从来不知道我们的所链接的动态静态库在哪里但是照样可以链接成功生成可执行程序原因就是有相关环境变量帮助编译器进行查找。 环境变量通常具有某些特殊用途还有在系统当中通常具有全局特性。相信大家如果配置过java或者嵌入式stm环境得物时候为这个环境变量抓狂过接下来我们就来了解下环境变量
现象 在Linxu中存在一些全局的设置表明告诉bash(命令行解释器)应该在哪些路径下去寻找可执行程序。 我们可以尝试输入指令echo $PATH 系统中有很多配置在我们登录Linux系统的时候就已经被加载到了bash进程中(在内存中的)默认查找到的环境变量是内存级的。 PATH其实环境变量的一种而我们$PATH无非就是将环境变量的内容存放地打印出来我们将结果打印出来的内容PATH/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/ws/.local/bin:/home/ws/bin 这一串就是表示了各个环境变量存放的位置比如/usr/local/bin这个文件夹里面的可执行程序在该文件夹中就代表了环境变量。其中 “:” 表示分隔符bash在执行命令的时候需要先找到命令因为未来要加载。 刚刚我们讲命令行参数时其实就有疑问了运行test可执行程序时是要加点斜杠的再加上-a -b之类的选项然后我说这可以说明ls为什么有-l -a选项对应不同的功能。此时我们就会发现ls这个指令就不用加点斜杠运行 这又是为什么呢 其实这个就是讲解环境变量最好的例子这是因为bash会先去各个地址找然后发现了ls在/usr/bin目录中 然后就会调用ls所以在执行ls时就不用加点斜杠。
创建环境变量 若是我想要自己的可执行程序和系统指令一样不带点斜杠该怎么办呢目前我们介绍三种方法。
1、可以尝试使用cp命令将自己的可执行程序拷贝到/usr/bin目录下。 首先我需要给我的test可执行程序改名字因为/usr/bin目录下有test这个环境变量。目前我们单独使用my_test是不起作用的which也没有结果。所以我们开始进行拷贝。 演示成功啊运行成功和上面演示的一样。
2、也可以直接PATH $PATH:自己当前的目录对于我的目录我就可以写成 当然这种方式慎用但是也没关系。因为我们每一次重启环境变量右会重新归为。这是因为最开始的环境变量并不是在内存中的而是在系统的对应配置文件中(默认在配置文件中)。 这个配置文件就在用户家目录下.bash_profile文件、.bashrc文件和/etc/bashrc文件。其中前两个是用户的配置文件最后一个是系统的配置文件。 所以如果我们想要永久更改环境变量的路径可以直接在.bash_profile里更改。
见见更多的环境变量 可以输入env 查看全部的环境变量。 这些环境变量都是极其准备好的。 export 环境变量名 “环境变量内容” —— 添加 unset 环境变量 —— 取消 结合程序理解 环境变量默认是可以被子进程拿到的因为环境变量们默认实是在bash里的。 而这些环境变量均是全局的 环境变量有那么多bash内部是如何组织的呢 其本质是有一串代码组织的extern char** environ;
接下来通过代码演示一下 不难发现通过代码发现和我们直接输入env这个指令没有区别的。 bash再进程启动的时候默认会给我子进程形成两张表 argv[ ]命令行参数表从用户输入命令行获取env[ ]环境变量表从OS的配置文件获取bash通过各种方式交给子进程。 所以我们对于命令export XXX XXX就是去env[ ]表里寻找NULL的地方然后链入新的环境变量即可。 环境变量具有系统级的全局属性因为环境变量本身会被子进程继承下去 以下是获取环境变量的三种方法 char* path getenv(PATH) 通过main函数参数char* env[ ] extern char** environ 在执行export添加新环境变量时不会创建子进程吗 子进程自己的数据bash看不到但是export新的环境变量bash是可以看到的。当然执行export不会创建子进程echo也不会创建子进程。这是因为export和echo是属于内建命令这些命令是会有bash亲自执行。但是这只是一部分因为80%的命令都是由bash创建子进程子进程来执行的。 对于内建命令可以理解为bash内部的一个个void类型的函数执行完就执行完并没有返回值。
注意 如果你只是在输入指令HELLO 1234这样子输入你本质只是创建了一个本地变量而不是环境变量你可以使用echo $HELLO打印出来 但是你无法通过env|grep HELLO查找出来通过main函数或者extern char** environ这两种方法也查找不到 本地变量只在ash内部有效无法被子进程继承下去。只要导成环境变量此时才能够被获取。