【发布时间】:2011-06-19 16:24:54
【问题描述】:
我正在开发一个 linux 守护程序,但在 stdin/stdout 上有一些问题。通常由于守护进程的性质,您没有任何标准输入或标准输出。但是,我的守护程序中确实有一个函数,该函数在守护程序第一次运行时调用,以指定守护程序成功运行所需的不同参数。当调用此函数时,终端变得如此缓慢,以至于我必须启动一个单独的 shell 并使用 top 杀死守护程序才能获得响应提示。现在我怀疑这与关闭 stdin/stdout 的分叉过程有关,但我不太确定如何解决这个问题。如果你们能对这种情况有所了解,那将不胜感激。谢谢。
编辑:
int main(argc, char *argv[]) {
/* setup signal handling */
/* check command line arguments */
pid_t pid, sid;
pid = fork();
if (pid < 0) {
exit(EXIT_FAILURE);
}
if(pid > 0){
exit(EXIT_SUCCESS);
}
sid = setsid();
if(sid < 0) {
exit(EXIT_FAILURE);
}
umask(027);
/* set syslogging */
/* do some logic to determine wether we are running the daemon for the first time and if we are call the one time function which uses fgets() to recieve some input */
while(1) {
/* do required work */
}
/* do some clean up procedures and exit */
return 0;
}
你们提到使用配置文件。这正是我存储通过输入接收的参数所做的。但是,我最初仍然需要通过标准输入从用户那里获取这些。判断我们是否是第一次运行的逻辑是基于配置文件的存在。
【问题讨论】:
-
我们不知道没有看到一些代码。但听起来你做错了。您是说您希望守护程序能够采用标准输入/标准输出吗?您必须将它们通过套接字或其他东西管道。
-
是的 Falmarri,但只有在调用该特定函数时,就像我说的那样,这是一次性的事情。在我的代码中,我在 fork(); 之后调用了这个函数;一个新的过程。
-
您的终端并不是很慢,您生成的子进程继承了相同的 fd 并窃取了您的输入(您现在有多个阅读器),结果未定义(竞争条件)。