【问题标题】:c++ daemon server stopsc++ 守护进程服务器停止
【发布时间】:2014-03-06 21:22:30
【问题描述】:

我有一个用 C++ 编写的服务器程序,用于管理用户浏览器和硬件设备之间的流量。该服务器在我的 centos 机器上运行。 当我正常运行程序时,它运行没有任何问题。

但是尝试将程序作为守护进程运行会带来一些问题。 这是我的守护进程代码:

pid_t pid, sid;

pid = fork();
if(pid < 0){
    exit(EXIT_FAILURE);
}

if(pid > 0) {
    exit(EXIT_SUCCESS);
}

umask(0);

sid = setsid();
if(sid < 0){
    exit(EXIT_FAILURE);
}

if((chdir("/")) < 0){
    exit(EXIT_FAILURE);
}

close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);

while(1){
   //my program here
}

程序启动正常,它的父进程是 init。 它可以运行几个小时,但是当我发出大约 10 到 15 个请求时,它就会停止。

我相信将我的程序作为守护程序运行的代码是正确的。 我担心的是我的实际代码。 有什么我必须遵守的规则吗? 我应该避免的任何不良行为? 守护程序不允许使用的任何命令,例如命令行输出(我现在做了很多)等?

【问题讨论】:

  • *.com/questions/3095566/linux-daemonize 我认为您必须关闭或重定向您的标准输出和标准错误,或者根本不写信给它们。或者使用 daemonize 或任何其他工具将您的“正常”程序作为守护程序运行。
  • 删除所有输出就可以了。现在一切正常。

标签: c++ linux centos daemon


【解决方案1】:

简单地关闭stdoutstderr 将使所有对它们的写入都失败。我猜你的程序遇到了这样的错误,检测到它并终止。标准技术是将/dev/nulldup2(2) 打开到STDOUT_FILENOSTDERR_FILENOSTDIN_FILENO

【讨论】: