【问题标题】:C reading and writing with multiple child processes带有多个子进程的C读写
【发布时间】:2014-06-03 08:55:00
【问题描述】:

在 C 语言的父进程中,我运行 3 个子进程,每个子进程执行一个程序。

  • 程序 1 获取标准输入(用户输入)并将其打印到标准输出。
  • 程序 2 获取标准输入(应该来自程序 1),修改它并 打印到标准输出。
  • 程序 3 获取标准输入(应该来自程序 2),修改它并 打印到标准输出

我得到program3的输出,但是program 2的修改没有显示。

以下是父级的相关代码:

if((child1 = fork()) < 0){
    /*fatal*/
}
else if(child1 == 0){ //inside child 1
    dup2(pipe1[1], 1); //child 1 uses pipe1[1] for writing
    close(pipe1[0]);

    execl("program1.out", (char *)0);
}
else{
    if((child2 = fork()) <0){
        /*fatal*/
    }
    else if(child2 == 0){ //inside child 2
        close(pipe1[1]);
        dup2(pipe1[0], 0); //child2 uses pipe1[0] for reading
        dup2(pipe2[1], 1); //child2 uses pipe[1] for writing

        execl("program2.out", (char *)0);
    }
    else{
        if((child3 = fork()) <0){
            /*fatal*/
        }
        else if(child3 == 0){ //inside child 3
            close(pipe2[1]);
            close(pipe1[0]);

            execl("program3.out", (char *)0);
        }
        else{ //inside parent
            wait(NULL);
        }
    }   
}

程序使用 fgets 和 printf 进行读/写。

我检查了以前的问题,但我找不到我做错了什么。有什么想法吗?

【问题讨论】:

    标签: c fork pipe dup2


    【解决方案1】:

    Child3 需要做的事情:

    dup2(pipe2[0], 0); // child3 uses pipe2[0] for reading
    

    您还需要关闭每个孩子不使用的所有管道。所以 child1 需要:

    close(pipe2[0]);
    close(pipe2[1]);
    

    child2 需要:

    close(pipe2[0]);
    

    而 child3 需要:

    close(pipe1[0]);
    close(pipe1[1]);
    close(pipe2[1]);
    

    并且父级在分叉所有子级后需要关闭所有管道。

    所有这些关闭都是必需的,以便当管道中的前一个程序关闭管道时进程将读取EOF,因为在所有打开它的进程关闭它之前,管道并没有真正关闭。

    【讨论】:

    • 添加后似乎不起作用。还必须手动杀死program2.out(无法打开输出文件program2.out:文本文件忙)。
    • 您需要关闭所有子进程中所有未使用的管道。
    • Ahhh.. 非常感谢,它现在可以正常工作了 :) 顺便说一句,考虑到它还没有被欺骗,那么 child1->pipe2 是否有必要关闭?
    • 是的。无论是否被欺骗,您都需要关闭管道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多