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

标签 c++ linux daemon

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

今天刚好看了《UNIX网络编程》 W.Richard Stevens 的第 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;
}

最佳答案

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

是的,问题是针对 C 而不是针对 C++,但是由于在这两种情况下您需要守护程序的系统调用都是 C 函数,所以这真的没有什么区别。

关于c++ - 如何在 Linux 上守护一个 c/c++ 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39437059/

相关文章:

Linux 外壳,awk : Merge 2 Variable Data by Column

c - 在关闭 STDOUT_FILENO 的情况下执行系统函数时出错

c++ - std::map std::find 问题

Thrift 生成结构的 C++ 大括号初始化

c++ - “多重定义”错误

c++ - 是否可以继承默认的 IShellFolder 实现?

python - 使 xterm 窗口打开直到它被用户关闭

c++ - 从 uint16 boost dynamic_bitset 复制位

linux - 映射位于 ramdisk 上的 numpy 数组所带来的开销是多少?

javascript - 每 10 秒运行一次 node.js 脚本