问题fork()不执行进程

时间:2014-05-01 07:26:13

标签: c fork

我写了一个进入无限循环的代码,对三相电表进行定期检查。为了以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 );
}

2 个答案:

答案 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