为什么父母应该在创建守护进程的过程中死亡

时间:2016-04-11 10:42:04

标签: c unix linux-kernel fork daemon

" 因此,启动守护程序的常用方法包括分叉一次或两次,并在子进程开始执行其正常功能时使父进程死亡。 " 我正在阅读操作系统概念,但我并不了解上述所述内容。 为什么在创建守护进程的过程中父进程将退出(或父进程死亡)? 有人可以解释一下。

2 个答案:

答案 0 :(得分:1)

传统上,守护进程被定义为一个进程,其父进程是系统的init进程,并在后台运行。例如,如果您要在终端中执行某个程序,那么shell将创建一个进程(在前台或后台),程序将以shell作为其父进程运行。这是非守护进程的一个示例,因为它的父进程是shell进程。

那么如何生成父进程为init的进程?好吧,父进程在它(孩子)退出之前死亡的进程变成了一个孤儿进程。然后,孤立进程将重新成为init进程的父级。瞧,这个过程现在符合守护进程的定义。

将此与你的引语联系起来,如果你要分叉一次然后杀死父母,你就会达到预期的效果。同样,如果你分叉一次,然后让那个孩子分叉另一个进程,然后杀死第一个孩子,你也可以在保持(现在祖父母)进程活着的同时达到预期的效果。

答案 1 :(得分:1)

其他答案已经解释了父母死亡时会发生什么,即初始化过程采用了孩子。

但为什么需要以上才能制作进程守护进程?根据定义,守护进程是非交互程序,即它不应与终端相关联。即使用户通过Control-C,挂断等发送信号,这也确保守护进程在后台继续工作。现在,如何防止进程连接到终端?通过杀死原始父母来使init成为其父母。 init 是一个特殊的过程,因为:

  • 它没有连接到任何终端。
  • 启动操作系统后的第一个进程(pid 1),这使其成为其会话的领导者。请注意,每个UNIX进程都属于一个进程组,而进程组又属于一个进程。会话中的第一个进程成为会话负责人。

在UNIX中,只有会话负责人可以附加到(或控制)终端。只要您创建进程的 init 父级,它就会加入init的会话。由于init是会话领导者,因此您的流程永远不会成为领导者,因此永远不会连接到终端。这就是我们想要的,对吧?

还有其他方法来分离终端,例如调用setsid,但这不是讨论的一部分。

相关问题