linux开发之deamon的写法

什么是demon,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;
        }
    }

    

猜你喜欢

转载自my.oschina.net/u/1013544/blog/1790131