0

我编辑了一点:

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);
                    };
    }
}

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

谢谢

4

1 回答 1

3

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

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

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

于 2013-08-31T11:00:28.877 回答