linux 父子进程管道通信

一 上一节补充

匿名管道

为什么读写端是 分别 3 4

在这里插入图片描述

读写端会接到 3的后面  所以 为 3 4
因为都是属于标准库的 

二 父子进程管道通信

在这里插入图片描述

在这里插入图片描述

注意 读写中进行一个时 另外一个关闭 
左右两个都为进程 

1 这里是先管道 有数据 后 才创建父子进程 ???

先做一个实验

先 调用 fork 函数 
后 pipe函数 

#include<stdio.h>
#include<unistd.h>
#include<stdib.h>
#include<sys/types.h>

int main()
{
      int arr[2];
      
      pid_t aa;
      
      pid_t ff;
      
      aa=frok();//先创建父子进程 
   
      ff=pipe(arr);//后创建 管道
            
      if(ff==-1)
      {
       printf("pipe is error\n");
       return -2;
      }
      if(aa>0)
      { 
         
          printf("father pid is%d\n",getpid());
      
      }
      else if(aa==0)
      {
       printf("father pid is%d ppid is %d\n",getpid(),getppid());
      }
      
      
      printf("fd[0]===%d\n",arr[0]);
      printf("fd[1]===%d\n",arr[1]);
      

     return 0;
}


在这里插入图片描述

结果不输出 

得到一个结论

1 是先创建管道才创建父子进程的    
用这个方法不能进行父子通信 
怎么解决 
2 要 重定向(dup2函数) 才行 
重定向就是换个名字 
也就是父进程 换成变成管道 就行了 
改变输入位置 

在这里插入图片描述

2 ps aux | grep “bash”

ps aux | grep “bash” 分解 可为下列含义
1 ps aux :父进程 
2 grep “bash”:子进程 
3 | 管道 

按照重定向意思

 1 把父进程 换成 管道 (换了名字)
2 子进制读取数据 

中间会用到execlp函数

execlp函数  适用于有固定的命令参数和命令名字 
(不是用户创建的,是内核本身存在的指令数据)
比如  ls -l  
再比如 ps aux | grep “bash”

在这里插入图片描述
直接上代码

#include<stdio.h>
#include<unistd.h>
#include<stdib.h>
#include<sys/types.h>

int main()
{
      int arr[2];
      
      pid_t aa;
      
      pid_t ff;
      

       ff=pipe(arr);
       
        aa=frok();
        
        
      if(ff==-1)
      {
       printf("pipe is error\n");
       return -2;
      }
      if(aa>0)
      { 
            close(arr[0]);//关闭读
          
           dup2(arr[1],STDOUT_FILENO);
          
          execlp("ps","ps","aux",NULL);//父进制执行的多余指令
         
          printf("father pid is%d\n",getpid());
      
      }
      else if(aa==0)
      {
            close(arr[1]);//关闭写
           dup2(arr[0],STDIN_FILENO);
           
          execlp("grep","grep","bash",NULL);//子进制执行的多余指令
         
          printf("father pid is%d ppid is %d\n",getpid(),getppid());
      }  
      printf("fd[0]===%d\n",arr[0]);
      printf("fd[1]===%d\n",arr[1]);
     
     return 0;
}

这里的bash的内容是子进程的  也是父进程写进去,
因为父进程  是从main开始执行 
所以编译只能看到父进程写的 内容
(ps aux )

在这里插入图片描述

ps aux | grep “bash”
子进程读取管道数据 

在这里插入图片描述

 因为前面管道写入了 grep bash
 而 grep只是一个命令名字  那么数据就是 bash  
 所以子进程读取的就是管道写的数据 bash 
  • 0
    点赞
  • 5
    收藏
  • 打赏
    打赏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页
评论

打赏作者

无为则无所不为

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值