匿名管道----实例

ps -ef | grep pipe

ps -ef:将所有进程信息写入到标准输出
grep pipe:不断循环从标准输入读取数据进行字符串匹配过滤
shell进程中创建两个进程,一个进程运行ps,一个进程运行grep
要将ps进程的数据,交给grep进程只能通过进程间通信完成—匿名管道

流程:

  1. 创建管道
  2. 创建两个进程(不同进程,程序中体现为2个子进程,子进程通过父进程获得句柄),在各自进程中进行程序替换
  3. 在程序替换之前,ps进程应该标准输出重定向到管道写入端,grep进程应该标准输入重定向到管道读取端
  4. 父进程等待子进程退出
 #include<stdio.h>  //printf                                                         
 #include<unistd.h>  //fork
 #include<stdlib.h> //exit
 #include<sys/wait.h>  //wait
 
 int main(int argc,char* argv[])  //程序运行参数个数   程序运行字符串首地址
 {
     //1.创建管道
     //2.创建两个进程,在各自进程进行程序替换
     //3.在程序替换之前,ps进程应该标准输出重定向到管道写入端,grep进程应该标准输入重
 定向到管道读端
     //4.父进程等待子进程退出
 
     //1.创建管道
     int pipefd[2];  //创建读写接口
     int ret=pipe(pipefd);  //创建管道
     if(ret<0){
       perror("pipe error\n");
       return -1;
     }
 
     //2.创建进程
     if(fork()==0){   //子进程
         dup2(pipefd[1],1); //重定向,标准输入写到写端
         execlp("ps","ps","-ef",NULL);  //函数替换 execlp("文件名","首字符","第二个参
 数",NULL);
         exit(-1);  //退出子进程
     }
     
     if(fork()==0){  //子进程
        close(pipefd[1]); //关闭所有写端,管道读取完毕,返回0,这样grep才可以读取到终
 端数据
        dup2(pipefd[0],0);  //标准输入重定向到读端
        execlp("grep","grep","pipe",NULL);
        exit(-1);
     }
 
     //4.父进程等待子进程退出
     close(pipefd[0]);  //关闭父进程读端
     close(pipefd[1]);  //关闭父进程写端
     wait(NULL);       //子进程写端等待
     wait(NULL);       //子进程读端等待
     return 0;
 }   

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值