【问题标题】:fork(), problems with multiple childrenfork(),多个孩子的问题
【发布时间】:2013-08-31 10:32:04
【问题描述】:

我编辑了一点:

for ( ii = 0; ii < nbEnfants; ++ii) {
    switch (fork()){
        case -1 : {
                    printf("\n\nSoucis avec fork() !!! \n\n");
                    exit(0);
                    };

        case 0 : {
                    EEcrireMp(ii);
                    }break;
        default : {
                    tabPidEnfants[ii] = p;
                    usleep(50000);
                    ELireMp(nbSect, nbEnfants,tabPidEnfants);
                    };
    }
}

我的问题:我得到了很多孩子,就像一个产卵的孩子的炸弹。我怎样才能阻止那些孩子?休息不应该停止吗?

谢谢

【问题讨论】:

  • 如果从EEcrireMp(ii);返回,您希望孩子做什么?顺便说一句:你的“印象”是正确的。
  • EEcrireMp(ii) :它写入 shared_memory 然后我在 sem_value 中使用标志 +1:IPC_NOWAIT;但我不做 exit() 因为孩子需要仍在运行,直到父母 Read 由 ELireMP() 完成,然后
  • 对不起,但我想问“您希望孩子从调用 EEcrireMp() 后做什么”; “...仍在运行...”在做什么什么
  • 当“EEcrireMp()”完成时,我只希望父母做第二个孩子,而这个孩子做的事情与第一个孩子做的事情一样,直到第 20 个孩子。 20 日之后,我希望 ELireMP 中的功能完成 :)
  • 还是没有告诉我们孩子们从EEcrireMp()回来后应该做什么。从这一事实中,人们可能会认为他们应该什么都不做。那么为什么不让他们exit()呢?

标签: c fork parent semaphore


【解决方案1】:

因此,当您fork 一个进程时,新进程是父进程的相同副本,因此当您的子进程从if ((pid = fork()) == 0) ... 继续时,它将继续进入 for 循环并创建更多子进程。

子进程完成后应该使用exit(0)(或者至少不要继续fork-loop - 例如,您可以使用break; 退出循环。最终,子进程应该exit

在 OTHER 方面,如果您想在创建下一个 fork 之前确保这个孩子已经完成,您应该使用 waitpid()wait 的其他一些变体。当然,这些会等待分叉的进程退出,所以如果分叉的进程没有退出,那是行不通的。但是您需要制定一个策略来处理每个流程。如果您想同时运行 20 个分叉进程,那么您可能需要将 pid 存储在一个数组中,以便稍后跟踪这些进程。一种或另一种方式,您的主要流程应该跟踪并确保流程在其完成之前完成。

【讨论】:

  • 如果我做“break;”,它会杀死孩子吗?事实上,我需要 20 个孩子同时奔跑,当他们在那里做某事时,我想把他们都杀了。
  • 这取决于for循环之后的代码做什么。使用 break 本身不会杀死子进程。它会执行 for 循环之后发生的任何事情......
  • 这可能是像if (p == 0) ... 这样的东西,然后会在子案例中做一些有意义的事情。
  • 所以如果放 break 而不是 exi();它会用 exit() 做一些小事,但孩子还活着吗?所以我会让我的 20 个孩子跑步 // ?
  • 好的,你把“break”放在哪里了? ?在函数 EEcrireMP() 中还是在调用这个函数之后?您是否还使用“free()”函数来杀死孩子,或者还有另一个?谢谢:)
猜你喜欢
  • 2018-08-10
  • 1970-01-01
  • 2019-03-25
  • 1970-01-01
  • 1970-01-01
  • 2016-07-11
  • 1970-01-01
  • 2021-04-28
  • 2010-12-12
相关资源
最近更新 更多