分类: LINUX
2017-08-25 10:18:20
进程组顾名思义是指一个或多个进程的集合。他们通常与同一个job(可以从同一个终端接收信号)相关联。每个进程组拥有一个唯一的Process Group Id。可以使用getpgrp或getpgid获取进程的Process Group Id:
点击(此处)折叠或打开
点击(此处)折叠或打开
点击(此处)折叠或打开
- 调用进程成为新session的session leader(A session leader is the process that creates a session)。此时此进程是新session中的唯一进程。
- 调用进程成为新进程组的leader。新进程组的Process Group ID 等于 调用进程的 Process ID。
- 调用进程不会再有控制终端。如果调用进程在调用setsid前拥有控制终端的话,那么调用setsid后他将断开与其控制终端的联系。
点击(此处)折叠或打开
- 一个session可以拥有一个控制终端(当然也可以没有)。他通常是我们登录时的终端设备或伪终端。
- 创建与控制终端的链接的session leader被称为控制进程 (Controlling Process)。
- 一个会话中的进程组可以划分为一个前台进程组和一个或多个后台进程组。
- 如果一个会话拥有控制终端,那么它有一个前台进进程组,这个会话中的其他进程组都是后台进程组。
- 无论何时我们按下终端的中止键(通常是 DELETE或Crtl-C),就会有一个中止信号发送给前台进程组中的所有进程。
- 无论何时我们按下终端的退出键(通常是Crtl-Backslash),就会有一个退出信号发送给前台进程组中的所有进程。
- 如果终端接口检测到网络断开,那么hang-up信号就会发送给控制进程,即the session leader。
一般我们不必关心控制终端,它在我们登录时自动被创建。有事程序需要与控制终端通信,无论是使用标准输出还是标准输入重定向。程序保证与控制终端进行通信的方法时读写 /dev/tty文件。这个特殊文件在内核中是控制终端的代名词。如果程序没有控制终端,那么它打开/dev/tty文件将会失败。
可以使用tcgetpgrp函数获取前台进程组Id,使用tcsetpgrp设置前台进程组:
点击(此处)折叠或打开
- shell需要支持job control
- 内核中的终端驱动必须支持job control
- 内核必须支持确定的job-control信号
如前所述,只有前台job会接收到终端输入,但是后台job尝试读取终端并不是错误的,终端驱动会检测后台进程的这种举动并向后台job发送一个特殊的信号:SIGTTIN。SIGTTIN通常会中止后台job。
- 中止字符(通常是DELETE或Crtl-C)产生SIGINT
- 退出字符(通常是Crtl-Backslash)产生SIGQUIT
- 暂停字符(通常是Crtl-Z)产生SIGSTP