匿名管道的使用示例

news/2024/12/29 3:04:11/

目录

整体框架

 通信步骤

创建管道

​编辑创建子进程&关闭相应的fd

​编辑 

 进程间通信

父子进程通信之间四种场景

 实现父亲读,孩子写的进程间通信

管道通信的使用场景样例实现


整体框架

 通信步骤

创建管道

 

 pipe的参数为输出型参数,返回读写端的fd存储到pipefd的数组中,创建成功,函数返回值为0;否则为-1。

 

创建子进程&关闭相应的fd

 

 

 

 进程间通信

 

父子进程通信之间四种场景

1. 如果读端读取完管道中的所有数据,如果写端没有发送新的数据,该读端的进程只能等待;

2.如果写端写满了管道,而读端没有来的及去读,此时的写端无法继续去写

 

 

 

65535=2^16==2^12 * 2^4 == 4KB*16 

3. 如果关闭了写端,读取完毕管道数据,在读,read就会返回0,表示读到了文件的末尾。

4. 写端一直在写,读端关闭,会发生什么呢?写端在写就没有任何意义了。OS不会维护无意义、低效率、或者浪费资源的事情!OS会杀死一直在写的进程!OS会通过信号来终止进程,13)SIPIPE。

 实现父亲读,孩子写的进程间通信

//C++函数头文件c取代.h为了更好的兼容C++
#include<iostream>
#include<cerrno>
#include<cstring>
#include<cassert>
#include<string>//系统调用函数的头文件为.h
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>int main()
{//让不同的进程看到同一个资源 步骤:1~3//任何一种进程通信中,一定要 先 保证不同进程之间看到同一份资源  步骤:4int pipefd[2]={0};//1.创建管道int ret=pipe(pipefd);if(ret<0){std::cout<<"pipe error:"<<errno<<":"<<strerror(errno)<<std::endl;return 1;}//验证管道是否创建成功std::cout<<"pipefd[0]:"<<pipefd[0]<<std::endl;//pipefd数组下标为0的表示读端std::cout<<"pipefd[1]:"<<pipefd[1]<<std::endl;//pipefd数组下标为1的表示写端//2.创建子进程pid_t id=fork();assert(id!=-1);if(id==0){//子进程//3.关闭不需要的fd,让父进程进行读取,让子进程去写入close(pipefd[0]);//4.开始通信 ——结合某种场景// const std::string nameStr="Hello ,我是子进程";// int cnt=1;// char buffer[1024]={0};int cnt=0;while(true){char x='X';write(pipefd[1],&x,1);std::cout << "Cnt: " << ++cnt<<std::endl;sleep(1);//break;// snprintf(buffer,sizeof(buffer),"%s,计数器:%d,我的pid:%d",nameStr.c_str(),cnt++,getpid());// write(pipefd[1],buffer,strlen(buffer));// sleep(10);}close(pipefd[1]);exit(0);}//父进程//3.关闭不需要的fd,让父进程进行读取,让子进程去写入close(pipefd[1]);//4.开始通信    ——结合某种场景char buffer[1024]={0};int cnt=0;while(true){//sleep(5);int n=read(pipefd[0],buffer,sizeof(buffer)-1);if(n>0){buffer[n]='\0';std::cout<<"我是父进程,child give me message:"<<buffer<<std::endl;}else if(n==0){std::cout<<"我是父进程,读到了文件末尾"<<std::endl;break;}else {std::cout<<"我是父进程,读取异常"<<std::endl;exit(1);}sleep(1);if(cnt++>5)break;}close(pipefd[0]);int status=0;waitpid(id,&status,0); std::cout<<"sig:"<<(status&0x7F)<<std::endl;return 0;
}

管道通信的使用场景样例实现

【应用场景】

父进程要创建若干个子进程,每一个子进程配对一个管道,用来进行与父进程之间的通信;父亲通过管道,对子进程发送信号,子进程接受到信号后,依据信号来执行相应的任务!

