linux 父子进程管道通信

本文探讨了在C语言中,是否应该先创建管道再启动父子进程。实验表明,先创建管道后fork()是关键。通过使用dup2()和execlp(),展示了如何实现父子进程间的管道通信,重点在于正确重定向输入和输出。
摘要由CSDN通过智能技术生成

一 上一节补充

匿名管道

为什么读写端是 分别 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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值