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

问题描述 投票:9回答:4

我已经尝试了man(3) setsid,但它只解释了如何使用它,我不明白什么时候setsid有用吗?

c linux gcc sid
4个回答
10
投票

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

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


7
投票

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


0
投票

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

  1. screen:将进程放入后台,但终端仍然存在。因此,如果您“fg”将进程再次置于前台,则会显示其所有标准输出。
  2. nohup:将进程放入后台,但将所有屏幕显示输出到文件。所以你只需要“cat”文件来查看输出。
  3. setsid:将进程放入后台,但由于终端已放弃,因此无法检索输出。仅在屏幕显示对您不重要时才使用此选项。

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

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


-1
投票

这可以作为成为daemon的一部分,即将进程与控制终端断开连接。另见daemon(3)

© www.soinside.com 2019 - 2024. All rights reserved.