守护进程

细心的朋友可能注意到,我的上一篇博客“crond和crontab分别是什么”中提到过一个关键词——守护进程。
那么什么是守护进程呢?我们现在就来进行讨论。

守护进程:

守护进程是一个在后台运行并且不受任何终端控制的进程。Unix操作系统有很多典型的守护进程(其数目根据需要或20—50不等),它们在后台运行,执行不同的管理任务。
Linux的大多数服务器就是用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd。这些系统
服 务进程没有控制终端,不能直接和用户交互。其它进程都是在用户登录或运行程序时创建,在运行结束或用户注销时终止,但系统服务进程不受用户登录注销的影响,它们⼀一直在运行着。这种进程有一个名称叫守护进程(Daemon)。

如何创建守护进程

这里写图片描述

实现方法:

#include <unistd.h>   
#include <signal.h>   
#include <fcntl.h>  
#include <sys/syslog.h>  
#include <sys/param.h>   
#include <sys/types.h>   
#include <sys/stat.h>   
#include <stdio.h>  
#include <stdlib.h>  
#include <time.h>  

int init_daemon(void)  
{   
    int pid;   
    int i;  

    // 1)屏蔽一些控制终端操作的信号  
    signal(SIGTTOU,SIG_IGN);   
    signal(SIGTTIN,SIG_IGN);   
    signal(SIGTSTP,SIG_IGN);   
    signal(SIGHUP ,SIG_IGN);  

    // 2)在后台运行  
    if( pid=fork() ){ // 父进程  
        exit(0); //结束父进程,子进程继续  
    }else if(pid< 0){ // 出错  
        perror("fork");  
        exit(EXIT_FAILURE);  
    }  

    // 3)脱离控制终端、登录会话和进程组  
    setsid();    

    // 4)禁止进程重新打开控制终端  
    if( pid=fork() ){ // 父进程  
        exit(0);      // 结束第一子进程,第二子进程继续(第二子进程不再是会话组长)   
    }else if(pid< 0){ // 出错  
        perror("fork");  
        exit(EXIT_FAILURE);  
    }    

    // 5)关闭打开的文件描述符  
    // NOFILE 为 <sys/param.h> 的宏定义  
    // NOFILE 为文件描述符最大个数,不同系统有不同限制  
    for(i=0; i< NOFILE; ++i){  
        close(i);  
    }  

    // 6)改变当前工作目录  
    chdir("/tmp");   

    // 7)重设文件创建掩模  
    umask(0);    

    // 8)处理 SIGCHLD 信号  
    signal(SIGCHLD,SIG_IGN);  

    return 0;   
}   

int main(int argc, char *argv[])   
{  
    init_daemon();  

    while(1);  

    return 0;  
}  

为什么创建守护进程时有人fork两次?

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

分类:

按照服务类型分为如下几个。
1.系统守护进程:syslogd、login、crond、at等。
2.网络守护进程:sendmail、httpd、xinetd、等。
3.独立启动的守护进程:httpd、named、xinetd等。
4.被动守护进程(由xinetd启动):telnet、finger、ktalk等

版权声明:本文为sinat_36101354原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sinat_36101354/article/details/74997117