【发布时间】:2020-08-02 23:08:53
【问题描述】:
我试图了解使用 WNOHANG 的 waitpid() 如何以及确实会清理它应该等待的孩子的资源?
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main() {
printf("Hello from start\n");
int pid;
if((pid = fork()) == 0){
printf("Hello from child: %d\n", getpid());
printf("My parent PID is: %d\n", getppid());
}else if(pid > 0){
printf("Hello from parent: %d\n", getpid());
int status;
waitpid(pid, &status, WNOHANG);
}else{
perror("ERROR");
}
printf("Outside if statement, pid is: %d\n", getpid());
}
父 PID 子进程的输出是:1 表示父进程终止,子进程被僵尸传递给 init 进程。
根据我在 man 描述中对 WNOHANG 的理解,它应该返回子进程在测试时是否终止,并让父进程继续。然而,我认为如果父母即将在其孩子之前终止,它会等待孩子“清理它”。由此看来,父母只是继续前进并终止而没有清理。
我缺少什么,以及如何让父级继续其工作,但在不等待子级先终止的情况下不让它终止?
谢谢!
【问题讨论】:
-
"如果父节点在其子节点之前终止,它将等待子节点“清理它”"。不,那不是真的。没有自动等待。 Parent 需要显式调用
wait函数之一来获取孩子。WNOHANG不会改变这一点 - 这并不意味着如果孩子此时尚未终止,请稍后再检查。 -
我明白了。我的意思是更关注 WNOHANG 示例,其中父调用 waitpid(),然后继续运行,然后才到达终点。在那种情况下,因为我们已经调用了 waitpid()(但是使用 WNOHANG),父母会等待孩子还是我们需要额外的等待?
-
需要额外等待。
-
这是一种常见的方式。这取决于您的应用程序行为需要是什么。例如,如果不在后台运行命令,shell 可能会立即等待,然后在等待返回后继续。
-
OT: about:
printf("Outside if statement, pid is: %d\n", getpid())父子进程和错误路径都会执行这条语句,所以这条语句在fork()失败时执行一次,其他情况执行两次
标签: c fork parent-child