为什么我要关闭:这个fork pipe c程序的文件描述符错误?

时间:2013-03-19 05:57:47

标签: c process fork pipe stdin

int main(int argc, char ** argv) {
    int count = 2;


    int pid, status;
    int fd[count][2];
    int i;

    for (i = 0; i < count; i++) {
        if (pipe(fd[i]) != 0) {
            perror("pipe");
            exit(1);
        }
        pid = fork();
        if (pid < 0) {
            perror("fork");
            exit(1);
        } else if (pid == 0) {
            if (close(fd[i][1]) != 0) {
                perror("close");
                exit(1);
            } 
            int j;
            for (j = 0; j < i; j++ ) {
                close(fd[j][1]);
            }
            char w[MAXWORD];
        int result;
            result = read(fd[i][0], w, MAXWORD);
        w[result-1] = '\0';
            printf("child %s\n" w);
            if (result == -1) {
                perror("read");
                exit(1);
            }
            exit(0);
        } else {
            if (close(fd[i][0]) != 0) {
                perror("close");
                exit(1);
            }
        }
    }
    while (1) {
        char word[MAXWORD]; int c;
        c = read(STDIN_FILENO, word, MAXWORD);
        if (c == 0) {
                break;
        }
        word[c-1] = '\0';
        for (i = 0; i < count; i++ ) {
                write(fd[i][1], word, strlen(word)+1);
        }


        for (i = 0; i < count; i++ ) {
                if (close(fd[i][1]) != 0) {
                perror("close");
                exit(1);
                }
        }

        for (i = 0; i < count; i++) {
                wait(&status);
        }
    }
    return 0;
}

我的代码在循环中读取用户输入的单词,直到控制+ d被击中。该单词被发送到两个子进程的管道。他们俩都打印出这个词。如果我取出while(1)语句,那么它可以正常工作。问题是,当我保持while 1循环时第二次输入单词时出现此错误:

$ query
hello
child hello
child hello
hello
close: Bad file descriptor

我真的需要帮助,因为我真的无法理解为什么会这样做。谢谢。

1 个答案:

答案 0 :(得分:3)

一些问题

1)每个孩子只读一次,回声,然后退出,但你的while循环似乎想要给每个孩子发送多个单词(这不是导致问题的原因)

2)在主while循环中,您读取该单词,将其写入每个子项,然后关闭您写入的文件描述符。第二次通过循环所有描述符都关闭,因此关闭调用失败。写入调用也失败了,但是因为你没有检查返回值,所以你没有意识到它。