守护进程

Posted Luella_G

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了守护进程相关的知识,希望对你有一定的参考价值。

一、守护进程的概念
守护进程又称精灵进程,是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或者等待处理某些发生的事件。守护进程是一种很有用的进程。
Linux的大多数服务器就是用守护进程实现的。例如:Internet服务器inetd,Web服务器httpd等。
守护进程完成许多系统任务。例如:作业规划进程crond等。
二、守护进程的创建
1.调用umask(0),将文件模式创建屏蔽字设置为0。
2.调用fork(),之后让父进程退出。
原因:1)如果该守护进程是作为一条简单的shell命令启动的,那么父进程终止使得shell认为该命令已经执行完毕。
2)保证子进程不是一个进程组的组长进程。
3.调用setsid()创建一个新会话。
调用setsid()导致的结果:1)调用进程成为新会话的首进程。
2)调用进程成为一个进程组的组长进程。
3)调用进程没有控制终端。
4.将当前工作目录改为根目录。
5.关闭不需要的文件描述符表。
6.其他:忽略SIGCHLD信号。
三、代码实现

#include<stdio.h>
#include<unistd.h>
#include<signal.h>
#include<stdlib.h>
void mydaemon()

    if(fork() > 0)
    
        exit(0);
    
    setsid();
    chdir("/");
    close(0);
    close(1);
    close(2);
    signal(SIGCHLD, SIG_IGN);


int main()

    umask(0);
    mydaemon();
    while(1);
    return 0;

四、fork()的创建次数
在一般的情况下,创建守护进程使用一次fork(),有的则会使用两次fork()。下面比较一下fork()一次和fork()两次的作用:
(1)调用一次fork的作用:
第一次fork的作用是让shell认为这条命令已经终止,不用挂在终端输入上,还有就是为了后面的setsid服务,因为调用setsid函数的进程不能是进程组组长,如果不fork出子进程,则此时的父进程是进程组组长,就无法调用setsid。当子进程调用完setsid函数之后,子进程是会话组长也是进程组组长,并且脱离了控制终端,此时,不管控制终端如何操作,新的进程都不会收到一些信号使得进程退出。
(2)第二次fork的作用:
虽然当前关闭了和终端的联系,但是后期可能会误操作打开了终端。只有会话首进程能打开终端设备,也就是再fork一次终止父进程,保持子进程不是话首进程,从而保证后续不会再和其他终端关联

以上是关于守护进程的主要内容,如果未能解决你的问题,请参考以下文章

如何创建守护进程?

Linux守护进程

编写守护进程

PHP如何实现daemon守护进程和master-woker模式进程

守护进程

repmgr的见证节点和守护进程