【问题标题】:Does WNOHANG clean child resourcesWNOHANG 是否清理子资源
【发布时间】: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


【解决方案1】:

然而,我认为如果父母即将在其孩子之前终止,它会等待孩子“清理它”。

事实并非如此。家长不会等的。终止的进程的子进程将重新成为进程 1 的父进程,并且在它们终止时将自动获得收割。

如何让父进程继续其工作,但不等待子进程先终止而让它终止?

work();

int status;
waitpid(pid, &status, 0);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 2011-09-12
    • 2010-09-16
    相关资源
    最近更新 更多