会话和进程组在Unix中的用法和含义?
Unix进程有一个会话ID,是进程组的一部分 – 可以用诸如setsid()/ getpgrp()之类的函数来改变/查询进程组。
然而,过程组和会话的概念总是不见了,有谁能够解释具有不同会话和过程组提供了什么意义 – 为什么/何时想创build一个新会话或在同一个会话和/或过程组中放置多个过程?
一个进程组是一个相关进程的集合,它们都可以一次发送信号。
会话是一个进程组的集合,这些进程组可以连接到一个terminal设备(称为控制terminal ),也可以不连接到任何terminal。
会话用于作业控制:会话中的一个进程组是前台进程组,可以通过terminal控制字符发送信号。 您可以将与控制terminal的会话视为对应于该terminal上的“login”。 (守护进程通常通过创build一个新的会话而无需任何控制terminal来解除自身的关联。)
例如,如果从shell运行some_app
,那么shell会为其创build一个新的进程组,并使该进程组成为会话的前台进程组。 ( some_app
可能会创build一些subprocess;默认情况下它们将成为同一进程组的一部分。)如果您按^Z
, some_app
的进程组将被some_app
为停止; 并且shell的进程组又被重新切换为前台进程组。 然后,例如bg %1
将再次启动some_app
的进程组,但保持它在后台运行。
POSIX.1-2008标准是相当可读的(至less,我认为是这样) – 看看“通用terminal接口”一章的定义和相关章节。
作业控制shell始终处理会话或进程组。 您可以通过一次调用POSIX kill()
函数将相同的信号发送到进程组中的所有进程。
POSIX标准说:
如果pid大于0,则将sig发送给进程ID等于pid的进程。
如果pid为0,sig将被发送到进程组ID等于发送者的进程组ID的所有进程(不包括未指定的一组系统进程),并且进程有权发送信号。
如果pid为-1,那么sig应发送到进程有权发送该信号的所有进程(不包括未指定的一组系统进程)。
如果pid是负的,但不是-1,那么sig应发送到进程组ID等于pid绝对值的所有进程(不包括未指定的一组系统进程),并且进程有权发送一个信号。
例如,当一个loginShell退出时,一个SIGHUP信号被发送到其进程组中的所有程序。
当您将程序操作到前景或背景时,您正在使用进程组。
也有控制terminal担心; 控制terminal产生的信号可以发送给进程组中的所有程序。