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



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

会话

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

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

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

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

  1. 屏幕:将进程放入后台,但终端仍然存在。 因此,如果您"fg"将进程再次置于前台,则将显示其所有标准输出。

  2. NOHUP:将进程置于后台,但将所有屏幕显示输出到文件中。 因此,您只需要"cat"文件即可查看输出。

  3. setsid:将一个进程放到后台,但由于它的终端被放弃,所以无法检索输出。 仅当屏幕显示对您不重要时才使用此选项。

有关与pid和行为有关的其他并发症,请参阅以下内容:

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

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

最新更新