父进程如何等待所有子进程终止

时间:2018-05-07 04:43:19

标签: c

我是C的新手,所以我只知道简单的函数。(例如:wait(NULL))。

这是我的主要问题:

  

修改程序,以便只有父进程创建3个子进程,每个进程创建一个子进程   新创建的进程调用函数CPU()。另外,让父进程等待   每个孩子的终止。

我知道这是正确答案

#include<stdio.h>

int main(void)
{
    int i ;

    for( i = 0; i < 3; i++)
    {
        int ret = fork();
        if(ret == 0){
            printf("My process ID is %d\n", getpid());
            return 0;
        }

    }

    for (i = 0; i < 3; i++) //Line B
        wait(NULL);
}

但我的问题是

  1. 为什么下面的代码在循环中的父级执行等待时出错

    #include <stdio.h>
    
    int main(void)
    {
        int i ;
    
        for( i = 0; i < 3; i++)
        {
            int ret = fork();
    
            if(ret == 0) {
                printf("My process ID is %d\n", getpid());
                return 0;
            }
            else
                wait(NULL);
        }
    }
    
  2. 在第一个代码中为什么我们在for循环中写wait(NULL)? 我们不能在没有for循环的情况下编写它

  3. 如果没有&#34;则返回0&#34;在子进程中,是否应将for循环更改为

    for (i = 0; i <7; i++)
        wait(NULL);
    
  4. 我不知道如何撰写CPU函数

1 个答案:

答案 0 :(得分:6)

  1. 此代码不会并行执行子进程 ,而是按顺序执行每个进程。差异不显示直到子进程执行除打印一条消息和退出之外的事情(您可以添加sleep(1))。

  2. wait函数将等待一个子进程的终止(以先到者为准)。如果您有3个子进程,则必须至少成功调用wait 3次以确保其中每个进程已终止。也许更容易致电wait,直到它将errno设置为ECHILD,这意味着没有孩子离开:

    while (1) {
        errno = 0;
        if (wait(NULL) == -1) {
            if (errno != ECHILD) {
                perror("Unexpected error from wait");
            }
            break;
        }       
    }
    
  3. 每个父流程都应该等待自己的孩子or set the SIGCHLD disposition to SIG_IGN)。不要计算wait的数量,而是使用上面的代码

  4. 这意味着:&#34;通过名称CPU&#34;来调用一个函数,即

    void CPU(void) {
    }
    

    在子进程中。

  5. 顺便说一下,你的代码缺少几个函数的必要标题 -

    #include <sys/types.h>
    #include <sys/wait.h>
    

    代表wait

    #include <unistd.h>
    

    用于fork,另外#include <errno.h>用于添加errno

相关问题