目录
前言(进程的特性):
进程有四大特性:
竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行
并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发。 上下文 (计算机) - 维基百科,自由的百科全书 (wikipedia.org)
那么Linux系统是如何实现并发的呢?深入理解Linux内核进程上下文切换-腾讯云开发者社区-腾讯云 (tencent.com)
1.认识环境变量
1.1 PATH
在Linux终端,我们输入指令,程序会直接运行指令对应的程序,但当我们编写好一个可执行程序时,执行它为什么要加上“ ./ ”呢?
或者这样说,为什么我们执行自己编写的可执行文件时要指定路径,而执行指令时则不用呢?本质上都是可执行文件。
因为当我们在命令行中输入指令后,系统会自动在PATH环境变量中,去进行查找。
查看环境变量PATH:
(以冒号为各个绝对路径的分隔符)
如果我们想执行“./mycmd”,只要在命令行中输入指令mycmd回车,可以把该条指令所在的绝对路径添加到环境变量PATH中,
就算重命名mycmd,执行重命名后的可执行文件也不用添加路径。
如果我们一不小心将PATH中的所有路径都覆盖了,会怎么样呢? 大多数指令无法正常执行。我们现在重启Xshell,就会恢复原来的环境变量。因为我们修改的PATH是存在内存当中,修改内存中的PATH,并不会影响磁盘中PATH最初的配置。
1.2 HOME
指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
1.3 SHELL
当前Shell,它的值通常是/bin/bash。
1.4 HISSIZE
记录历史指令的个数,与指令history的相关。
1.5 SSH_TTY
左边和右边分别是两个终端, SSH_TY就代表终端设备文件(本质是个字符设备),我们向该文件输入字符串,字符串会自动显示到终端上。
1.6 PWD和OLPWD
2. 环境变量的概念及其相关指令
什么是环境变量
环境变量是系统提供的一组name=value形式的变量,不同的环境变量有不同的用户。
环境变量通常具有全局属性。环境变量_百度百科 (baidu.com)
echo(输出字符串到终端)
echo $NAME //NAME:需要查看环境变量的名称
env(查看环境变量)
查看所有环境变量。
set (查看所有环境变量和本地变量)
set命令的功能是用于显示与设置Shell变量信息,管理员亦可以用该命令设置Shell终端特性,更好符合日常工作需要。
原文链接:set命令 – 显示与设置Shell变量信息 – Linux命令大全(手册)
3.命令行参数
当我们在命令行输入参数(各种指令)时,本质上是在输入单个字符串或多个字符串。
我们输入参数后,shell要对参数进行解析,如何解析呢?
我们编写一个可执行文件为例:
我们给main()函数两个参数,agrc表示字符串(数组元素)的个数,argv相当于参数包,是一个指针数组,数组的每个元素都是字符串指针。
当我们指向该源文件编译后的可执行程序时,shell会以空格为间隔,依次识别单个字符串。
同样的,我们输入一个命令,指令就相当于可执行程序,指令后的参数就相当于main函数中第二个参数。
因为argv最后一个字符串为NULL,我们可以用for循环遍历所有参数。
通俗的说,命令行参数本质是为了支持用户选择不同的选项,以满足多功能需求。
注意:像char* argv[]这样的变量,我们称为向量表或环境表。
那么main函数只有一个向量表吗?并不是。
main函数中有两张核心向量表,一张是命令行参数表,另一张是环境变量参数表。我们已经验证了命令行参数表,现在我们来举例验证一下环境变量参数表。
我们编写好左边的源文件,并生成可执行程序,运行: 运行效果和env指令一样。这是为什么呢?
为什么这两个进程(env和./mycmd)的环境变量是一样的?
因为这两个进程都是同一个bash的子进程,子进程会继承父进程的环境变量。所有的子进程都会继承父进程的环境变量,这叫做环境变量的全局属性。
4.创建和取消环境变量
创建
同时,我们执行已经生成的可执行程序,
新建的环境变量MY_VALUE也被继承了。
取消 (unset)
5.获取环境变量(通过系统调用)
getenv
我们用manual查看系统调用接口,
我们来测试一下getenv函数。
main()函数中的环境变量表
通过第三方变量environ获取
int main() { extern char **environ; int i = 0; for(; environ[i]; i++) { printf("%d: %s\n", i, environ[i]); } return 0; }
6.本地变量
本地变量只在当前bash内有效,不会被子进程继承。
我们export 本地变量,本地变量会变为环境变量。
用unset可以取消, 我们之前认为命令行中的所有进程都是bash的子进程,但这种说法不准确。
我们先创建一个本地变量yls,然后用echo输出它,这两行指令创建了两个进程吗?并没有,echo是内建命令。cd命令可以通过系统调用接口chdir实现的。
内建命令是指bash内部实现的命令。bash在执行这些命令的时候不同于一般外部命令的fork、exec、wait的处理过程,这内建功能本身不需要打开一个子进程执行,而是bash本身就可以进行处理。分析外部命令的执行过程我们可以理解内建命令的重要性,外建命令都会打开一个子进程执行,所以有些功能没办法通过外建命令实现。比如当我们想改变当前bash进程的某些环境的时候,如:切换当前进程工作目录,如果打开一个子进程,切换之后将会改变子进程的工作目录,与当前bash没关系。所以内建命令基本都是从必须放在bash内部实现的命令。来源:SHELL编程之内建命令 | Zorro’s Linux Book (zorrozou.github.io)