进程通信——管道

什么是进程通信?

进程通信是实现进程间传递数据信息的机制。要实现数据信息传递就要进程间共享资源——内存空间。那么是哪块内存空间呢?进程间是相互独立的,一个进程不可能访问其他进程的内存空间,那么这块空间只能由操作系统提供。进程通信的方式有多种,管道就是一种。

管道是一种最简单的通信机制,管道分为匿名管道和命名管道。匿名管道通常用于父子进程之间。命名管道可实现任意两个进程通信。

匿名管道

原理

父进程打开管道文件流(读写两个流),分配描述符到文件描述符表。两个新的文件描述符分别指向管道的读端和写端。父进程创建子进程时,子进程的文件描述符表和父进程指向相同。父子进程指向的文件流都是共享的。

父子进程通信时,如果子进程写,父进程读,子进程关闭pipe_r,父进程关闭pipe_w;如果子进程读,父进程写,子进程关闭pipe_w,父进程关闭pipe_r。

使用样例

pipefd是一个输出型参数,pipefd[0] 表示的是读端的文件描述符,pipefd[1]表示的是写端文件描述符

创建管道->创建子进程->子进程关闭读端,写;父进程关闭写端,读->父进程等待子进程 

#include <iostream>
#include <unistd.h>
#include <cstdlib>
#include <sys/types.h>
#include <sys/wait.h>using namespace std;
void Write(int fd)
{char buffer[1024] = {0};pid_t id = getpid();int n = 0;string s = "I am child";while(1){snprintf(buffer,sizeof(buffer),"%s-%d-%d",s.c_str(),id,n);n++;write(fd,buffer,sizeof(buffer));sleep(1);if(n == 5) break;}
}void Read(int fd)
{char buffer[1024] = {0};while(1){ssize_t s = read(fd,buffer,sizeof(buffer));if(s > 0){cout << buffer << endl;}else if(s == 0){cout << "read ending" << endl;break;}else{cout << "read fail" << endl;}}
}int main()
{int pipefd[2] = {0};pipe(pipefd);pid_t id = fork();if(id < 0) return -1;if(id == 0){//childclose(pipefd[0]);//关闭读端Write(pipefd[1]);//close(pipefd[1]);exit(0);}//fatherclose(pipefd[1]);//关闭写端Read(pipefd[0]);pid_t ret = waitpid(id,nullptr,0);if(ret==id) cout << "wait success" << endl;else cout << "wait fail" << endl;//close(pipefd[0]);return 0;
}

命名管道

命名管道原理和匿名管道一样,区别就是命名管道会创建一个管道文件,两个进程分别对文件读写就可以了

使用样例

创建管道文件

 

销毁管道文件

 

 

//communicate.hpp 创建销毁管道进行封装
#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>class Init
{
public:Init(){int n = mkfifo("./myfifo", 0777);if (n == -1){perror("fifo:");exit(-1);}}~Init(){int n = unlink("./myfifo");if(n == -1){perror("unlink:");exit(-1);}}
};//sever.cpp 服务器负责维护管道,读客户端数据
#include "communicate.hpp"
using namespace std;
int main()
{// 创建管道Init init;// 打开管道int fd = open("./myfifo", O_RDONLY);if (fd == -1){cout << strerror(errno) << endl;return -1;}// 开始通信while (1){char buffer[1024] = {0};ssize_t ret = read(fd, buffer, sizeof(buffer));if (ret > 0){cout << "sever get inf:" << buffer << endl;}else if (ret == 0){cout << "client quit, sever quit too" << endl;break;}elsebreak;}// 结束通信close(fd);
}//client.cpp 客户端负责向服务器写数据
#include "communicate.hpp"using namespace std;int main()
{//打开管道int fd = open("./myfifo", O_WRONLY);if(fd < 0){cout << strerror(errno) << endl;return -1;}//进行通信while(1){string ord;cout << "Input:";getline(cin, ord);write(fd, ord.c_str(), ord.size());}close(fd);return 0;
}

管道特征

  • 只有具有血缘关系的进程可以匿名管道通信

因为只有血缘关系的进程的可以指向同一个匿名管道,达成资源(内存空间)共享,这是通信的前提

  • 管道只能单向通信
  • 通信的进程会进行协同,同步与互斥,为了保证管道文件数据的安全

例如上面的样例:写端每写一次都会等待1s,写端没有写完时,读端会等待进行协同

  • 管道是面向字节流的

管道以字节为单位传输数据,而不是以消息或记录为单位。这意味着数据在传输过程中没有特定的结构或边界,发送方可以连续写入任意数量的字节,接收方则按照字节顺序读取数据。

  • 管道是基于文件的,文件的生命周期是随进程的

管道会随着进程结束而关闭,例如基础IO流并不需要用户手动关闭。在上面的例子中,子进程是写端,没有close(pipdf[1])也不会有错误,同样的父进程是读端,没有close(pipdf[0])不会有错误,因为进程结束这个管道流会自动关闭。

管道的4种情况

  1. 读写端正常,管道为空,读端就要阻塞
  2. 读写端正常,管道为满,写端就要阻塞
  3. 写端关闭,读端正常,读端读到0,表明读到了管道文件的结尾
  4. 读端关闭,写端正常,写端会被异常终止

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/21525.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【全开源】简单商城系统源码(PC/UniAPP)

提供PC版本、UniAPP版本(高级授权)、支持多规格商品、优惠券、积分兑换、快递鸟电子面单、支持移动端样式、统计报表等 提供全部前后台无加密源代码、数据库离线部署。 构建您的在线商店的基石 一、引言&#xff1a;为什么选择简单商城系统源码&#xff1f; 在数字化时代&am…

【Spring Cloud Alibaba】初识Spring Cloud Alibaba

目录 回顾主流的微服务框架Spring Cloud 版本简介Spring Cloud以往的版本发布顺序排列如下&#xff1a; 由停更引发的"升级惨案"哪些Netflix组件被移除了&#xff1f; 替换方案服务注册中心&#xff1a;服务调用&#xff1a;负载均衡&#xff1a;服务降级&#xff1a…

干货分享 | TSMaster 中 Hex 文件编辑器使用详细教程

TSMaster 软件的 Hex 文件编辑器提供了文件处理的功能&#xff0c;这一特性让使用 TSMaster 软件的用户可以更便捷地对 Hex、bin、mot、s19 和 tsbinary 类型的文件进行处理。 本文重点讲述 TSMaster 中 Hex 文件编辑器的使用方法&#xff0c;该编辑器能实现将现有的 Hex、bin、…

@vue-office/excel 解决移动端预览excel文件触发软键盘

先直接上代码 不耽误大家时间 标明下插件库 非常感谢作者提供预览插件 vue-office/excel 只需要控制CSS :deep(.x-spreadsheet-overlayer) {.x-spreadsheet-selectors {display: none !important;} } :deep(.x-spreadsheet-bottombar) {li.active {user-select: none !import…

家政上门系统源码,家政上门预约服务系统开发涉及的主要功能

家政上门预约服务系统开发是指建立一个在线平台或应用程序&#xff0c;用于提供家政服务的预约和管理功能。该系统的目标是让用户能够方便地预约各种家政服务&#xff0c;如保洁、家庭护理、月嫂、家电维修等&#xff0c;并实现服务供应商管理和订单管理等功能。 以下是开发家政…

linux驱动学习(三)之uboot与内核编译

需要板子一起学习的可以这里购买&#xff08;含资料&#xff09;&#xff1a;点击跳转 GEC6818内核源码下载&#xff1a;点击跳转 一、环境配置 由于GEC6818对应是64位系统&#xff0c;虚拟机中的linux系统也要是64位&#xff0c;比如&#xff1a;ubuntu16.04.rar …

某红书旋转滑块验证码分析与协议算法实现(高通过率)

文章目录 1. 写在前面2. 接口分析3. 验证轨迹4. 算法还原 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致…

力扣SQL50 学生们参加各科测试的次数 查询 三表查询

Problem: 1280. 学生们参加各科测试的次数 &#x1f468;‍&#x1f3eb; 参考题解 join等价于inner join&#xff0c;不用关联条件的join等价于cross join Code select stu.student_id,stu.student_name, sub.subject_name,count(e.subject_name) attended_exams from Stud…

关于windosw打开安全中心空白的解决方案

关于windosw打开安全中心空白的解决方案 问题如下 问题如下 之后点击一片空白 解决方案如下 按下WINR&#xff0c;输入regedit回车找到路径&#xff1a;“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SecurityHealthService”&#xff0c;然后双击右边的“start”…

windows 下编译 TessRact+leptonica 识别图片文字

目录 1、下载 2. 编译基础依赖库 1.1 zlib 1.2 jpegsr9f 1.3 lpng1643 1.4 libgif 3. 编译tifflib 4. 配置nasm到系统环境中 5. 编译 libjpeg-turbo 6 编译leptonica 7. 编译tesseract 8. 测试验证 1、下载 下载tesseract5.3.2 下载leptonica1.83.1 下载l…

1638. 统计只差一个字符的子串数目

题目 给你两个字符串 s 和 t&#xff0c;请找出 s 中的非空子串的数目&#xff0c;这些子串满足替换一个不同字符以后&#xff0c;是 t 串的子串。换言之&#xff0c;请你找到 s 和 t 串中恰好只有一个字符不同的子字符串对的数目。 一个子字符串是一个字符串中连续的字符。 …

【全开源】旅游门票预订系统(FastAdmin+ThinkPHP+Uniapp)

一款基于FastAdminThinkPHPUniapp开发的旅游门票预订系统&#xff0c;支持景点门票、导游产品便捷预订、美食打卡、景点分享、旅游笔记分享等综合系统&#xff0c;提供前后台无加密源码&#xff0c;支持私有化部署。 ​便捷你的每一次出行&#x1f30d; &#x1f31f; 轻松预订…

骨传导蓝牙耳机买哪款好?年度精选五款骨传导蓝牙耳机推荐

作为音乐爱好者的我&#xff0c;也一直在寻找一款好的骨传导耳机&#xff0c;听音乐对我来说不仅仅是一种消遣方式&#xff0c;更多是一种对生活、工作上压力和困难的舒缓&#xff0c;所以今天给大家推荐几款骨传导耳机。今天推荐这几款骨传导耳机都是比较有性价比&#xff0c;…

计算机网络学习实践:模拟RIP动态路由

计算机网络学习实践&#xff1a;模拟RIP动态路由 模拟动态路由RIP协议 1.实验准备 实验环境&#xff1a;华为模拟器ENSP 实验设备&#xff1a; 3个路由器&#xff0c;3个二层交换机&#xff08;不是三层的&#xff09;&#xff0c;3个PC机 5个网段 192.168.1.0 255.255.…

电脑视频录制工具,推荐3款,让你的作品更专业!

随着信息技术的飞速发展&#xff0c;电脑视频录制工具在日常工作和娱乐中扮演着越来越重要的角色。它们不仅能帮助我们记录电脑屏幕上的精彩瞬间&#xff0c;还能为教学、演示、游戏直播等多种场景提供便利。本文将详细介绍三款电脑视频录制工具&#xff0c;并分步骤阐述它们的…

如何编辑pdf文件内容?编辑技巧大揭秘,秒变办公达人!

如何编辑pdf文件内容&#xff1f;在数字化办公日益普及的今天&#xff0c;PDF文件因其跨平台、格式稳定的特点&#xff0c;成为我们日常工作和学习中不可或缺的一部分。然而&#xff0c;PDF文件的编辑却常常令人头疼&#xff0c;许多人面对需要修改内容的PDF文件时感到无从下手…

【RPG Maker MV 仿新仙剑 战斗场景UI (九)】

RPG Maker MV 仿新仙剑 战斗场景UI 九 前言角色战斗精灵精灵图设置攻击 战斗背景图 前言 前段天研究并完成了主角人物行走图部分的开发&#xff0c;完成了对应的8方向行走&#xff0c;及精灵的展示。现在开始重新回到战斗场景的开发中&#xff0c;回顾下&#xff0c;已完成功能…

如何手动批准内核扩展 Tuxera NTFS for mac内核扩展需要批准 内核扩展怎么打开

在了解如何手动批准内核扩展之前&#xff0c;我们应该先了解什么叫做内核扩展。内核扩展又被称为KEXT&#xff0c;通过它可以实现macOS系统与软件组件之间的交互&#xff0c;例如磁盘管理、任务管理和内存管理等等。 kext 是内核扩展&#xff08;Kernel Extension&#xff09;…

【漏洞复现】海康威视综合安防管理平台 orgManage/v1/orgs/download 任意文件读取漏洞复现

0x01 产品简介 海康威视综合安防管理平台是一套“集成化”、“智能化”的平台,通过接入视频监控、一卡通、停车场、报警检测等系统的设备。海康威视集成化综合管理软件平台,可以对接入的视频监控点集中管理,实现统一部署、统一配置、统一管理和统一调度。 0x02 漏洞概述 海康…

C语言:学生成绩管理系统(含源代码)

一.功能 二.源代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_NUM 100 typedef struct {char no[30];char name[10];char sex[10];char phone[20];float cyuyan;float computer;float datastruct; } *student, student1;typ…