ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

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

2022-01-28 00:02:58  阅读:163  来源: 互联网

标签:ps char argc int 通信 pipe 进程 include


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

}

标签:ps,char,argc,int,通信,pipe,进程,include
来源: https://blog.csdn.net/weixin_48328037/article/details/122725326

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有