什么时候setsid()有用,或者为什么我们需要在Linux中对进程进行分组?

时间:2012-06-20 13:03:17

标签: c linux gcc sid

我已经尝试了man(3) setsid,但它只解释了如何使用它,我不清楚何时setsid有用?

4 个答案:

答案 0 :(得分:10)

会话是一组共享控制终端的进程。当你想要开始一个新的会话,setsid很有用,因为你已经开始连接到一个新的终端 - 比如在终端模拟器中启动一个shell时 - 或者你想要一个守护进程(你不想这样做)与控制终端相关联。)

我对这些方面的最佳解释是R.W. Stevens Unix环境中的高级编程

答案 1 :(得分:7)

Why do we need to group processes?考虑您希望干净地关闭的情况,包括向您的孩子发送信号。存在固有的竞争条件:尚未收到SIGCHLD,因此您知道孩子还活着。所以你发一个信号。但是孩子在信号发送之前终止,而另一个(不相关的)进程启动并获得与发送信号的孩子相同的pid。然后信号进入新的无关过程。这是不好的。因此,不是向特定的pid发送信号,而是向进程组发出信号。当孩子死亡并且新流程从原始pid开始时,新流程是流程组的一部分,并且避免了上述问题。

答案 2 :(得分:0)

要知道何时有用,您必须将其与守护进程的其他类似命令进行比较:

  1. 屏幕:将进程置于后台,但终端仍然存在。因此,如果您“ fg”将流程重新置于前台,则将显示其所有标准输出。

  2. nohup:将进程置于后台,但将所有屏幕显示输出到文件。因此,您只需要“捕获”文件即可查看输出。

  3. setsid:将一个进程置于后台,但是由于其终端已被放弃,因此无法检索输出。仅当屏幕显示对您不重要时才使用此功能。

对于涉及pid和行为的其他并发症,请参见:

http://go2linux.garron.me/linux/2010/12/setsid-how-execute-commands-after-you-exit-shell-prompt-866/

答案 3 :(得分:-1)

这有助于成为daemon的一部分,即将进程与控制终端断开连接。另请参阅daemon(3)