进程组
在我们学习线程时知道,一个进程内可以有多个线程同时运行,多个同时运行的线程叫做线程组.
线程组中还会有一个主线程,它的线程ID等于该线程组的组ID
pid = tgid
类似的,也有多个进程同时归为一组的概念,
就是进程组,进程组就是多个进程的集合,其中肯定有一个组长,其进程PID等于进程组的PGID
其中 & 表示后台运行的意思
我们通过管道创建了三个进程,
可以看到他们都属于一个进程组,其中组长进程是 11732
我们首先应该注意到,只要该进程组内有任何一个进程存留,那么该进程组都存在
最后可以看到他们的父进程都是 161
与进程组相关的一个概念是作业
作业
在shell中,我们可以使用
./可执行程序
来执行程序,这里跟准确的说法是运行了一个作业(job)/进程组(Process Group)
作业和进程组的唯一一个显著区分是
进程组中进程创建出来的进程属于进程组,而作业中进程创建出来的进程不属于作业
在shell中作业是分前台运行和后台运行的
之前我们就使用 & 使作业在后台运行
shell可以运行一个前台作业和任意多个后台作业
我们可以使用 ctrl + z 暂停作业
使用 jobs 查看当前的作业
使用bg 使作业在后台运行
使用ctrl+c杀死前台作业
需要注意的是 当一个进程在后台运行时 可以使用stdout 打印内容 ,而无法使用stdin读入内容
eg:
如果cat命令不加参数就是从stdin读入, 然后从stdout读出
如果我们使用 & 将其在后台运行, 因为后台进程无法从stdin读入,所以会陷入停止状态 \
最后,kill -15 是终止进程,但是无法终止在后台停止的作业中的进程,当后台作业变成前台作业时,该信号才起作用
不同于kill -15 ,kill-9是在任何时候都会生效
会话 (session)
会话(Session)是一个或多个进程组的集合,一个会话可以有一个控制终端.这通常是登录到其上的终端设备(在终端登录情况下) 或伪终端(在网络登录情况下).建立与控制终端连接的会话首进程被称为控制进程.一个会话中的及格进程组可被分为一个前台进程组以及一个或多个后台进程组.所以一个会话中,应该包括控制进程(会话首进程),一个前台进程组和任意后台进程组
当我们多打开几个终端就会发现,就是多创建了几个新的会话.
每个终端的话首进程就是bash(命令行解释器)