进程通信中的管道标准输入/标准输出。
问题描述:
我在学习管道,并且出现了问题。我想我的程序工作如下:grep [word to find] [file to search] | grep -i [without word] | wc -l
它编译和工作没有错误,但它没有输出(至少不是我想要它做的stdout)。奇怪的是,当我尝试在最后一个fork中打印它时,它在stdin上打印它。我不改变这个叉或在parrent过程中的标准输出,所以它对我来说似乎很奇怪。我试图关闭未使用的管道并刷新标准输出(这是否仍然在这里?),但是可能还有更多的事情要做。进程通信中的管道标准输入/标准输出。
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
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
帮助BU也不太清楚。可能与execl
进程无法找到我的文本文件。 Althoug我给了他路径。所以我猜execl
正在其他目录中工作。