Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
两个孩子都是C语言,你是如何阅读《管子》的?_C_Linux_Multiprocessing_Pipe - Fatal编程技术网

两个孩子都是C语言,你是如何阅读《管子》的?

两个孩子都是C语言,你是如何阅读《管子》的?,c,linux,multiprocessing,pipe,C,Linux,Multiprocessing,Pipe,每当我试图运行程序时,只有第二个孩子可以从管道中读取数据,而第一个孩子永远不会。所以我试着对第二个孩子的管道阅读进行评论,但是第一个孩子仍然无法阅读父母写入的管道 为什么第一个孩子不能从管子里读东西 谢谢你的帮助 顺序不对。你的代码是 int main() { int pipefd[2]; char buf; int pid, pid1; pid = fork(); if (pipe(pipefd) == -1) { perror(&q

每当我试图运行程序时,只有第二个孩子可以从管道中读取数据,而第一个孩子永远不会。所以我试着对第二个孩子的管道阅读进行评论,但是第一个孩子仍然无法阅读父母写入的管道

为什么第一个孩子不能从管子里读东西


谢谢你的帮助

顺序不对。你的代码是

int main()
{
    int pipefd[2];
    char buf;

    int pid, pid1;
    pid = fork();

    if (pipe(pipefd) == -1) {
        perror("pipe");
        exit(EXIT_FAILURE);
    }

    if(pid == 0){                    // CHILD 1
        close(pipefd[1]);

        while(read(pipefd[0],&buf,1) > 0){                       // THIS DOESNT WORK
            printf("FIRST CHILD WRITES: %s\n",&buf);             // THIS DOESNT WORK
        }                                                        // THIS DOESNT WORK
        close(pipefd[0]);
        _exit(EXIT_SUCCESS);

    }else{
        pid1 = fork();

        if(pid1 == 0){                     // CHILD 2
            close(pipefd[1]);

            // while(read(pipefd[0],&buf,1) > 0){                 // ONLY THIS (WOULD) WORK
            //     printf("SECOND CHILD WRITES: %s\n",&buf);      // ONLY THIS (WOULD) WORK
            // }                                                  // ONLY THIS (WOULD) WORK

            close(pipefd[0]);
            _exit(EXIT_SUCCESS);

        }else{                               // PARENT
            close(pipefd[0]);
            char* s = "Write To Pipe";
            write(pipefd[1],s,strlen(s));
            close(pipefd[1]);

            wait(NULL);            // WAIT FOR CHILD TO TERMINATE
            wait(NULL);            // WAIT FOR CHILD TO TERMINATE
        }
    }

    return 0;
}

您需要在分叉之前创建管道。如果您检查
关闭
和/或
读取
上的错误,您可能会发现此类错误顺序错误。你的代码是

int main()
{
    int pipefd[2];
    char buf;

    int pid, pid1;
    pid = fork();

    if (pipe(pipefd) == -1) {
        perror("pipe");
        exit(EXIT_FAILURE);
    }

    if(pid == 0){                    // CHILD 1
        close(pipefd[1]);

        while(read(pipefd[0],&buf,1) > 0){                       // THIS DOESNT WORK
            printf("FIRST CHILD WRITES: %s\n",&buf);             // THIS DOESNT WORK
        }                                                        // THIS DOESNT WORK
        close(pipefd[0]);
        _exit(EXIT_SUCCESS);

    }else{
        pid1 = fork();

        if(pid1 == 0){                     // CHILD 2
            close(pipefd[1]);

            // while(read(pipefd[0],&buf,1) > 0){                 // ONLY THIS (WOULD) WORK
            //     printf("SECOND CHILD WRITES: %s\n",&buf);      // ONLY THIS (WOULD) WORK
            // }                                                  // ONLY THIS (WOULD) WORK

            close(pipefd[0]);
            _exit(EXIT_SUCCESS);

        }else{                               // PARENT
            close(pipefd[0]);
            char* s = "Write To Pipe";
            write(pipefd[1],s,strlen(s));
            close(pipefd[1]);

            wait(NULL);            // WAIT FOR CHILD TO TERMINATE
            wait(NULL);            // WAIT FOR CHILD TO TERMINATE
        }
    }

    return 0;
}

您需要在分叉之前创建管道。如果您在
关闭
和/或
读取
上检查错误,您可能会发现这种类型的错误。我看不出您从哪里调用
管道()
来首先创建管道?在我看来,
pipefd
只是未初始化。这是你的真实代码吗?如果你想把代码缩减到a,那很好,但要强调“可复制”:确保剩下的代码仍然可以编译(没有警告!)、运行并演示不需要的行为。写入管道中的每个字节都可以准确读取一次。@NateEldredge woops是的,我纠正了这一点!另一个问题是不能使用
charbuf;printf(“%s”,&buf)
打印一个字符,因为它不是以null结尾的字符串。改为使用
printf(“%c”,buf)
。您在
fork
之后调用
pipe
。我看不出您从哪里调用
pipe()
来创建管道?在我看来,
pipefd
只是未初始化。这是你的真实代码吗?如果你想把代码缩减到a,那很好,但要强调“可复制”:确保剩下的代码仍然可以编译(没有警告!)、运行并演示不需要的行为。写入管道中的每个字节都可以准确读取一次。@NateEldredge woops是的,我纠正了这一点!另一个问题是不能使用
charbuf;printf(“%s”,&buf)
打印一个字符,因为它不是以null结尾的字符串。改为使用
printf(“%c”,buf)
。您在
fork
之后调用
pipe
。但这说明了为什么始终检查错误是最好的做法,即使在您知道可以工作的函数上也是如此。不,在close()上注意到故障时不会捕获此特定错误。但是检查是一个好主意,因为这将捕获文件描述符无效的错误。但这说明了为什么始终检查错误是最佳做法,即使在您知道可以工作的函数上也是如此。不,如果在close()上注意到故障,则不会捕获此特定错误。但是检查是一个好主意,因为这将捕获文件描述符无效的错误。