【问题标题】:Why are all processes killed when a terminal session ends?为什么终端会话结束时所有进程都被杀死?
【发布时间】:2012-09-14 06:42:09
【问题描述】:

不久前,我想知道一个问题:为什么在 Linux 上关闭终端时所有进程都被杀死,而不是传递给“init”进程(pid 1)? 因为,在父进程终止后,所有子进程都被“init”进程采用。 请帮助我理解我推理中的差异和错误。

还有: 如果可能,那么我们可以使用系统调用来阻止这种情况发生吗?我认为,为此程序需要使用setsid(),但实际上它是不正确的。

【问题讨论】:

    标签: c linux terminal system-calls


    【解决方案1】:

    正如 cnicutar 所解释的,这是由于 SIGHUP 发送到与控制终端关联的进程组中的所有进程。您可以为此信号安装处理程序,也可以完全忽略它。对于任意程序,您可以使用为此目的设计的nohup 实用程序启动它们。

    您也可以将进程放置在没有控制终端的新进程组中。

    【讨论】:

      【解决方案2】:

      为什么在 linux 上关闭终端时,他的所有进程都会终止,但是 未传递给“init”进程(pid 1)

      进程正在失去它们的控制终端,因此内核向它们发送SIGHUPSIGHUP的默认动作是终止进程。

      【讨论】:

      • 我可以在我的程序中做模拟吗?哪个系统调用用于此?
      • 但是 setsid() 返回 -1。我使用 setsid(),然后使用 fork() 创建了几个进程。
      • @Simplex 是时候挖掘 Stevens(Unix 环境中的高级编程)或 Rochkind 或类似的书了。该问题已详细介绍。当然,部分技巧是让子进程忽略 SIGHUP。
      • @JonathanLeffler 但是如果孩子从会话中分离出来一切都会好起来的,不是吗?
      • 这也是另一种方法。不过,确保您与终端完全解除关联是诀窍。你也可以使用setpgid()(如果你不介意它的不同定义,也可以使用setpgrp())。
      【解决方案3】:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多