当前位置:C++技术网 > 资讯 > Linux系统守护进程功能的实现代码和分析

Linux系统守护进程功能的实现代码和分析

更新时间:2018-05-04 09:13:02浏览次数:1+次

    此前讲解了在Windows环境下的守护进程的实现方法和代码,见:《守护进程的原理和C++实现守护进程的代码》。
    今天再来说说Linux的守护进程的实现方法和代码。对于守护进程的概念,就不再重复了,请看前面的文章的讲解。
    简单来说,守护进程就是和被守护的进程一起运行的一个进程,当被守护的进程死掉之后,就立刻再创建一个被守护的进程。不管被守护的进程是被手动杀死,还是异常崩溃,还是正常结束,守护进程都可以再启动一个被守护的进程,继续提供服务。
    那么我们需要的就是当被守护进程死掉的时候,守护进程立刻就知道,并且立刻启动被守护的进程。那么这个可以通过系统内核的信号量机制,对于进程的同步机制,系统内核是直接就支持的。也就是说,当进程死掉的时候,系统就会产生一个信号,来通知守护进程。所以我们实现这个功能是很简单的,不过需要了解操作系统的朋友才会觉得简单。
    那么下面就贴出完整的代码:
#include <pthread.h>
#include <sys/wait.h> 
int main()
{
    pid_t child;
    while(1)
    {
        if((child = fork()) == -1)  
        {
            //出错
            exit(EXIT_FAILURE);  
        }  
        else if(child == 0)//子进程中  
        {
            //这里编写你的代码,这里就是被守护进程要做的事情
        }  
        else      
        {
            //这里实现的是守护进程的功能。
            int status=-1;
            waitpid( child, &status, 0 );
        } 
    }
    return 0;
}

    代码是不是很简单?!一个while,然后一组if else就可以了。这里用到了两个函数,分别是fork()和waitpid,分别需要导入头文件pthread.h和sys/wait.h。

fork函数(百度百科解释):
    计算机程序设计中的分叉函数。返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程标记;否则,出错返回-1。
    fork函数将运行着的程序分成2个(几乎)完全一样的进程,每个进程都启动一个从代码的同一位置开始执行的线程。这两个进程中的线程继续执行,就像是两个用户同时启动了该应用程序的两个副本。
    更多详细解释,请参考:https://baike.baidu.com/item/fork/7143171?fr=aladdin
    看完解释,我们就不难理解,为什么我们的程序结构是上面那样的。重点理解一下fork函数的运作机制。

waitpid函数:
    会暂时停止目前进程的执行,直到有信号来到或子进程结束。
    此函数相当于一直在等待被守护的进程结束,然后才会继续执行。

    主要是理解这两个函数,如果还有问题,请查询这两个函数的资料。