为什么终端会话结束时所有进程都被终止?

时间:2012-09-14 06:42:09

标签: c linux terminal system-calls

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

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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

  

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

进程正在丢失其控制终端,因此内核会向它们发送SIGHUPSIGHUP的默认操作是终止该过程。

答案 2 :(得分:0)