为什么这个fork-pipec程序会出现close:Bad文件描述符错误?

为什么这个fork-pipec程序会出现close:Bad文件描述符错误?,c,process,fork,pipe,stdin,C,Process,Fork,Pipe,Stdin,拜托,我真的需要帮助,因为我真的不明白它为什么要这样做。谢谢。两个问题 1) 每个子级只读取一次、回显,然后退出,但您的while循环似乎希望向每个子级发送多个单词(但这并不是问题的原因) 2) 在主while循环中,读取单词,将其写入每个子级,然后关闭写入的文件描述符。第二次通过循环时,所有描述符都已关闭,因此关闭调用失败。写入调用也失败了,但由于没有检查返回值,您没有意识到这一点。 1) 每个子级只读取一次、回显,然后退出,但您的while循环似乎希望向每个子级发送多个单词(但这并不是问题的

拜托,我真的需要帮助,因为我真的不明白它为什么要这样做。谢谢。

两个问题

1) 每个子级只读取一次、回显,然后退出,但您的while循环似乎希望向每个子级发送多个单词(但这并不是问题的原因)

2) 在主while循环中,读取单词,将其写入每个子级,然后关闭写入的文件描述符。第二次通过循环时,所有描述符都已关闭,因此关闭调用失败。写入调用也失败了,但由于没有检查返回值,您没有意识到这一点。

1) 每个子级只读取一次、回显,然后退出,但您的while循环似乎希望向每个子级发送多个单词(但这并不是问题的原因)


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

我认为这不适用于我。我在一个for循环中输入了两个I值。像这样的问题很多。也许有些细节会改变,但它们在我看来都是重复的。我刚刚投了一票。我们将看看我是否正确。这不是“坏文件描述符”的副本…它是松散相关的,但不是副本。可能的副本我认为这不适用于我。我在一个for循环中输入了两个I值。像这样的问题很多。也许有些细节会改变,但它们在我看来都是重复的。我刚刚投了一票。我们将看看我是否正确。这不是“坏文件描述符”的副本……它是松散相关的,但不是副本。因为1)你说每个孩子只读一次。我如何让它读多次?对于2)我是否将close语句放在while循环之外?与写入一样,读取必须在一个循环中(直到读取失败),这是有意义的。但是2)我不明白,因为如果我省略了close语句,当我输入第二个单词时,程序就会停止运行。有什么提示吗?将close和wait语句移到while循环之外。找出一些指示“输入不足”的方法以退出while循环(eof可以工作)。为了澄清,请将for循环和close和wait语句移到while循环之外。例如1)您说过每个孩子只读取一次。我如何让它读多次?对于2)我是否将close语句放在while循环之外?与写入一样,读取必须在一个循环中(直到读取失败),这是有意义的。但是2)我不明白,因为如果我省略了close语句,当我输入第二个单词时,程序就会停止运行。有什么提示吗?将close和wait语句移到while循环之外。找出一些指示“输入不足”的方法以退出while循环(eof可以工作)。为了澄清,请将for循环和close和wait语句移到while循环之外。
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;
}
$ query
hello
child hello
child hello
hello
close: Bad file descriptor