【发布时间】:2011-09-26 18:56:45
【问题描述】:
Unix 进程有一个会话 id 并且是进程组的一部分 - 可以使用诸如 setsid()/getpgrp() 之类的函数来更改/查询。
但是进程组和会话的概念总是让我难以理解,任何人都可以解释具有不同会话和进程组的意义 - 为什么/何时想要创建一个新会话或在同一个会话中放置多个进程和/还是进程组?
【问题讨论】:
Unix 进程有一个会话 id 并且是进程组的一部分 - 可以使用诸如 setsid()/getpgrp() 之类的函数来更改/查询。
但是进程组和会话的概念总是让我难以理解,任何人都可以解释具有不同会话和进程组的意义 - 为什么/何时想要创建一个新会话或在同一个会话中放置多个进程和/还是进程组?
【问题讨论】:
进程组是相关进程的集合,可以同时发出信号。
会话是进程组的集合,它们要么连接到单个终端设备(称为控制终端),要么不连接到任何终端。
会话用于作业控制:会话中的进程组之一是前台进程组,可以通过终端控制字符发送信号。您可以将与控制终端的会话视为对应于该终端上的“登录”。 (守护进程通常通过创建一个没有控制终端的新会话来解除自己与任何控制终端的关联。)
例如如果您从 shell 运行 some_app,shell 会为其创建一个新进程组,并将其设为会话的前台进程组。 (some_app 可能会创建一些子进程;默认情况下,它们将属于同一个进程组。)如果您随后按下^Z,则some_app 的进程组会收到停止它的信号;然后shell的进程组再次切换为前台进程组。然后例如bg %1 将再次启动some_app 的进程组,但保持它在后台运行。
POSIX.1-2008 standard 相当易读(至少,我认为是这样!) - 看看definitions 和"General Terminal Interface" 章节的相关部分。
【讨论】:
terminal 和terminal device 是同一件事吗?
作业控制外壳一直在操纵会话或进程组。只需一次调用 POSIX kill() 函数,您就可以向进程组中的所有进程发送相同的信号。
POSIX 标准说:
如果pid大于0,sig会发送给进程ID等于pid的进程。
如果 pid 为 0,则 sig 应发送给进程组 ID 等于发送者进程组 ID 且进程有权发送信号的所有进程(不包括未指定的系统进程集) .
如果 pid 为 -1,则应将 sig 发送到进程有权发送该信号的所有进程(不包括未指定的系统进程集)。
如果 pid 为负数,但不是 -1,则应将 sig 发送给进程组 ID 等于 pid 绝对值且进程有权访问的所有进程(不包括未指定的系统进程集)发送信号。
例如,当登录 shell 退出时,会向其进程组中的所有程序发送 SIGHUP 信号。
当您将程序操作到前台或后台时,您正在使用进程组。
还有控制终端要担心;控制终端产生的信号可以发送到进程组中的所有程序。
【讨论】: