我有一个用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个请求时,它会停止。
我相信将程序作为守护程序运行的代码是正确的。 我担心的是我的实际代码。 我有什么规则可以遵循吗? 我应该避免的任何不良行为? 守护进程不允许的任何命令,比如命令行输出(我现在做了很多),等等?
答案 0 :(得分:0)
简单地关闭stdout
和stderr
会使对它们的所有写入都失败。我猜你的程序遇到这样的错误,检测到它并终止。标准技术是将/dev/null
和dup2(2)
打开到STDOUT_FILENO
,STDERR_FILENO
和STDIN_FILENO
。