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

Zea*_*eal 1 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);
}
Run Code Online (Sandbox Code Playgroud)

但我的问题是

  1. 当循环中的父进程执行wait时,为什么下面的代码是错误的

    #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);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在第一个代码中为什么我们wait(NULL)在for循环中写入?没有for循环我们不能写它

  3. 如果子进程中没有"返回0",则应将for循环更改为

    for (i = 0; i <7; i++)
        wait(NULL);
    
    Run Code Online (Sandbox Code Playgroud)
  4. 我不知道怎么写这个CPU函数

Ant*_*ala 6

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

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

    while (1) {
        errno = 0;
        if (wait(NULL) == -1) {
            if (errno != ECHILD) {
                perror("Unexpected error from wait");
            }
            break;
        }       
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 每个父进程应该等待自己的子进程(或设置SIGCHLD处置SIG_IGN).不要计算waits 的数量,而是使用上面的代码

  4. 这意味着:"通过名称调用函数CPU",即

    void CPU(void) {
    }
    
    Run Code Online (Sandbox Code Playgroud)

    在孩子的过程中.


顺便说一下,你的代码缺少几个函数的必要头文件 -

#include <sys/types.h>
#include <sys/wait.h>
Run Code Online (Sandbox Code Playgroud)

对于wait,

#include <unistd.h>
Run Code Online (Sandbox Code Playgroud)

fork,另外#include <errno.h>我的errno加法.