我根据[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;
}
答案 0 :(得分:4)
在这个问题中已经提到了对C或C ++程序进行deamonize的基本步骤:Creating a daemon in Linux
是的,问题出现在C而不是C ++,但是由于系统调用你需要守护程序,在这两种情况下都是C函数,这确实没有什么区别。
答案 1 :(得分:1)
答案 2 :(得分:0)
不解决您的实际问题,但......
指南在Linux上编写了一个守护程序
请不要!
daemon
- ize的程序是任何合理的init系统和服务跟踪器的祸根。问题是,在程序从其控制终端和父进程分离之后,很难跟踪其状态并重新控制它。使用PID文件的常用方法很容易出现竞争条件,如果打算自动重新生成这样的进程,这种情况尤其糟糕。
daemon
的使用导致了几个黑客的发展,一些直接丑陋某种没关系,但没有一个是美丽的。做你自己和世界其他地方的帮助,不要贬低你的计划。