如何在Linux上守护c / c ++程序

时间:2016-09-11 14:24:47

标签: c++ linux daemon

我根据[http://linux.die.net/man/1/daemonize][1]的指南在Linux上编写了一个守护程序,但是这个过程崩溃了几次,我找不到原因。它困扰了我几天。

今天我碰巧阅读了UNIX网络编程 第1卷,第3版'作者:W.Richard Stevens。在本书中,它显示了编写守护程序的示例。看完这个例子后,我意识到“从控制终端解除关联”。我的代码中缺少。

现在我的问题是守护一个过程,为什么我们需要与控制终端脱离关系?它是否与流程崩溃有关?我的daemonize代码中是否还缺少其他地方?

欣赏您的重播。

这是我的代码:

bool daemonize()
{
    // http://linux.die.net/man/1/daemonize

    // change working dir to root
    (void) uchdir("/");

    // close stdin, stderr, stdout
    if (int fdnull = open("/dev/null", O_RDWR))
    {   
        dup2 (fdnull, STDIN_FILENO);
        dup2 (fdnull, STDOUT_FILENO);
        dup2 (fdnull, STDERR_FILENO);
        close(fdnull);
    }   
    else
    {   
        Log (ERR, "Failed to open /dev/null");
        return false;
    }   

    // detach from previous process group
    if (setsid () == -1)      /* request a new session (job control) */
    {   
        Log (ERR, "Failed to detach from previous process group");
        return false;
    }   

    // inhibit others completely and group write
    umask(027);

    // it's dameonized!
    return true;
}

3 个答案:

答案 0 :(得分:4)

在这个问题中已经提到了对C或C ++程序进行deamonize的基本步骤:Creating a daemon in Linux

是的,问题出现在C而不是C ++,但是由于系统调用你需要守护程序,在这两种情况下都是C函数,这确实没有什么区别。

答案 1 :(得分:1)

我发现此github存储库很有用,它具有构建守护程序所需的内容:

Simple example of daemon for Linux

这是一个堆栈溢出线程,为什么double分支是必需的。

答案 2 :(得分:0)

不解决您的实际问题,但......

  

我根据[http://linux.die.net/man/1/daemonize][1]

指南在Linux上编写了一个守护程序

请不要!

daemon - ize的程序是任何合理的init系统和服务跟踪器的祸根。问题是,在程序从其控制终端和父进程分离之后,很难跟踪其状态并重新控制它。使用PID文件的常用方法很容易出现竞争条件,如果打算自动重新生成这样的进程,这种情况尤其糟糕。

daemon的使用导致了几个黑客的发展,一些直接丑陋某种没关系,但没有一个是美丽的。做你自己和世界其他地方的帮助,不要贬低你的计划。