【问题标题】:Why child process not getting exited before parent process calls wait() function?为什么子进程在父进程调用 wait() 函数之前没有退出?
【发布时间】:2021-04-26 22:19:25
【问题描述】:

我正在开发使用fork()wait() 调用的c 程序,首先我创建了五个子进程,然后我调用了wait() 五次。每当我执行程序时,它都会在第二个 for 循环中打印相同的子进程 ID,该循环从第一个 for 循环中显示。在调用 wait() 函数之前,子进程永远不会退出。为什么会这样?为什么cpid 总是打印之前显示的确切子进程ID?

代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main( )
{
    int child_pids[5];
    int i;
    printf("PARENT ID: %d \n", getpid());
    for(i=0;i<5;i++) {
        if(fork()==0) {
            printf("child(pid): %d of parent(pid): %d \n",getpid(),getppid());
            exit(0);
        }
    }
    for(i=0;i<5;i++) {
        int cpid=wait(NULL);
        printf("parent (pid): %d waited for child(pid): %d \n",getpid(),cpid);
    }
    return 0;
}

如果我的提问方式有任何错误,请在下方评论

【问题讨论】:

  • 为什么 cpid 总是打印之前显示的确切子进程 ID?”父进程等待它的子进程,即它创建的进程。您希望看到什么不同?
  • 既然wait(NULL)只有在创建五个子进程后才会被调用,为什么在wait()调用之前没有退出任何子进程?
  • 推荐阅读文档至wait()
  • wait 不会在父级中返回,直到子级退出。为什么你认为在wait 之前没有孩子退出?

标签: c linux unix fork wait


【解决方案1】:

在退出时,孩子会留下一个退出状态,应该返回给父母。所以,当孩子完成后,它就变成了僵尸。

每当孩子退出或停止时,都会向父母发送SIGCHLD 信号。 父母可以使用系统调用wait()waitpid()以及宏WIFEXITEDWEXITSTATUS来了解其停止的孩子的状态。

如果父进程退出,你可以看到你的子进程仍然是僵尸进程(未等待的子进程)。

wait() 只是告诉你哪个孩子退出了,这样你就可以得到退出代码。如果你有更多的孩子在跑步,那么当然,其他人也可能同时终止。

如果你不关心退出状态,那么wait() 就可以了,但是你仍然要等待所有你启动的孩子。

【讨论】:

    猜你喜欢
    • 2011-01-21
    • 1970-01-01
    • 2021-02-10
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多