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