进程组
- 进程组是⼀个或多个进程的集合。
- 每个进程除了有⼀个pid之外,还属于⼀个进程组。它们的pgid(进程组id)=组长进程的pid。每个进程组有唯一一个进程组id。
- 每个进程组都可以有⼀个组长进程。组长进程可以创建⼀个进程组,创建该组中的进程,然后终⽌。
- 只要进程组还有一个进程,则进程组存在,这与组长进程是否存在无关。
作业
- ⼀个前台作业可以由多个进程组成,⼀个后台也可以由多个进程组成,
- Shell分前后台来控制的不是进程⽽是作业(Job)或者进程组(Process Group)。
与进程组的区别:
如果作业中的某个进程又创建了⼦进程,则⼦进程不属于作业。
下图可以清晰的表达该关系:
- ⼀旦作业运⾏结束,Shell就把⾃⼰提到前台,如果原来的前台进程还存在(如果这个⼦进程还没终⽌),它⾃动变为后台进程组。
- 作业控制:Shell运⾏⼀个前台作业和任意多个后台作业。
这样就可以解释进程在前台,shell命令无法运行,进程后台,ctrl+c没有作用。
当./test在前台运行时(./test是一个作业),所以此时前台的作业运行数量已经够了,shell只能去后台,所以此时用户输入pwd等命令,shell在后台根本就看不见,所以无法执行。但是,ctrl+c是信号,所以进程可以收到,也就可以执行。
./test | sleep 1000 | sleep2000 &
会话
- 会话(Session)是⼀个或多个进程组的集合。⼀个会话可以有⼀个控制终端。
- 建⽴与控制终端连接的会话⾸进程被称为控制进程。
- ⼀个会话中的⼏个进程组可被分为⼀个前台进程组以及⼀个或多个后台进程组。所以⼀个会话中,应该包括控制进程(会话⾸进程),⼀个前台进程组和任意后台进程组。
- -