Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C setsid()什么时候有用,或者为什么我们需要在Linux中对进程进行分组?_C_Linux_Gcc_Sid - Fatal编程技术网

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开始时,新进程不是进程组的一部分,并且可以避免上述问题。

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

  • 屏幕:将进程置于后台,但终端仍然存在。因此,如果您使用“fg”将进程再次置于前台,则会显示其所有标准输出

  • nohup:将进程置于后台,但将所有屏幕显示输出到一个文件中。因此,您只需对文件进行“cat”即可查看输出

  • setsid:将进程置于后台,但由于其终端已放弃,因此无法检索输出。仅当屏幕显示对您不重要时才使用此选项

  • 有关pid和行为的其他并发症,请参见:


    我知道这是老生常谈,但是:你的答案并不完全正确。杀死子进程通常没有竞争条件,因为终止的子进程作为“僵尸”进程挂起(其pid不会被重用),直到您通过调用
    wait
    waitpid
    或类似方法获得它。因此,如果发送终止信号,然后
    waitpid
    ,则不存在竞争条件。唯一的例外是您将SIGCHLD操作设置为“ignore”,在这种情况下,子进程可能会在不需要调用
    wait
    的情况下关闭(另外,问题是关于
    setId
    的,它创建了一个会话领导者,而不仅仅是一个进程组。恐怕无法自动向整个会话发送信号)@davmac我描述的竞争条件发生在shell脚本中尝试此类操作时,而脚本编写器没有控制wait调用时所需的控制级别。不过,您提出了一个很好的观点。很公平:)FWIW您可能可以通过使用内置的
    kill
    命令和作业规范(如
    %1
    )而不是进程ID来避免shell脚本中的竞争,至少在Bash中是这样(可能不在其他shell中;我对它们了解不够)。但只向过程组发出信号肯定更容易。