C++ 守护进程

阅读(6418)

创建守护进程步骤

  • 创建子进程,父进程退出
  • 在子进程中创建新会话
  • 改变当前目录为根目录
  • 重设文件权限掩码
  • 关闭文件描述符
  • 守护进程退出处理

父进程退出后,子进程调用setsid()。它完成了daemon函数想要做的大部分事情。调用完整个函数。子进程成为会话组长(sid==pid),也是进程组组长(pgid == pid),并且脱离了原来控制终端。但是,仍然可以对原来的终端进行读写,如果想彻底使得进程脱离终端,即让stdin,stdout,stderr失效,则可以再次利用原来进程创建第三个进程,然后终止第二个进程。此时,不会再对原来的终端有读写能力。

附代码

void Damon()
{
    pid_t pid;

    if ((pid = fork()) != 0)
    {
        exit(0);
    }

    setsid();

    signal(SIGINT, SIG_IGN);
    signal(SIGHUP, SIG_IGN);
    signal(SIGQUIT, SIG_IGN);
    signal(SIGPIPE, SIG_IGN);
    signal(SIGTTOU, SIG_IGN);
    signal(SIGTTIN, SIG_IGN);
    signal(SIGCHLD, SIG_IGN);
    signal(SIGTERM, SIG_IGN);

        //第二次fork
    if ((pid = fork()) != 0)
    {
        exit(0);
    }

    chdir("/");
    umask(0);
}

Tags: