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

时间:2011-07-01 13:48:11

标签: unix process

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

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

2 个答案:

答案 0 :(得分:84)

进程组是一组相关进程,可以一次发出信号。

会话是一组进程组,它们连接到单个终端设备(称为控制终端)或未连接到任何终端。< / p>

会话用于作业控制:会话中的一个进程组是前台进程组,可以通过终端控制字符发送信号。您可以将与控制终端的会话视为对应于该终端上的“登录”。 (守护进程通常通过创建一个没有控制终端的新会话来与任何控制终端脱离关系。)

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


POSIX.1-2008 standard具有相当的可读性(至少,我认为是这样!) - 请查看definitions以及"General Terminal Interface"章节的相关部分。

答案 1 :(得分:7)

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

POSIX标准说:

  

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

     

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

     

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

     

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

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

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

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