【问题标题】:How parent process wait all child processes terminate [closed]父进程如何等待所有子进程终止[关闭]
【发布时间】:2018-05-07 04:43:18
【问题描述】:

我是 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. 如果子进程中没有“return 0”,是否应该将for循环改为

    for (i = 0; i <7; i++)
        wait(NULL);
    
  4. CPU函数不知道怎么写

【问题讨论】:

  • 这不是一个 C 问题,因为在 C11 标准 n1570 中没有提到 wait。它可以是POSIX 问题、Unix 问题或 Linux 问题。所以编辑你的问题来改进它并给出一些minimal reproducible example。顺便说一句,StackOverflow 不是 一个做我的家庭作业的网站。阅读ALP 或与 Unix、Linux 或 POSIX 编程相关的新内容。另请阅读fork(2)
  • ...当然要阅读wait(2)
  • 最后,编译所有警告和调试信息:gcc -Wall -Wextra -gGCCuse the gdb debugger 以了解程序的行为
  • @BasileStarynkevitch 我不认为这是直截了当的“做我的作业问题”,但更像是一些问题,直到你写了一个有意义的 子进程。
  • 我提供了几个链接来帮助 OP

标签: c


【解决方案1】:
  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)。不要计算waits的数量,而是使用上面的代码

  4. 这意味着只是:“调用名称为CPU的函数”,即

    void CPU(void) {
    }
    

    在子进程中。


顺便说一句,您的代码缺少几个函数的必要标头 -

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

对于wait

#include <unistd.h>

fork 和另外#include &lt;errno.h&gt; 我的errno 添加。

【讨论】:

    猜你喜欢
    • 2021-11-07
    • 2023-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    相关资源
    最近更新 更多