10

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

4

4 回答 4

12

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

我对这些方面的了解最好的解释是 RW Stevens Advanced Programming in the Unix environment

于 2012-06-20T13:24:12.450 回答
7

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

于 2012-06-20T15:10:39.230 回答
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/

于 2019-04-30T00:28:57.450 回答
-1

这对于成为守护进程很有用,即断开进程与控制终端的连接。另请参阅daemon(3)

于 2012-06-20T13:24:24.357 回答