IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> linux 父子进程管道通信 -> 正文阅读

[系统运维]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;
      
      aa=frok();
       
       ff=pipe(arr);
        
        
        
      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 | grep “bash”
子进程读取管道数据 

在这里插入图片描述

 因为前面管道写入了 grep bash
 而 grep只是一个命令名字  那么数据就是 bash  
 所以子进程读取的就是管道写的数据 bash 
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-04-27 11:41:37  更:2022-04-27 11:44:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 19:56:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码