十三、子shell与进程处理
1 子shell
-
概念
在linux中,fork函数能够创建子进程
1.2 冒号的特殊用法
-
表示永真,相当于TRUE关键字
while : #表示永真 do ... done
-
冒号可以清空一个文件
:>filename
-
不做任何事,只做参数展开
1.3 圆括号结构
-
定义
圆括号结构能够强制将其中的命令运行在子shell中
-
语法
( command 1 command 2 ... command 3 )
-
说明
- 子shell允许嵌套调用,在函数或圆括号结构内再次调用圆括号结构创建子shell
1.4 子shell继承父shell的属性
-
说明
子shell只能继承父shell的一些属性,不能反过来改变父shell的属性
-
子shell能从父shell继承的属性
- 当前工作目录
- 环境变量
- 标准输入、标准输出和标准错误输出
- 所有已打开的文件标识符
- 忽略的信号
-
子shell不能从父shell继承的属性
- 除了环境变量和.bashrc文件中定义变量之外的shell变量
- 未被忽略的信号处理
2 进程处理
fork时linux系统的一种系统调用,系统调用用于请求内核服务,是进程访问硬件的唯一办法。
2.1 进程和作业
-
进程
-
定义
进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,用进程号标识,属于操作系统层面的概念
-
进程的状态
- 就绪状态(Ready):当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行
- 运行状态(Running):当进程已获得处理机,其程序正在处理机上执行
- 阻塞状态(Blocked):正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态
-
-
作业
-
定义
一个正在执行的进程或多个进程,称为作业,用作业号标识,属于用户层面的概念
-
2.2 作业控制
-
作业的前台和后台
内建命令fg可将后台运行的作业放到前台,而&符号使得作业在后台运行。
-
fg指定作业方法及其意义
参数 意义 %n n为后台作业的作业号 %string 命令以string字符串开始的后台作业 %?string 命令包含string字符串的后台作业 %+或%% 最近提交的后台作业 %- 最近第二个提交的后台作业 fg命令不带任何参数,表示将最近提交的那个后台作业放置到前台
-
jobs命令
jobs命令用于显示所有的后台作业
jobs命令后加上-l参数,则附带显示作业的进程号
-
Ctrl+Z组合键,可将正在运行的作业阻塞
在“Ctrl+Z”组合键之后输入bg命令可使阻塞状态的作业转入后台运行
-
disown命令
disown命令用于从shell的作业表中删除作业
-
wait命令
wait命令用于等待后台作业完成
-
说明
fg、bg和jobs命令只能以作业号为参数来指定作业,这三个命令是不能使用进程号的
3 信号
-
定义
信号是在软件层次上对中断机制的一种模拟,是进程间通信机制中唯一的异步通信机制
-
信号时间来源
- 硬件来源:按下键盘或其他硬件故障
- 软件来源:发送信号的系统函数如kill、raise、alarm、setitime和sigqueue函数,以及一些非法运算等操作
-
Ctrl组合键、信号类型及其意义
组合键 信号类型 意义 ctrl+c INT信号,即interrupt信号 停止当前运行的作业 ctrl+z TSTP信号,即terminal stop信号 使当前运行的作业暂时停止(转入阻塞态) ctrl+\ QUIT信号 Ctrl+c的强化版本,当ctrl+C无法停止作业时,使用此组合键 ctrl+y TSTP信号,即terminal stop信号 当进程从终端读取输入数据时,暂时停止该进程 -
kill命令
-
kill $$ 杀掉自己本身的进程,$$记录了运行该脚本的进程号
-
kill -l 命令可以列出kill命令所能发出的所有信号及其标号
-
kill -9 %1 :kill命令向1号作业发送9号信号杀死进程,9号信号实际上就是KILL信号,即 kill -KILL %1
-
-
trap命令
-
定义
trap命令是linux的内建命令,用于捕捉信号,可以指定收到某种信号时所执行的命令
-
语法
trap command sig1 sig2 ... sigN
表示当收到sig1、sig2...、sigN中任意一个信号时,执行command命令,command命令完成后,脚本继续收到信号前的操作,直到脚本执行结束
- command用空字符串(""或'')代替,表示什么都不做
-