我根据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/