在正常条件下,我们将程序运行产生的信息打印到控制台实时显示,如果我们想讲一个程序以守护进程的方式进行运行,就需要改变信息的输出方向,将其导向到配置文件里设置的日志文件。
将一个进程转换为守护进程需要进行几个步骤:
1.fork一个新的进程,将父进程退出。
2.将0、1、2三个文件描述符重定向。
3.将1重定向到日志文件。
void daemonize() { if(fork() != 0) //将父进程退出 exit(0); setsid(); //设置新的会话 LOG(LOG_LEVEL_INFO, "Daemonized ... pid = %d", (int)getpid()); int fd = 0; if((fd = open("/dev/null", O_RDWR, 0)) != -1) //打开空设备文件 { dup2(fd, STDIN_FILENO); //将0重定向到/dev/null dup2(fd, STDOUT_FILENO); //将1重定向到/dev/null dup2(fd, STDERR_FILENO); //将2重定向到/dev/null if(fd > STDERR_FILENO) close(fd); } if(g_conf->log_file != NULL && (fd = open(g_conf->log_file, O_RDWR|O_APPEND|O_CREAT, 0))!= -1) { dup2(fd, STDOUT_FILENO); // 将2重定向到日志文件 if(fd>STDERR_FILENO) close(fd); } }
其中dup2函数的作用是负复制文件描述符,将第一个参数中的文件描述符复制到第二个参数的文件描述符,即第二个文件描述符指向第一个文件描述符指向的文件,这意味着,这两个描述符共享同一个数据结构file结构体,这个file结构体的引用计数为2。
原文:http://www.cnblogs.com/canyudeguang/p/6854383.html