从多个管道读取的正确方法是什么?

时间:2014-09-24 09:19:16

标签: c fork pipe

所以在我的程序中,用户给出了三个参数。然后,我把它管成三个孩子。

两个孩子都做自己的计算,然后退出。最后一个孩子显示结果。

父母等待所有孩子完成,然后它只是终止程序。

孩子们做什么的总结:

inputs are a, b, c.
child0: c0 = a*b
child1: c1 = b*c
overview: printf("%d %d", c0, c1);

我无法弄清楚如何正确打印概述。它不断打印出奇怪的损坏字符或盒子。

任何人对如何正确地做任何事都有任何建议?我读了一本书,但它只详细介绍了单个子母管。这涉及多个孩子,我想这就是我困惑的地方。谢谢你的帮助!

以下代码:

int main(int argc, char *argv[]) {
    int fd[4];
    int a, b, c, c0, c1, status;
    char char0[10];
    char char1[10];
    pid_t child0;
    pid_t child1;
    pid_t overview;

    // Set argv to ints
    a = atoi(argv[1]);
    b = atoi(argv[2]);
    c = atoi(argv[3]);

    // Pipe
    pipe(fd);

    // child0
    if((child0 = fork()) == 0) {
        close(fd[2]);
        c0 = a*b;
        sprintf(char0, "%d", c0);
        write(fd[0], char0, 10);
        close(fd[0]);
        exit(0);
    }

    // child1
    if((child1 = fork()) == 0) {
        close(fd[2]);
        c1 = b*c;
        sprintf(char1, "%d", c1);
        write(fd[1], char1, 10);
        close(fd[1]);
        exit(0);
    }

    // overview
    if((overview = fork()) == 0) {
        close(fd[0]);
        close(fd[1]);
        read(fd[2], char0, 10);
        read(fd[2], char1, 10);
        printf("%s %s", char0, char1); //Prints weird stuff??
        close(fd[2]);
        exit(0);
    }

    // Wait for children to finish
    waitpid(child0, &status, 0);
    waitpid(child1, &status, 0);
    waitpid(overview, &status, 0);
    exit(0);
}

1 个答案:

答案 0 :(得分:1)

您声明管道的代码完全错误,管道只有两个端点,并且要声明三个管道,您需要声明如下

pd1[2];
pd2[2];
pd3[2];

从一端你可以写出pd1[1];

从另一端您可以阅读pd1[0];

所以你的代码看起来像,

int main(int argc, char *argv[]) {
    int fd1[2];
    int fd2[2];
    int fd1[2];        
    int a, b, c, c0, c1, status;
    char char0[10];
    char char1[10];
    pid_t child0;
    pid_t child1;
    pid_t overview;

    // Set argv to ints
    a = atoi(argv[1]);
    b = atoi(argv[2]);
    c = atoi(argv[3]);

    // Pipe
    pipe(fd1);
    pipe(fd2);
    pipe(fd3);
    // child0
    if((child0 = fork()) == 0) {
        close(fd1[0]);
        c0 = a*b;
        sprintf(char0, "%d", c0);
        write(fd1[1], char0, 10);
        close(fd[1]);
        exit(0);
    }

    // child1
    if((child1 = fork()) == 0) {
        close(fd2[0]);
        c1 = b*c;
        sprintf(char1, "%d", c1);
        write(fd2[1], char1, 10);
        close(fd2[1]);
        exit(0);
    }

    // overview
    if((overview = fork()) == 0) {
        close(fd1[1]);
        close(fd2[1]);
        read(fd1[0], char0, 10);
        read(fd2[0], char1, 10);
        printf("%s %s", char0, char1); //Prints weird stuff??
        //close(fd[2]);
        exit(0);
    }

    // Wait for children to finish
    waitpid(child0, &status, 0);
    waitpid(child1, &status, 0);
    waitpid(overview, &status, 0);
    exit(0);
}

这段代码可能也不正确我刚刚解释了如何使用管道,看到管道的打开和关闭,也就是说,应该关闭写入读取结束,同时应该关闭阅读结束。

修改

看到这篇文章并执行小程序,然后逐步修改你的代码,你将会理解。

How to send a simple string between two programs using pipes?