我编辑了一下:
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);
};
}
}
我的问题:我遇到了很多孩子,就像孩子产卵的炸弹一样。我怎么能阻止那些孩子?休息应该阻止它吗?
由于
答案 0 :(得分:2)
因此,当您fork
进程时,新进程是父进程的相同副本,因此当您的子进程从if ((pid = fork()) == 0) ...
继续时,它将继续进入for循环并创建更多的孩子。
孩子在完成时应该使用exit(0)
(或者至少不要继续fork
- 循环 - 例如,你可以使用break;
退出循环。最后,子进程但应该exit
。
在OTHER方面,如果您想在创建下一个fork
之前确保此子项已完成,则应使用waitpid()
或wait
的其他变体。当然,这些会等待分叉进程退出,所以如果分叉进程没有退出,那就不行了。但是,您需要制定一个策略来处理每个流程。如果您希望同时运行20个分叉进程,那么您可能需要将pid
存储在一个数组中,以便稍后跟踪这些进程。无论如何,您的主要流程应该跟踪并确保流程在完成之前完成。