Linux系统编程之创建守护进程(daemon)

时间:2021-11-18 14:46:41

一、什么是守护进程

在Linux中,系统引导时会开启很多服务,这些服务就叫做守护进程。

二、守护进程的特点

守护进程脱离于终端,是运行在后台的进程。

三、守护进程创建步骤

  1. 创建子进程,父进程退出
//fork --> #include <unistd.h>
// --> pid_t fork(void);
// --> create a child process
pid_t pid = 0;
//创建子进程
pid = fork();
//如果创建失败,则报错,然后退出
if(pid < 0){
    perror("fork");
    exit(-1);
}
//如果创建成功,则退出父进程
if(pid > 0){
    exit(-1);
}
  1. 在子进程中创建新会话
//setsid  --> #include <unistd.h>
//        --> pid_t setsid(void);
//        --> creates a session and sets the process group ID
pid = setsid();
if(pid < 0){
    perror("setsid");
    exit(-1);
}
  1. 改变当前进程目录为根目录
//chdir  --> #include <unistd.h>
//       --> int chdir(const char *path);
//       --> change working directory
int cd = 0;
cd = chdir("/");
if(cd < 0){
    perror("chdir");
    exit(-1);
} 
  1. 重设文件权限掩码
//umask  --> #include <sys/types.h>
//       --> #include <sys/stat.h>
//       --> mode_t umask(mode_t mask);
//       --> set file mode creation mask
  1. 关闭文件描述符
//sysconf --> #include <unistd.h>
// --> long sysconf(int name);
// --> get configuration information at run time
//_SC_OPEN_MAX --> The maximum number of files that a process can have open at any time.
long filenum = 0;
//统计一个进程中最多包涵多少个文件
filenum = sysconf(_SC_OPEN_MAX);
for(long i = 0; i < filenum; i++){
    close(i);
}

四、实现例程

/* *学校:河北大学 *作者:来智慧 *时间:2016年8月16日 *函数功能:创建守护进程 */
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
    creat_demo();
    while(1)
    {
        printf("I'm running.\n");
        sleep(1);
    }
    return 0;
}
/*创建守护进程*/
void creat_demo(void)
{
    /*创建子进程,父进程退出*/
    pid_t pid = 0;
    if(pid < 0){
        perror("fork");
        exit(-1);
    }   
    if(pid > 0){
        exit(-1);
    }
    /*在子进程中创建新会话*/
    pid = setsid();
    if(pid < 0){
        perror("setsid");
        exit(-1);
    }
    /*改变当前目录为根目录*/
    int cd = 0;
    cd = chdir("/");
    if(cd < 0){
        perror("chdir");
        exit(-1);
    }
    /*重设文件权限掩码*/
    umask(0);
    /*关闭文件描述符*/
    long filenum = 0;
    filenum = sysconf(_SC_OPEN_MAX);
    for(long i = 0; i < filenum; i++){
        close(i);
    }
}

open("/dev/null", O_RDWR);
open("/dev/null", O_RDWR);
open("/dev/null", O_RDWR);