C setsid()什么时候有用,或者为什么我们需要在Linux中对进程进行分组?
我试过C setsid()什么时候有用,或者为什么我们需要在Linux中对进程进行分组?,c,linux,gcc,sid,C,Linux,Gcc,Sid,我试过man(3)setsid,但它只解释了如何使用它,我不明白setsid什么时候有用 会话是共享控制终端的一组进程。当您想要启动一个新会话时,setsid很有用,因为您已经开始连接到一个新的终端——例如在终端仿真器中启动一个shell时——或者您想要一个守护进程(您不想与控制终端相关联) 关于这些方面,我所知道的最好的解释是在Unix环境下的R.W.Stevens高级编程中。这对于成为一个应用程序非常有用,即断开进程与控制终端的连接。请参阅。 为什么我们需要分组进程?< /COD>考虑您希望
man(3)setsid
,但它只解释了如何使用它,我不明白setsid什么时候有用 会话是共享控制终端的一组进程。当您想要启动一个新会话时,setsid很有用,因为您已经开始连接到一个新的终端——例如在终端仿真器中启动一个shell时——或者您想要一个守护进程(您不想与控制终端相关联)
关于这些方面,我所知道的最好的解释是在Unix环境下的R.W.Stevens高级编程中。这对于成为一个应用程序非常有用,即断开进程与控制终端的连接。请参阅。
<代码>为什么我们需要分组进程?< /COD>考虑您希望关闭的情况,包括发送信号给您的孩子。有一个固有的种族条件:一个信号还没有收到,所以你们知道那个孩子还活着。所以你发出了一个信号。但子进程在发送信号之前终止,另一个(不相关的)进程启动,并获得与发送信号的子进程相同的pid。然后信号进入新的、不相关的进程。这很糟糕。因此,您不是向特定的PID发送信号,而是向流程组发送信号。当子进程死亡且新进程以原始pid开始时,新进程不是进程组的一部分,并且可以避免上述问题。
要知道它何时有用,您必须将其与用于监视进程的其他类似命令进行比较:我知道这是老生常谈,但是:你的答案并不完全正确。杀死子进程通常没有竞争条件,因为终止的子进程作为“僵尸”进程挂起(其pid不会被重用),直到您通过调用
wait
或waitpid
或类似方法获得它。因此,如果发送终止信号,然后waitpid
,则不存在竞争条件。唯一的例外是您将SIGCHLD操作设置为“ignore”,在这种情况下,子进程可能会在不需要调用wait
的情况下关闭(另外,问题是关于setId
的,它创建了一个会话领导者,而不仅仅是一个进程组。恐怕无法自动向整个会话发送信号)@davmac我描述的竞争条件发生在shell脚本中尝试此类操作时,而脚本编写器没有控制wait调用时所需的控制级别。不过,您提出了一个很好的观点。很公平:)FWIW您可能可以通过使用内置的kill
命令和作业规范(如%1
)而不是进程ID来避免shell脚本中的竞争,至少在Bash中是这样(可能不在其他shell中;我对它们了解不够)。但只向过程组发出信号肯定更容易。