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

新手上路,请多包涵

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

今天我碰巧读了 W.Richard Stevens 的“UNIX 网络编程第 1 卷,第三版”。在本书中,它展示了一个编写守护程序的例子。阅读示例后,我意识到我的代码中缺少“与控制终端解除关联”。

现在我的问题是守护进程,为什么我们需要与控制终端解除关联?它与进程的崩溃有关吗?我的守护进程代码中是否缺少其他地方?

感谢您的回复。

这是我的代码:

 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;
}

原文由 cartman 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 563
1 个回答

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

Linux 守护进程的简单示例

这是一个堆栈溢出线程,为什么 叉是必要的。

原文由 Ako 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题