不久前,我想知道这个问题:为什么当你在Linux上关闭一个终端并且没有传递给“init”进程(使用pid 1)时,所有进程都会被终止? 因为所有的子进程在父进程终止之后被“init”进程采用。 请帮助我理解差异和推理中的错误。当终端会话结束时,为什么所有进程都被终止?
还有: 如果可能,那么我们可以使用系统调用来阻止这种情况发生吗?我想,对于这个程序需要使用setsid()
,但实际上这是不正确的。
不久前,我想知道这个问题:为什么当你在Linux上关闭一个终端并且没有传递给“init”进程(使用pid 1)时,所有进程都会被终止? 因为所有的子进程在父进程终止之后被“init”进程采用。 请帮助我理解差异和推理中的错误。当终端会话结束时,为什么所有进程都被终止?
还有: 如果可能,那么我们可以使用系统调用来阻止这种情况发生吗?我想,对于这个程序需要使用setsid()
,但实际上这是不正确的。
为什么在Linux上接近终端上他所有的进程将终止,但 不会传递到“初始化”过程(与PID 1)
的进程,以便内核发送他们正在失去他们的控制终端一个SIGHUP
。 SIGHUP
的默认操作是终止该过程。
正如cnicutar解释,这是由于与控制终端相关的进程组中发送给所有进程SIGHUP
。您可以为此信号安装处理程序或完全忽略它。对于任意程序,您可以使用专门为此设计的nohup
实用程序启动它们。
您也可以将过程放在没有控制终端的新过程组中。
我可以在我的程序模拟吗? 哪个系统调用用于此? – Simplex
@Simplex你需要'setsid'。 – cnicutar
但setsid()返回-1。 我使用setsid(),并使用fork()创建了几个进程。 – Simplex