进程间关系(进程组、作业、会话、作业控制有关信号、终端)

我们之前认为在终端下./test就相当于创建了一个进程,那么对应的就创建了一个PCB,这个PCB指向一块虚拟地址空间,而虚拟地址空间上的地址通过页表映射到物理地址空间。这样的认为在现在看来是不准确的,其实每个进程除了有一个进程ID外,还属于一个进程组。通常情况,进程组与同一作业相关联,可以接收来自同一终端的各种信号。

一、进程组

1.每个进程都属于唯一的一个进程组。
2.每个进程组都有一个组长进程,组长进程的ID等于进程ID。
3.组长进程可以创建一个进程组,创建该组中的进程,然后终止。
4.在一个进程组中,只要有一个进程(任意进程)存在,则该进程组就存在。

介绍一些相关命令:
1.ps axj
a:不仅列出当前用户的进程,也列出所有其他用户的进程
x:不仅列出控制终端的进程,也列出所有无控制终端额进程
j:列出与作业控制相关的信息
这里写图片描述
PPID:父进程ID
PID:当前进程ID
PGID:当前进程的进程组ID
SID:会话ID
TTY:该进程在哪个终端下运作。( ?表示与终端机无关,例如守护进程; tty1-tty6是本机上的登录者进程; pts/0等表示网络连接进主机的进程)。
TPGID:前台进程组ID

STAT:该进程目前的状态
R 运行状态,或在队列中的进程
D 不可中断
S 处于休眠状态
T 停止或被追踪
Z 僵尸进程
W 进入内存交换
X 死亡了的进程
< 高优先级进程
N 低优先级进程
L 有些页被锁进内存
s 包含子进程
+ 位于后台的进程组
l 多线程,克隆线程multi-threaded

UID:用户ID
TIME:该进程实际使用CPU运作的时间
COMMAND:该进程的实际命令

2.&
将前台进程放到后台执行

3.jobs
这里写图片描述
4.fg
将后台进程放到前台执行
这里写图片描述
5.Ctrl+z
将当前正在执行的前台进程放到后台,并暂停执行(状态变为stopped)。
这里写图片描述
6.bg
将后台stopped的进程唤醒,并且继续在后台运行
这里写图片描述
举一个例子,帮助我们理解。
这里写图片描述
我们输入该命令后一敲回车,在后台就会运行一个进程组,PGID为3328,其中PID为3328的进程为组长进程,父进程ID都为2669,我们搜索后发现该进程是 bash,bash的父进程是su

二、作业

当命令行上运行一个进程时,就会变成一个作业,这个作业可能包括一个进程,也可能包括多个进程。
shell有且只能有一个前台作业,当前台有作业时,就不会运行其他作业,shell在后台运行,此时不能接收指令,当作业终止,shell被提到前台,可以接收指令。
这里写图片描述
通过测试,我们发现前台作业终止后,shell被提到了前台,之前输入的命令也可以执行了。

shell可以运行一个前台作业和多个后台作业,这称为作业控制。
这里写图片描述
作业和进程组之间有什么不同吗?
如果作业中的某个进程创建了子进程,则该子进程不属于作业,但属于进程组。进程组是作业的载体。
一旦作业运行结束,shell就会将自己提到前台,如果原来的前台进程还存在,它就会自动变为后台进程组。

举一个比较有意思的例子:
这里写图片描述
运行结果:
这里写图片描述
我们发现,6s内输入命令,无法运行,说明此时前台作业不是shell。6s后父进程退出,即组长进程退出,但子进程仍在运行,但此时输入命令,可以运行,说明shell被提到了前台,而子进程被放到后台继续执行,还会在前台打消息,但Ctrl+c是不能结束子进程的。我们只能通过发送kill信号终止子进程。

三、会话

