#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
int fd[2];
pid_t childpid;
pipe(fd);
childpid=fork();
if (childpid == -1)
{
perror("Error forking...");
exit(1);
}
if (childpid) /*parent proces*/ //grep .c
{
wait(&childpid); //waits till the child send output to pipe
close(fd[1]);
close(0); //stdin closed
dup2(fd[0],0);
execlp(argv[2],argv[2],argv[3],NULL);
}
if (childpid==0) //ls
{
close(fd[0]); /*Closes read side of pipe*/
close(1); //STDOUT closed
dup2(fd[1],1);
execl(argv[1],NULL);
}
return 0;
}
如果我将命令行参数命名为“ls grep .c”,我应该显示所有“.c”文件。
伪代码: - 我的孩子流程将运行“ls”&amp;父进程将运行“grep .c”.. 父进程等待子进程完成,以便子进程写入管道。
试运行: -
bash-3.1$ ls | grep .c
1.c
hello.c
bash-3.1$ ./a.out ls grep .c
bash-3.1$
为什么会这样?
答案 0 :(得分:8)
一个简单的错误:您的execl
电话实际上应该是execlp
。此外,您可以删除wait
和close
语句。然后,您应该检查execlp
的错误代码。
答案 1 :(得分:1)
还有一件事,close(0)
和close(1)
是不必要的,dup2()函数会自动为您执行此操作。
答案 2 :(得分:1)
请参阅以下问题中的答案,了解实施管道的代码。