在进程通信中管道作为标准输入/标准输出。
Posted
技术标签:
【中文标题】在进程通信中管道作为标准输入/标准输出。【英文标题】:Pipes as stdin/stdout in process communication. 【发布时间】:2013-05-05 23:50:48 【问题描述】:我正在学习管道,但遇到了问题。我希望我的程序作为:grep [word to find] [file to search] | grep -i [without word] | wc -l
它编译并且没有错误地工作,但它没有输出(至少没有像我想要的那样在标准输出上)。奇怪的是,当我尝试在最后一个 fork 中 printf sth 时,它正在 stdin 上打印它。我没有在这个分叉或父进程中更改标准输出,所以对我来说似乎很奇怪。我正在尝试关闭未使用的管道并刷新标准输出(它仍然在这里做某事吗?),但可能还有更多事情要做。
#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;
【问题讨论】:
【参考方案1】:我不确定为什么使用 execlp
而不是 execl
会有所帮助。可能execl
进程找不到我的文本文件。尽管我给了他通往它的道路。所以我猜execl
正在其他目录中工作。
【讨论】:
以上是关于在进程通信中管道作为标准输入/标准输出。的主要内容,如果未能解决你的问题,请参考以下文章