【问题标题】:Multiple Fork example in CC 中的多个 Fork 示例
【发布时间】:2011-10-01 21:37:15
【问题描述】:

我正在尝试创建一个使用多个分叉的程序。
我用这个例子让自己开始 Multiple fork() Concurrency

它按原样完美运行。但是,当我尝试在孩子中添加这样的打印语句时:

 if ((p = fork()) == 0) {
          // Child process: do your work here
        printf("child %i\n", ii);
          exit(0);
       }

这个过程永远不会结束。我怎样才能在孩子中做一些事情并让父母仍然完成程序的执行?

【问题讨论】:

  • 您的流程会发生什么变化?你看到任何输出了吗?
  • 你需要展示更多你拥有的代码;问题不在于您向我们展示的内容。目前尚不清楚ii 的设置是什么。您可能需要考虑使用 getpid() 来打印进程 ID。 (例如,我可以想象在父进程中不增加 ii 的方式。)
  • 不要给孩子打电话exit。使用_exit。否则,子进程可能会刷新和清理父进程仍在使用的资源。例如,这可以更改父级正在使用的文件描述符的当前位置,这可能会导致数据损坏。

标签: c concurrency fork


【解决方案1】:

在您的示例代码中

if (waitpid(childPids[ii], NULL, WNOHANG) == 0) {

应该是

if (waitpid(childPids[ii], NULL, WNOHANG) == childPids[ii]) {

因为

waitpid():成功时,返回状态发生变化的子进程ID;出错时,返回 -1;如果指定了 WNOHANG 并且 pid 指定的子项尚未更改状态,则返回 0。

参考:http://linux.die.net/man/2/waitpid

【讨论】:

    猜你喜欢
    • 2019-10-07
    • 2012-11-16
    • 2017-09-05
    • 2018-12-29
    • 2020-04-01
    • 2012-09-20
    • 1970-01-01
    • 2013-02-22
    • 2016-09-16
    相关资源
    最近更新 更多