利用pipe实现兄弟进程之间的通信

/*	使用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;

}

上一篇:opencv-cvFloor返回不大于参数的最大整数值


下一篇:Javaweb 十二