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