在C中使用管道

时间:2014-05-16 14:19:14

标签: c pipe

我编写了以下代码,以帮助我理解管道如何在C中工作。

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

struct sum_ {
    int a;
    int b;
};

int main (void) {
    int pipe1[2];
    int pid;
    struct sum_ sum;

    if ( (pipe(pipe1) != 0)){
        printf("pipe(): %d %s\n", errno, strerror(errno));
        exit(1);
    }

    pid = fork();
    if (pid == -1) {
        printf("fork(): %d %s\n", errno, strerror(errno));
        exit(1);
    }
    else if (pid == 0) { // Child
        close(pipe1[0]);

        sleep(5);
        sum.a = read(pipe1[0], &sum.a, sizeof(sum.a));

        printf("Your number was: %d", sum.a);
    }
    else { // Father
        close(pipe1[1]);

        printf("\nWrite a number: \n");
        char a[4];
        sum.a = atoi(fgets(a, 4, stdin));

        write(pipe1[1], &sum.a, sizeof(sum.a));
    }

    return 0;
}

代码有一个父子进程。这很简单,父亲使用管道向儿子发送号码,儿子显示用户的号码。 结果总是得到-1。我做错了什么?

1 个答案:

答案 0 :(得分:2)

 close(pipe1[0]);

 sleep(5);
 sum.a = read(pipe1[0], &sum.a, sizeof(sum.a));

关闭文件描述符pipe1[0],然后从中读取(因此返回-1)。你也在父亲身上犯了同样的错误。我想你的意思是在这里关闭pipep1[0]和在父亲

中关闭pipe1[1]

此外,当您修复此问题时,虽然您通过传递地址读取sum.a,但您也可以从返回值设置它,这将覆盖您阅读的内容。