【问题标题】:C - Create 3 child processes with fork()C - 使用 fork() 创建 3 个子进程
【发布时间】:2016-05-10 10:06:31
【问题描述】:

我想用 fork() 创建正好 3 个子进程。这是我创建一个子进程的代码:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

void main(){
    int pid = fork();
    if(pid < 0){
        /* was not successfully */
    }
    else if (pid > 0){
        /* Parent process */
    }
    else{
        /* Child process */
        for (int i = 0; i < 20; i++){
            printf("1");
            usleep(1000);
        }
        exit(0);
    }
}

子进程应该打印 20 次数字 1 并在每次之后休眠 1 毫秒。

我知道我不能只使用 fork() 3 次,因为那样我会得到 7 个子进程。但是我怎样才能得到准确的 3 呢?我该怎么做,每个子进程都打印一个其他数字?例如第一个进程编号为 1,第二个进程编号为 2,第三个进程编号为 3。

并且父母应该使用 waitpid() 来等待所有 3 个孩子。如果他们完成了,父母应该打印一条消息。但是我如何在这里使用 waitpid?

【问题讨论】:

    标签: c process fork waitpid


    【解决方案1】:
    for (int kid = 0; kid < 3; ++kid) {
        int pid = fork();
        if(pid < 0){
            exit(EXIT_FAILURE);
        }
        else if (pid > 0){
            /* Parent process */
        }
        else{
            /* Child process */
            exit(EXIT_SUCCESS);
        }
    }
    
    for (int kid = 0; kid < 3; ++kid) {
        int status;
        pid_t pid = wait(&status); // kids could be ready in any order
    }
    

    【讨论】:

    • 谢谢 :) 但是当我想使用 waitpid() 而不是 wait() 时我必须改变什么?
    • @Nono:你可以,但我会说它没有任何优势。您只需将所有三个 PID 存储在一个数组中,这样您就可以单独等待每个 PID。
    【解决方案2】:

    你可以使用 fork 3 次,但你必须确保只从父进程调用 fork。

    最简单的方法是确保孩子永远不会逃脱其 {} 块。

    if((pid = fork())<0) /*handle error*/;
    if(pid == 0){
       //do child stuff
    
       exit(0); //the child must not escape this {} block
    }
    //do parent stuff
    

    waitpid(2) 很简单。

    【讨论】:

      猜你喜欢
      • 2021-07-09
      • 1970-01-01
      • 2014-07-20
      • 2012-06-10
      • 1970-01-01
      • 2017-04-18
      • 2023-03-22
      • 2014-07-27
      • 1970-01-01
      相关资源
      最近更新 更多