daemon

守护进程是一个很重要的概念,但本质上就是一个去除所有可知的依赖以保持独立的进程,说的再多不如动手来一遍。

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

void create_daemon_by_self(void)
{
    pid_t pid_t1;
    int ret = -1;
    long fd_max = -1;

    pid_t1 = fork();    //fork一个新进程
    if(pid_t1 < 0)
    {
        perror("fork");
        exit(0);
    }
    if(pid_t1 > 0)
    {
        printf("end parent process.\n");    //结束父进程
        exit(0);
    }
    pid_t1 = setsid();    //设置新的会话
    if(pid_t1 < 0)
    {
        perror("setsid");
        exit(0);
    }
    ret = chdir("/");     //设置工作目录
    if(ret < 0)
    {
        perror("chdir");
        exit(0);
    }
    umask(0);             //设置最大的文件操作权限
    fd_max = sysconf(_SC_OPEN_MAX);      //关闭所有的文件操作,一般关闭0,1,2就行了
    for(int i = 0; i < fd_max; i++)
    {
        close(i);
    }
    open("/dev/null", O_RDWR);          //把标准输入输出标准错误绑定到一个空设备
    dup(0);
    dup(0);
}

void create_daemon_by_daemon(void)
{
    int ret = -1;
    printf("Hi, create_daemon_by_daemon.\n");
    ret = daemon(0, 0);    //使用daemon接口创建守护进程,简单很多!!!!
    if (ret != 0)
        exit(0);
}

void do_something(void)
{
    openlog("hello", LOG_PID | LOG_CONS, LOG_USER);
    int count = 10;
    while(count--)
    {
        sleep(1);
        syslog(LOG_INFO, "hello world=%d", count);
    }
    closelog();
}

void do_exit(void)
{
    printf("Hi, I'm exit.\n");
}

int main(int argc, char const *argv[])
{
    atexit(do_exit);
    // create_daemon_by_self();
    create_daemon_by_daemon();
    do_something();
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值