我正在处理一个
linux守护进程,并且与stdin / stdout有一些问题.通常由于一个守护进程的本质,你没有任何stdin或stdout.但是,我的守护程序中有一个函数,当守护程序第一次运行时,调用该函数来指定守护程序成功运行所需的不同参数.当这个函数被调用时,终端变得如此缓慢,我必须启动一个独立的shell,并用顶部杀死守护进程以获得响应提示.现在我怀疑这与关闭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; }
你们提到使用配置文件.这正是我通过输入来存储参数的方法.但是我最初还是需要通过stdin从用户那里获得这些.确定我们是否第一次运行的逻辑是基于配置文件的存在.
解决方法
You guys mention using a config file. This is is exactly what I do to store the parameters recieved via input. However I still initially need to get these from the user via the stdin. The logic for determining whether we are running for the first time is based off of the existence of the config file.
让用户自己写配置文件,而不是阅读stdin;检查它是否存在之前分叉,如果没有错误则退出.包含守护进程的示例配置文件,并在守护进程的联机帮助页中记录其格式.你有一个联机帮助页吗?你的配置文件是文本的,是的
此外,您的守护程序逻辑缺少关键步骤.在分配之后,但在调用setsid之前,需要关闭fds 0,1和2并重新打开/ dev / null(不要尝试使用fclose和fopen来执行此操作).这应该解决你的迟到的终端问题.