管道作为stdin / stdout进程通信。

我正在学习管道而且我遇到了问题。 我希望我的程序能够像:
grep [word to find] [file to search] | grep -i [without word] | wc -l grep [word to find] [file to search] | grep -i [without word] | wc -l它编译并且没有错误地工作,但它没有输出(至少不在stdout上,因为我希望它做)。 奇怪的是,当我尝试在最后一个分叉中打印它时,它会在stdin上打印出来。 我没有改变这个叉子或parrent过程中的标准输出因此对我来说似乎很奇怪。 我正在尝试关闭未使用的管道并刷新stdout(它还在做什么吗?),但可能还有更多要做的事情。

 #include #include #include void help() { printf( "Usage of the program:\n" "\t./alagrep [fileToSearch] [wordToFind] [wordToExpel]\n"); } int main(int argc, char *argv[]) { if(argc != 4) { help(); exit(EXIT_FAILURE); } int fd[2]; if(pipe(fd) != 0) { printf("Error while opening a pipe.\n"); exit(EXIT_FAILURE); } pid_t pid; if((pid = fork()) == -1) { printf("Error while forking.\n"); exit(EXIT_FAILURE); } else if(pid == 0) { close(fd[0]); if(dup2(fd[1],STDOUT_FILENO) < 0) { printf("Cannot duplicate stdout.\n"); _exit(EXIT_FAILURE); } close(fd[1]); execl("/bin/grep","grep",argv[2],argv[1],NULL); fflush(stdout); } close(fd[1]); int fd1[2]; if(pipe(fd1) != 0) { printf("Error while opening a pipe.\n"); exit(EXIT_FAILURE); } if((pid = fork()) == -1) { printf("Error while forking.\n"); exit(EXIT_FAILURE); } else if(pid == 0) { close(fd1[0]); if(dup2(fd[0],STDIN_FILENO) < 0) { printf("Cannot duplicate stdin.\n"); _exit(EXIT_FAILURE); } if(dup2(fd1[1],STDOUT_FILENO) < 0) { printf("Cannot duplicate stdout.\n"); _exit(EXIT_FAILURE); } close(fd[0]); close(fd1[1]); execl("/bin/grep","grep","-i",argv[3],NULL); fflush(stdout); } close(fd[0]); close(fd1[1]); if((pid = fork()) == -1) { printf("Error while forking.\n"); exit(EXIT_FAILURE); } else if(pid == 0) { close(fd1[1]); if(dup2(fd1[0],STDIN_FILENO) < 0) { printf("Cannot duplicate stdin.\n"); _exit(EXIT_FAILURE); } close(fd1[0]); execl("/bin/wc","wc","-l",NULL); fflush(stdout); } close(fd1[0]); return 0; } 

我不确定为什么使用execlp代替execl帮助。 可能与execl进程无法找到我的文本文件。 Althoug我给了他一条路。 所以我猜execl正在其他目录中工作。