【问题标题】:fork and waitpid in CC中的fork和waitpid
【发布时间】: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 的状态信息时阻止,因此这不是一个完整的诊断。但是,您应该有更多的诊断打印,并且应该狂热地检查系统调用。

标签: c linux fork waitpid


【解决方案1】:

使用:

waitpid(pids[i], 0, 0);

您指定父级获取其子级的确切顺序:它将与创建它们的顺序相同。

因此,如果其中一个子节点因任何原因阻塞或延迟,并且稍后创建的其他子节点已经完成(并称为exit()),则后者将保持僵尸状态,直到父节点先收割以前的孩子。

因此,例如,如果在循环的第一次迭代中创建的进程需要 1 分钟才能完成,而其余 31 个进程在 1 秒内完成,则您可以观察到 31 个僵尸进程等待其父进程收割,谁(父母)将等待首先获得一个延迟的进程。

要改变这种行为,父母可以使用:

waitpid(-1, NULL, 0);

相反。 waitpid() 的第一个参数中等于 -1 的值意味着它将获取任何子进程,引用自 man 2 waitpid:

pid的值可以是:

&lt; -1

意思是等待任何进程组ID等于的子进程 pid的绝对值。

-1

意思是等待任何子进程。

0

意思是等待任何进程组ID等于的子进程 调用进程的。

&gt; 0

意思是等待进程ID等于值的子进程 pid。

或者,您可以使用:

wait(NULL);

与waitpid(-1, NULL, 0)相同。

【讨论】:

    猜你喜欢
    • 2012-11-09
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多