fork-execpipe道redirect问题

有谁能告诉我这个代码有什么问题吗?

总之,它创buildinput和输出pipe道和forkexecsort程序。 父节点读取字典/usr/share/dict/words并将其写入到dup2() 'd的pipe道中,同样从中读取输出,并将其打印到terminal(标准父母的输出)。 或者至less,这就是应该发生的事情。

回溯表示父母挂在第130行的read() (标记为“XXX”注释)。 就好像sort没有意识到文件结束,但是closurespipeIn的写入结束应该“发出”这个信号,对吗?

 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> int main(int argc, char** argv) { int pipeIn[2]; int pipeOut[2]; if ((pipe(pipeIn)) == -1) { perror("pipe"); exit(EXIT_FAILURE); } if ((pipe(pipeOut)) == -1) { perror("pipe"); exit(EXIT_FAILURE); } pid_t child = fork(); if (child == 0) { // This is child! if ((dup2(pipeIn[0], STDIN_FILENO)) == -1) { perror("dup2"); exit(EXIT_FAILURE); } if ((dup2(pipeOut[1], STDOUT_FILENO)) == -1) { perror("dup2"); exit(EXIT_FAILURE); } if ((dup2(pipeOut[1], STDERR_FILENO)) == -1) { perror("dup2"); exit(EXIT_FAILURE); } if ((close(pipeIn[0])) == -1) { perror("close"); exit(EXIT_FAILURE); } if ((close(pipeOut[1])) == -1) { perror("close"); exit(EXIT_FAILURE); } if ((execlp("sort", "-r", NULL)) == -1) { perror("execlp"); exit(EXIT_FAILURE); } } else if (child == -1) { perror("fork"); exit(EXIT_FAILURE); } else { // This is parent! if ((close(pipeIn[0])) == -1) { perror("close"); exit(EXIT_FAILURE); } if ((close(pipeOut[1])) == -1) { perror("close"); exit(EXIT_FAILURE); } int dict = open("/usr/share/dict/words", O_RDONLY); if (dict == -1) { perror("open"); exit(EXIT_FAILURE); } char buf[1024]; int count; while ((count = read(dict, buf, sizeof(char) * 1024)) > 0) { putchar('.'); if ((write(pipeIn[1], buf, count)) == -1) { perror("write 1"); exit(EXIT_FAILURE); } } if (count == -1) { perror("read"); exit(EXIT_FAILURE); } if ((close(dict)) == -1) { perror("close"); exit(EXIT_FAILURE); } if ((close(pipeIn[1])) == -1) { perror("close"); exit(EXIT_FAILURE); } while ((count = read(pipeOut[0], buf, sizeof(char) * 1024)) > 0) // XXX { putchar('!'); if ((write(STDOUT_FILENO, buf, count)) == -1) { perror("write 2"); exit(EXIT_FAILURE); } } if (count == -1) { perror("read"); exit(EXIT_FAILURE); } if ((close(pipeOut[0])) == -1) { perror("close"); exit(EXIT_FAILURE); } } return EXIT_SUCCESS; } 

感谢您的任何意见(赦免双关语)。

Solutions Collecting From Web of "fork-execpipe道redirect问题"

你的问题是你没有关闭智利进程中管道未使用的端点。 所以你需要在exec之前的某处添加下面的代码

  if ((close(pipeIn[1])) == -1) { perror("close"); exit(EXIT_FAILURE); } if ((close(pipeOut[0])) == -1) { perror("close"); exit(EXIT_FAILURE); }