【发布时间】:2016-12-18 18:54:29
【问题描述】:
我有这段代码,也许我遗漏了什么:
const int NPROCESSES = 32;
pid_t pids[128];
for (int i = 0; i < NPROCESSES;i ++) {
pids[i] = fork();
if (!pids[i]) {
/*... other code ...*/
exit(0);
}
}
for (int i = 0; i < NPROCESSES; i++)
waitpid(pids[i], 0, 0);
程序应启动 32 个进程并等待所有进程终止。但有时程序会被子僵尸进程阻塞。 我哪里错了?
【问题讨论】:
-
一种可能性是您不能创建多达 32 个进程。你不会错误检查
waitpid()——你应该。请注意,如果fork()失败,则记录的“pid”为-1,当您执行waitpid(-1, 0, 0)时,您将等待任何退出的孩子,这意味着其中一个不会有尸体您计划等待的其他 pid。但是,waitpid()不会在您请求已收集的 pid 的状态信息时阻止,因此这不是一个完整的诊断。但是,您应该有更多的诊断打印,并且应该狂热地检查系统调用。