将进程设置为守护进程

  在正常条件下,我们将程序运行产生的信息打印到控制台实时显示,如果我们想讲一个程序以守护进程的方式进行运行,就需要改变信息的输出方向,将其导向到配置文件里设置的日志文件。

  将一个进程转换为守护进程需要进行几个步骤:

  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。

posted on 2017-05-14 23:09  残余的光  阅读(1616)  评论(0编辑  收藏  举报

导航