进程组和会话在进程之间形成了一种两级层次关系:进程组是一组相关进程的集合,会话是一组相关进程组的集合
进程组和会话是为支持shell作业控制而定义的抽象概念,用户通过shell能够交互式的在前台或后台运行命令。术语“作业”通常与术语“进程组”作为同义词来看待
概述:
一个会话中的所有进程共享单个控制终端。控制终端会在会话首进程首次打开一个终端设备时被建立。一个终端最多可能会成为一个会话的控制终端。
在任一时刻,会话中的其中一个进程组会成为终端的前台进程组,其他进程组会成为后台进程组。只有前台进程组中的进程才能够从控制 终端中读取输入。当用户在控制终端输入其中一个信号生成终端字符后,该信号会被发送到前台进程组中的所有成员。这些字符包括SIGINT(Control-C)、SIGQUIT(Control-\), SIGSTP(Control-Z)
当控制终端的连接建立起来之后,会话首进程会成为该终端的控制进程。成为控制进程的主要标志是当断开与终端之间的连接时,内核会向该进程发送一个SIGHUP信号
对于交互式登录来讲,控制终端是用户登录的途径。登录shell是会话首进程和终端的控制进程,也是其自身进程组的唯一成员。从shell中发出的每个命令或通过管道连接一组命令都会导致一个或多个进程的创建,并且shell会把所有这些进程都放在一个新进程组中。当命令或以管道连接的一组命令以&符号结束时,会在后台进程组中运行这些命令,否则就会在前台进程组中运行这些命令
会话
会话是一组进程组的集合。一个进程的会话成员关系是由其会话id来定义的,如果调用进程不是进程组首进程,那么setsid()会创建一个新会话
一个会话中的所有进程可能会拥有一个控制终端。会话在被创建出来的时候是没有控制终端的,当会话首进程首次打开一个还没有称为某个会话的控制终端时会建立控制终端,除非在调用open()时指定O_NOCTTY标记。
在控制进程终止时,会发生下列事情:
1. 会话中的所有进程将会失去与控制终端之间的关联关系
2. 控制终端失去了与该会话之间的关联关系,因此另一个会话首进程就能够获取该终端以成为控制进程
3. 内核会向前台进程组的所有成员发送一个SIGHUP信号(默认行为是终止进程)来通知他们控制终端的丢失
在一个会话中,在同一时刻只能有一个进程组能够称为前台进程,会话中的其他所有进程都是后台进程组。
如果一个进程组中至少有一个成员拥有一个位于同一会话但不同进程组中的父进程,就不是孤儿进程组
如果一个进程组变成了孤儿进程组并且拥有很多已经停止执行的成员,那么系统会向进程组中的所有成员发送一个SIGHUP信号通知它们已经与会话断开连接了
阅读(2019) | 评论(0) | 转发(0) |