/* 使用pipe完成 ps aux | grep bash
************************************************************************/
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char* argv[]){
if(argc<2){
printf("./a.out bash");
exit(1);
}
//创建管道
int fd[2];
int ret = pipe(fd);
int i =0;
if(ret == -1){
perror("pipe error");
exit(1);
}
// pid_t Apid [2]; 此数组可以存储子进程pid,不过在此程序中使用 i的值来判断进程。
//创建子进程
for(i = 0;i<2;++i){
pid_t pid = fork();
if(pid == -1){
perror("fork error");
exit(1);
}else if(pid == 0){
break;
}else{
Apid[i]=pid;
}
}
//if(getpid() == Apid[1]){
if(i == 0){
//child grep bush r
close(fd[1]);
//将标准输入重定向到管道的读端
dup2(fd[0],STDIN_FILENO);
execlp("grep","grep","--color=auto",argv[1],NULL);
perror("execlp error");
}
if(i==1){
//child ps aux w
close(fd[0]);
//将标准输出重定向到管道的写端
dup2(fd[1],STDOUT_FILENO);
execlp("ps","ps","a","u","x",NULL);
//只有execlp失败才会往下执行
perror("execlp error");
}
if(i==2){
close(fd[0]);
close(fd[1]);
// sleep(3);
do{
ret = waitpid(-1,NULL,WNOHANG);
}while(ret != -1);
}
return 0;
}