gpt4 book ai didi

c - C 中的 fork 和 waitpid

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:56:07 25 4
gpt4 key购买 nike

我有这段代码,也许我遗漏了什么:

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 个进程并等待所有进程终止。但有时程序会被子僵尸进程阻塞。我哪里错了?

最佳答案

使用:

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

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

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

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

要改变这种行为,家长可以使用:

waitpid(-1, NULL, 0);

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

The value of pid can be:

< -1

meaning wait for any child process whose process group ID is equal to the absolute value of pid.

-1

meaning wait for any child process.

0

meaning wait for any child process whose process group ID is equal to that of the calling process.

> 0

meaning wait for the child whose process ID is equal to the value of pid.

或者,您可以使用:

wait(NULL);

waitpid(-1, NULL, 0)相同.

关于c - C 中的 fork 和 waitpid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41211732/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com