今天再来说说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函数:
会暂时停止目前进程的执行,直到有信号来到或子进程结束。
此函数相当于一直在等待被守护的进程结束,然后才会继续执行。
主要是理解这两个函数,如果还有问题,请查询这两个函数的资料。