了解守护程序初学者指南

2020-09-04 07:15:40

在本文中,我们将仔细研究守护进程。我们将确切地了解它们是什么,它们是如何实现的,以及它们的责任范围。

简单地说,守护进程(发音为dee-mon)是故意孤立的后台进程。此外,守护进程从产生它们的终端分离,无需用户交互即可运行,并且是系统初始化进程的后代。

守护程序在执行之前将在后台静默等待特定事件发生或满足条件。

在引导时,Linux将启动init进程(init本身就是一个守护进程),它将充当所有进程的父进程,并为其分配PID 1(进程标识号)。值得一提的是,init函数是一个不附加到任何终端的特殊进程。

引导序列完成后,Linux将启动任何先前声明的守护进程。这些将通过一系列fork()和exit()命令创建,这些命令将有意创建一个孤立进程,该进程最终将被init进程采用-稍后将详细介绍这一点。

通常,守护进程名称以字母“d”结尾。如果您有兴趣查看Linux计算机上安装的所有守护进程,请使用以下命令:

Web服务器只是一个在后台持续运行的进程,等待处理和响应HTTP请求(http守护进程)。

我们将很快查看创建守护进程的代码,但让我们首先建立一些基础知识。

调用fork()函数将创建一个称为子进程的新进程。子进程与触发fork()的进程(父进程)并行运行。

子进程与其父进程共享相同的程序计数器和CPU寄存器。因此,当创建新的子进程时,子进程和父进程都将并行执行fork()调用之后的下一条指令。

在fork()之后,父进程和子进程都并行执行以下代码。

如果需要,您还可以使它们的执行路径不同。如果fork()调用成功,则在父进程中返回子进程的PID,在子进程中返回0。

为了创建守护进程,我们将使用fork()创建子进程,然后退出父进程。如前所述,这将有意创建一个将由init采用的孤立进程。

我们的新守护进程现在可以静默地坐在任何终端外部的后台中执行其任务。

下面的实现灵感来自Pascal Werkl的工作。我添加了额外的文档,使不熟悉C和/或Linux系统的人更容易理解它。我鼓励您在这里签出原始代码。

让我们试着理解为什么在上面的代码中需要2个fork()调用。