我写了一个进入无限循环的代码,对三相电表进行定期检查。为了以json格式向服务器发送数据,我使用一个程序编写ad-hoc协议来获取数据并将它们发送到服务器。问题是这种机制可以工作几个小时。在这段时间之后,fork停止调用用于发送数据的程序并且程序继续。
在您看来可能是什么问题?
提前感谢您的回复
P.S。在fork()
的代码下面int pid = fork();
if ( pid == 0 ) {
execlp("./json_send","./json_send",0);
} else {
printf( "\nParent process: %d", pid );
}
答案 0 :(得分:3)
请仔细阅读 fork(2)手册页。 fork
- 和execve
以及大多数其他系统调用可能(有时会失败)(例如,由于限制:请参阅setrlimit(2) ...)。所以代码至少:
fflush(NULL);
pid = fork();
if ( pid == 0 ) {
execlp("./json_send","./json_send",NULL);
perror("execlp json_send");
} else if (pid>0) {
printf( "\nParent process: %d\n", pid );
}
else { /* fork failed */
perror("fork");
exit(EXIT_FAILURE);
}
顺便说一句,你应该总是等待(例如waitpid(2) ...)child processes,以避免zombie processes。
请阅读Advanced Linux Programming,其中有几章专门讨论相关主题。
顺便说一句,如果json_send
是你的小程序,我会考虑在你的分叉程序中加入它的功能(和它的一些代码)。我还会考虑使用syslog(3)进行日志记录。您可能需要使用event loop等对this answer(请参阅poll(2))进行编码...
另外,使用gcc -Wall -g
编译您的程序,使用gdb
调试器,也可以使用strace
答案 1 :(得分:0)
我发现了问题。当我在没有等待的情况下调用fork()时,fork会创建许多僵尸进程。解决方案是" double fork()"。我在这个网站找到了解决方案:
http://thinkiii.blogspot.it/2009/12/double-fork-to-avoid-zombie-process.html