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

一、什么是守护进程

在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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值