Unix中会话和进程组的用法和含义?

Hab*_*usa 73 unix process

Unix进程具有会话ID,并且是进程组的一部分 - 可以使用setsid()/ getpgrp()等函数进行更改/查询.

然而,进程组和会话的概念总是让我感到困惑,任何人都可以解释具有不同会话和进程组提供的重要性 - 为什么/何时想要创建新会话或将多个进程放在同一会话和/或进程组中?

Mat*_*ery 88

进程组是这些都可以在一次信号发送相关的过程的集合.

会话是处理组,其或者连接到单个终端设备(被称为集合控制终端)或不连接到任何终端.

会话用于作业控制:会话中的一个进程组是前台进程组,可以通过终端控制字符发送信号.您可以将与控制终端的会话视为对应于该终端上的"登录".(守护进程通常通过在没有控制终端的情况下创建新会话来与自己的控制终端脱离关联.)

例如,如果some_app从shell 运行,shell会为它创建一个新的进程组,并使其成为会话的前台进程组.(some_app可能会创建一些子进程;默认情况下,它们将成为同一进程组的一部分.)如果您按^Z,some_app则会发出进程组的信号以阻止它; 并且shell的进程组再次切换为前台进程组.然后,例如,bg %1some_app再次启动进程组,但保持它在后台运行.


POSIX.1-2008标准是相当可读的(至少我是这么认为的!) -看看的定义和相关章节"通用终端接口"一章.

  • 这是一个非常好的解释,其他信息可能会在以后出现问题 (3认同)

Jon*_*ler 9

作业控制shell始终操纵会话或进程组.只需调用POSIX kill()函数,即可向进程组中的所有进程发送相同的信号.

POSIX标准说:

如果pid大于0,则应将sig发送到进程ID等于pid的进程.

如果pid为0,则应将sig发送到进程组ID等于发送方的进程组ID且进程有权发送信号的所有进程(不包括未指定的系统进程集).

如果pid为-1,则应将sig发送到进程有权发送该信号的所有进程(不包括未指定的系统进程集).

如果pid是负数,但不是-1,则应将sig发送到进程组ID等于pid绝对值的所有进程(不包括未指定的系统进程集),并且进程有权发送信号.

例如,当登录shell退出时,SIGHUP信号将发送到其进程组中的所有程序.

将程序操作到前台或后台时,您正在使用进程组.

还有一些控制终端需要担心; 由控制终端产生的信号可以发送到进程组中的所有程序.