【发布时间】:2013-03-19 05:57:47
【问题描述】:
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;
}
我的代码循环读取用户输入的单词,直到按下 control+d。该词被发送到两个子进程的管道。他们都打印了这个词。如果我取出 while (1) 语句,那么它工作正常。问题是当我保持 while 1 循环时第二次输入单词时出现此错误:
$ query
hello
child hello
child hello
hello
close: Bad file descriptor
我真的需要帮助,因为我真的不知道为什么会这样。谢谢。
【问题讨论】:
-
Bad File descriptor 的可能重复项
-
我认为这不适用于我。我在 for 循环中传递 i 的两个值。
-
这样的问题很多。也许一些细节发生了变化,但它们对我来说似乎都是重复的。我刚刚投了票。我们会看看我是否正确。
-
这不是 'Bad file descriptor' 的重复...它是松散相关的,但不是重复的。