我根据 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 许可协议
我发现这个 github 存储库很有用,它具有构建守护进程所需的内容:
Linux 守护进程的简单示例
这是一个堆栈溢出线程,为什么 双 叉是必要的。