linux开发之deamon的写法

什么是deamon,deamon既一个运行中后台的服务进程,不需要用户输入也不控制输出,固定的或者周期性的提供一些服务,linux系统中的一些服务例如httpd,log系统等都是系统等deamon,那该如何创建自己的deamon呢?创建deamon应该注意哪些呢?创建一个deamon都必备哪些步骤呢?

首先要先fork一个进程,为避免挂起终端,所以需要fork一个进程并且结束父进程。使程序后台执行

其次设置会话ID,setid()使进程成为组长进程

再次fork(),由于设置了一个新的会话,里面现在有一个组长进程,组长进程仍然可以控制终端,为了让程序彻底摆脱终端控制,所以需要再fork一个进程。

关闭所有文件描述符:创建的进程会继承父进程的文件描述符,如果不关闭的话会产生一些异常的问题,

将标准输入输出,错误输出定位到/dev/null中,如果不做这一部的话可能会导致打开的第一个文件描述符从0开始而导致程序的错误

fd = open(“/dev/null”, O_RDWR);

    if (fd == -1) {

        printf(“open(\”/dev/null\”) failed\n”);

    }

    if (dup2(fd, STDIN_FILENO) == -1) {

        printf(“dup2(STDIN) failed\n”);

    }

    if (dup2(fd, STDOUT_FILENO) == -1) {

        printf(“dup2(STDOUT) failed\n”);

    }

    if (dup2(fd, STDERR_FILENO) == -1) {

        printf(“dup2(STDERR) failed\n”);

    }

    if (fd > STDERR_FILENO) {

        if (close(fd) == -1) {

            printf(“close() failed\n”);

            return;

        }

    }

其他的步骤可以重新设置掩码:umask(0);

下面是一个创建的例子:

int fd;

 int pid;

 int i;

 pid=fork();

   if(pid != 0)

        exit(1);

    setsid();

 pid=fork();

    if(pid != 0)

        exit(0);

    chdir(“/”);

    umask(0);

    long maxfd;

    if ((maxfd = sysconf(_SC_OPEN_MAX)) != -1)

    {

        for (fd = 0; fd < maxfd; fd++)

        {

            close(fd);

        }

    }

    fd = open(“/dev/null”, O_RDWR);

    if (fd == -1) {

        printf(“open(\”/dev/null\”) failed\n”);

    }

    if (dup2(fd, STDIN_FILENO) == -1) {

        printf(“dup2(STDIN) failed\n”);

    }

    if (dup2(fd, STDOUT_FILENO) == -1) {

        printf(“dup2(STDOUT) failed\n”);

    }

    if (dup2(fd, STDERR_FILENO) == -1) {

        printf(“dup2(STDERR) failed\n”);

    }

    if (fd > STDERR_FILENO) {

        if (close(fd) == -1) {

            printf(“close() failed\n”);

            return;

        }

    }

    原文作者:先女木恬
    原文地址: https://www.jianshu.com/p/01c0c94c7cc6
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