所以我在 C 上写了这段代码。我创建了一个父亲,它有两个子进程,其中一个变成了僵尸进程。一秒钟后它退出了,正在等他的父亲结束了。另一个子进程保持孤立状态,然后结束。我的问题是,如果我更改waitfor会发生什么waitpid。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main() {
pid_t pid;
int status, value;
pid = fork();
if (pid > 0) { // Father
pid = fork();
if (pid > 0) { // Father
wait(&status);
value = WEXITSTATUS(status);
if (value == 2)
printf("Child 2");
else if (value == 3)
printf("Child 1");
} else if (pid == 0) { //Child 2 - Orphan
sleep(4);
exit(2);
} else {
exit(1);
}
} else if (pid == 0) { // Child 1 - Zombie
sleep(1);
exit(3);
} else {
printf("Error al ejecutar el fork");
exit(1);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
引用wait/waitpid,
提供 waitpid() 函数有以下三个原因:
支持作业控制
允许 wait() 函数的非阻塞版本
允许库例程(例如 system() 或 pclose())等待其子级,而不干扰进程尚未等待的其他已终止子级
和
如果 pid 参数为 (pid_t)-1 并且 options 参数为 0,则 waitpid() 函数应等效于 wait()。否则,其行为应由 pid 和 options 参数的值修改。
因此 waitpid() 的行为取决于它的参数。