【问题标题】:Problems fork() don't executes processes问题 fork() 不执行进程
【发布时间】:2014-06-17 16:44:52
【问题描述】:

我编写了一个进入无限循环的代码,对三相电表进行定期检查。为了以 json 格式将数据发送到服务器,我使用了一个编写的临时交易程序来获取数据并将它们发送到服务器。问题是这种机制可以工作几个小时。在此时间之后,fork 停止调用用于发送数据的程序,然后程序继续运行。

您认为可能是什么问题?

提前感谢您的回复

附:下面是用于 fork() 的代码

int pid = fork();

if ( pid == 0 ) {

    execlp("./json_send","./json_send",0);

} else {
    printf( "\nParent process: %d", pid );
}

【问题讨论】:

  • 除了缺少对所涉及的系统调用的错误检查之外,C 代码看起来还不错。但是,我们不知道json_send 的外观。

标签: c fork


【解决方案1】:

仔细阅读 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) 进行日志记录。您可能需要使用poll(2) 等编写event loop(参见this answer)...

另外,使用gcc -Wall -g 编译您的程序,使用gdb 调试器,或许还可以使用strace

【讨论】:

    【解决方案2】:

    我发现了问题。当我在没有等待的情况下调用 fork() 时,fork 会创建许多僵尸进程。解决方案是“双叉()”。我在这个网站上找到了解决方案:

    http://thinkiii.blogspot.it/2009/12/double-fork-to-avoid-zombie-process.html

    【讨论】:

      猜你喜欢
      • 2015-04-28
      • 1970-01-01
      • 2019-02-22
      • 1970-01-01
      • 2010-12-12
      • 1970-01-01
      • 2020-11-24
      • 2011-06-27
      • 2014-01-21
      相关资源
      最近更新 更多