【问题分析】

  1. 如何动态创建多个子进程?答:循环控制!
  2. 如何建立一个管道匹配一个子进程?答:再循环里面定义临时变量pipefd[2],这样就可以确保每一个创建的子进程找到对应读写的fd!
  3. 由于子进程会复制父进程的所有管理对象里的内容,这样,第二个以及后面的子进程就可以得到前面子进程与父进程管道之间读写fd信息,如何确保创建的管道只对应一个子进程,不受其它子进程的影响?答:因为,父进程只能关闭读端,不能关闭写端,所以要在父进程中保存之前子进程创建管道的写端的fd,后面的创建的子进程就可以得到之前子进程的读端的fd,在依次关闭就可以了!
  4. 父进程如何知道给哪一个子进程来分配任务?答:为了管理多个管道和子进程与父亲的关系,方法是先描述,在组织--》描述:父亲要得到子进程的fd才能找到相应的子进程,还要得到该子进程所对应管道写端的文件描述符fd--》组织:定义EndPoint结构体存储子进程的id和文件描述符fd;在最后,每创建一个子进程,就将相应的信息存储到vector<EndPoint>容器中。
  5. 如何指定相对应的任务呢?答:定义task对象,里面保存要有的任务,对每一个任务进行编号处理。用户通过输入数字来指定相对应的任务!

【代码实现思路】

  1. 首先需要创建子进程,并创建对应的管道;
  2. 进程间通信,输入对应执行任务指令;
  3. 进程退出,回收进程。

 代码实现:lesson14/2. CtrlProcess · 杰编程/LinuxCode - 码云 - 开源中国 (gitee.com)


http://www.ppmy.cn/news/808928.html

相关文章

MMDetection学习笔记(四):核心组件分析

MMDetection学习笔记&#xff08;四&#xff09;&#xff1a;核心组件分析 核心组件分析RegistryHookHook的定义Hook的调用机制Hook的分类与用法 RunnerRunner 初始化注册 Hookresume 或者 load_checkpointrun 核心组件分析 此篇博客注重分析了MMDetection中三大核心组件&…

名悦集团分享秋季汽车保养指南,给你更好的用车体验

转眼中秋佳节已过&#xff0c;十月将至&#xff0c;秋意渐浓&#xff0c;除了给自己备齐秋装&#xff0c;汽车秋季保养也不能缺。夏季天气炎热&#xff0c;汽车磨损也比较厉害&#xff0c;秋季里我们要怎么做汽车养护呢。今天名悦集团老司机在线分享秋季汽车保养指南&#xff0…

图钉能按到墙上吗_像图钉一样把纸按在墙上的东西叫什么

展开全部 是蓝丁胶。 简介&#xff1a; 蓝丁胶系压敏型胶粘材料&#xff0c;经国际认证32313133353236313431303231363533e78988e69d8331333431346434&#xff0c;对儿童安全无害&#xff0c;无污染&#xff0c;清洁环保。广泛用于办公、家居&#xff0c;美化家居&#xff0c;免…

汽车里有味怎么治?

车内空气污染主要来源于内饰材料&#xff0c;现行标准亟待严格执行 车里“有味儿”该咋治(绿色家园) 近日&#xff0c;因奥迪Q5存在“车内异味大&#xff0c;坐上去头晕&#xff0c;味道几年都散不去”的现象&#xff0c;一汽大众汽车有限公司被深圳消费者委员会约谈。这一事件…

车险出险窍门123

1&#xff0c;对方全责提出私了1500&#xff0c;你死活不干&#xff0c;要求走保险&#xff0c;又是吵又是闹又是折腾&#xff0c;定损2200&#xff0c;修理厂要求2400&#xff0c;自掏200. 如果你同意私了&#xff0c;拿1500&#xff0c;报保险自己全责&#xff0c;车照样修…

名悦集团分享汽车保养小知识,汽车异味轻松去除有妙招

其实对于很多人来说&#xff0c;晕车的原因并不是因为体质问题&#xff0c;大多数晕车的人都是因为受不了车上的异味。还有根据皮革的材质&#xff0c;汽车内香水的选择也很重要&#xff0c;在一个封闭的环境里&#xff0c;一点点的异味都会被无限放大&#xff0c;使得不晕车的…

21款奔驰款奔驰GLC260L升级香氛负离子 告别异味

不管是新提的车还是用了几年的车&#xff0c;都推荐你一定要加装一套原厂的香氛系统&#xff0c;奔驰原厂的香水有很多种类型&#xff0c;具有香不留身的特性&#xff0c;净化车内杂味和异味&#xff0c;为您营造出绅士和高级感&#xff01; 加装原厂香氛负离子系统需要到的配件…

奔驰GLE450升级23P、抬显、柏林、香氛,通风座椅等

奔驰GLE级在“感性.纯粹”的设计美学上&#xff0c;融入永不自满的进取姿态。每一处彰显实力的设计&#xff0c;不为张扬&#xff0c;只为不断成为更好的自己&#xff01;在动与静的细节之间&#xff0c; 从容演绎非凡格局下的豪华质感与尊贵体验。 乘坐在车内的每一分感受&…