1.会话是一个或多个进程组的集合。
2.一个会话可以有多个终端。
3.一个会话中,包括控制进程(会话首进程),一个前台进程组和多个后台进程组。
4.默认的会话首进程是bash,会话ID(用SID表示)。
5.控制终端与会话相关联。

进程、进程组、会话之间的关系:
这里写图片描述

四、作业控制

作业控制允许在一个终端上启动多个作业(进程组),它控制哪一个作业可以访问该终端以及哪些作业在后台运行。

作业控制有关的信号介绍
这里写图片描述
cat是读取标准输入,若将其放在后台,还会不会在终端下给我们打消息呢?
这里写图片描述
我们发现,将cat放在后台运行后,输入数据不会在终端显示,而是stopped掉。也就是说,一个后台作业不能从前台读取数据,一旦尝试读取,将被stopped掉(其实是内核发送一个SIGTTIN(21号信号))。因为前台作业只有一个,后台作业可以有多个,要是让后台作业都能向终端打消息,那么就会出现混乱。
若输入Ctrl+z,则向所有前台进程发送SIGTSTP(19号信号),该信号的默认动作是使进程停止。

SIGTSTP信号与SIGSTOP信号的联系与区别:
1.这两个信号都是使进程暂停,都使用SIGCONT让进程重新激活。
2.SIGSTOP提供给管理员暂停进程的特权,不能忽略和重定义;SIGTSTP可以被忽略和重定义。即SIGSTOP不可捕获。
3.捕捉SIGTSTP信号后一般的处理如下:
1)处理完额外的事情
2)恢复默认处理
3)发送SIGTSTP信号给自己,使进程进入suspend状态。

jobs命令:查看当前有哪些作业

fg:将某个作业提至前台
①如果该作业的进程组正在后台运行,则提至前台运行。
②如果该作业处于停止状态,则给该进程组的每个进程发送SIGCONT信号使其继续运行。
这里写图片描述
其中,%2表示将第二个作业提至前台运行。

bg:使某个停止的作业在后台继续运行,也需要该作业的进程组的每个进程发送SIGCONT(18号信号)。
这里写图片描述
给一个停止的进程发送SIGTERM与SIGKILL信号的区别,我们首先看一个例子。
这里写图片描述
kill给一个停止的进程发送SIGTERM(15号信号)不会立即被处理,而是等合适的时机才处理,默认动作是终止该进程
这里写图片描述
SIGKILL(9号信号)既不能被阻塞也不能被忽略,也不能被自定义函数捕捉,只能按系统默认动作立即处理(SIGSTOP(19号信号)也类似),这两个信号的权利比较大,不管什么时候都能杀死或者停止一个进程

五、终端

在UNIX或Linux系统中,用户通过终端登录系统得到一个shell进程,这个终端成为shell进程的控制终端。默认情况下,即没有重定向时,每个进程的标准输入、标准输出、标准错误输出都指向控制终端,就是输出到显示器上,此外,在控制终端输入特殊的控制键可以向前台进程发送信号。

控制终端:会话的领头进程一个终端,之后,该终端就成为该会话的控制终端。一个会话只能有一个终端。

每个进程都可以通过一个特殊的设备文件/dev/tty访问它的终端。其实,每个终端设备都对应一个不同的设备文件,/dev/tty提供了一个通用的接口,一个进程访问它的控制中断既可以通过/dev/tty,也可以通过该终端设备对应的设备文件来访问。
这里写图片描述
再打开一个终端
这里写图片描述
ttyname函数
由文件描述符查出对应的文件名,该文件描述符必须指向一个终端设备而不是任意文件。
这里写图片描述
我们来测试一下:
这里写图片描述
在我们打开的第一个终端下的运行结果:
这里写图片描述
在打开的第二个终端下的运行结果:
这里写图片描述
由此可以看出,文件描述符:0(标准输入)、1(标准输出)、2(标准错误)的文件都在同一个终端下

猜你喜欢

转载自blog.csdn.net/zwe7616175/article/details/79979538