Unix进程具有一个会话ID,并且是进程组的一部分-可以使用setsid()/ getpgrp()之类的函数来更改/查询该进程组。
但是,过程组和会话的概念始终使我难以理解,任何人都可以解释具有不同的会话和过程组的意义-为什么/何时创建一个新会话或将多个过程置于同一会话和/或过程组中?
Answers:
甲进程组是能够一次全部以信号相关的过程的集合。
甲会话是处理组,其或者连接到单个终端设备(被称为集合控制终端)或不连接到任何终端。
会话用于作业控制:会话中的进程组之一是前台进程组,可以通过终端控制字符发送信号。您可以将与控制终端的会话视为与该终端上的“登录”相对应。(守护进程通常通过创建一个没有会话的新会话来将自己与任何控制终端解除关联。)
例如,如果您some_app
从外壳程序运行,外壳程序将为其创建一个新的进程组,并使该会话成为前台进程组。(some_app
可能会创建一些子进程;默认情况下,它们将成为同一进程组的一部分。)如果您按^Z
,some_app
则发出信号通知该进程组停止它;然后将Shell的进程组再次切换为前台进程组。然后,例如bg %1
将some_app
再次启动的进程组,但使其在后台运行。
该POSIX.1-2008标准是相当可读的(至少我是这么认为的!) -看看的定义和相关章节“通用终端接口”一章。
terminal
和terminal device
文档中提到的一样的东西吗?
作业控制外壳始终在操纵会话或进程组。您可以通过一次调用POSIXkill()
函数将相同的信号发送到流程组中的所有流程。
POSIX标准说:
如果pid大于0,则将sig发送到其进程ID等于pid的进程。
如果pid为0,则sig将被发送到其进程组ID等于发送方的进程组ID的所有进程(不包括未指定的系统进程集),并且该进程有权发送信号。
如果pid为-1,则sig应发送到该进程有权发送该信号的所有进程(不包括一组未指定的系统进程)。
如果pid为负,但不是-1,则sig应发送给所有进程组ID等于pid的绝对值且进程有权发送信号的进程(不包括未指定的系统进程集)。 。
例如,当退出登录外壳程序时,会将SIGHUP信号发送到其进程组中的所有程序。
当您将程序操纵到前台或后台时,您正在使用进程组。
也有控制终端需要担心。控制终端生成的信号可以发送到进程组中的所有程序。