Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.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 为什么终端会话结束时所有进程都被终止?_C_Linux_Terminal_System Calls - Fatal编程技术网

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

C 为什么终端会话结束时所有进程都被终止?,c,linux,terminal,system-calls,C,Linux,Terminal,System Calls,不久前,我想知道这样一个问题:为什么在Linux上关闭终端时,所有进程都被杀死了,而没有传递给“init”进程(使用pid 1)? 因为,在父进程终止后,“init”进程将采用所有子进程。 请帮助我理解我推理中的差异和错误 而且: 如果可能的话,我们可以使用系统调用来阻止这种情况发生吗?我认为,对于这一点,程序需要使用setsid(),但实际上这是不正确的 为什么在linux上的close终端上,他的所有进程都会终止,但是 未传递到“初始化”进程(pid为1) 进程正在失去它们的控制终端,因此内

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

而且: 如果可能的话,我们可以使用系统调用来阻止这种情况发生吗?我认为,对于这一点,程序需要使用
setsid()
,但实际上这是不正确的

为什么在linux上的close终端上,他的所有进程都会终止,但是 未传递到“初始化”进程(pid为1)


进程正在失去它们的控制终端,因此内核向它们发送一个
SIGHUP
。SIGHUP的默认操作是终止该过程。

我认为这将帮助您理解

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


您也可以在没有控制终端的情况下将进程放入新的进程组。

我可以在程序模拟中执行吗?此操作使用哪个系统调用?但是setsid()返回-1。我使用setsid()并在使用fork()创建了几个进程之后。@Simplex Time挖掘Stevens(Unix环境中的高级编程)或Rochkind,或类似的书籍。这一问题已被详细讨论。当然,部分诀窍是让子进程忽略SIGHUP。@JonathanLeffler但如果子进程将自己从会话中分离出来,一切都会好起来,不是吗?这也是另一种方法。不过,确保你与终端完全脱离是一个诀窍。您也可以使用
setpgid()
(和
setpgrp()
,如果您不介意它的功能的不同定义的话)。