2012-09-14 77 views
1

不久前,我想知道这个问题:为什么当你在Linux上关闭一个终端并且没有传递给“init”进程(使用pid 1)时,所有进程都会被终止? 因为所有的子进程在父进程终止之后被“init”进程采用。 请帮助我理解差异和推理中的错误。当终端会话结束时,为什么所有进程都被终止?

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

回答

1

为什么在Linux上接近终端上他所有的进程将终止,但 不会传递到“初始化”过程(与PID 1)

的进程,以便内核发送他们正在失去他们的控制终端一个SIGHUPSIGHUP的默认操作是终止该过程。

+0

我可以在我的程序模拟吗? 哪个系统调用用于此? – Simplex

+0

@Simplex你需要'setsid'。 – cnicutar

+0

但setsid()返回-1。 我使用setsid(),并使用fork()创建了几个进程。 – Simplex

2

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

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

相关问题