C++那些事之小项目实战-进程间通信

小项目实战之进程间通信

进程间通信是一个非常重要的话题,特别是像一些大型项目都有它的影子,例如:PostgreSQL使用了管道完成copy的进程间通信,那么本节也将基于这个主题,使用C++去搭建一个进程间通过管道通信的demo出来,本节将会结合前面几节讲的内容,给出一个比较完整的实战例子出来:

  • mutex

  • condition_variable

  • thread

注:本节的完整代码会放在星球中。

首先一个很简单的管道用法为:

  • 创建一个管道

它会creating a pipe, forking, and invoking the shell.

// FILE *popen(const char *command, const char *type);
pipe = popen(command.c_str(), "w");
  • 关闭一个管道

// int pclose(FILE *stream);
pclose(pipe);

接下来我们就只需要往里面写与读了,原理也很简单,例如:

此时便会把data写入到前面创建的管道中。

// size_t fwrite( const void* buffer, size_t size, size_t count, FILE* stream );
size_t written = fwrite(data.c_str(), sizeof(char), data.size(), pipe);

如果从管道中读取,我们可以使用fread或者fgets,fgets 会在读取到换行符或达到缓冲区大小时停止,而 fread 会尽可能多地读取数据,直到达到指定的字节数或遇到文件结尾。同理,上面的fwrite可以替换为fputs。

现在,一个管道的基本使用介绍完了,如何写一个完整的demo?

很简单,我们只需要创建两个线程,一个读,一个写,然后写线程往pipe里面写数据,读线程从pipe里面读即可。

例如:

std::thread writer_thread(write_to_pipe);
std::thread reader_thread(read_from_pipe);writer_thread.join();
reader_thread.join();

写线程需要做的事情就是调用fwrite丢数据即可

ProcessWriter writer("cat > /tmp/pipe");// 写入数据
std::string message = "Hello pipe!\n";
if (!writer.write(message)) {std::cerr << "Failed to write data to pipe" << std::endl;
}

同理,读线程取数据:

ProcessReader reader("/tmp/pipe");
// 读取数据
std::string message;
while (reader.read(message)) {// do something
}

最后的效果就是:

Read from pipe: Hello pipe!

跟我一起实践写代码,戳这里呀~

15f1200824b8f4a62574aa956045f0f3.jpeg

往期推荐:

向量数据库milvus源码剖析之开篇

热度更新,手把手实现工业级线程池

1013ab8b9ad472b076a55bf453cdbc15.jpeg

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

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

相关文章

聚变反应堆设计的一些关键方面和最新进展

聚变反应堆设计是一个复杂且高度专业化的领域&#xff0c;旨在实现核聚变反应以产生清洁能源。以下是对聚变反应堆设计的一些关键方面和最新进展的概述&#xff1a; ### 一、聚变反应堆的基本原理 核聚变是两个较轻的原子核结合成一个较重的原子核&#xff0c;并在此过程中释…

消除笔怎么用?教你消除笔的正确用法

消除笔&#xff0c;也称为橡皮擦工具或克隆笔工具&#xff0c;是图像处理软件中的一种常用工具。它的主要作用是通过取样图像中的某一部分&#xff0c;然后覆盖掉不想要的图像内容&#xff0c;从而实现修复、去除瑕疵等效果。那么有哪些软件具有消除笔功能&#xff0c;又是怎么…

网络安全入门教程(非常详细)从零基础入门到精通,看完这一篇就够了。

学前感言: 1.这是一条坚持的道路,三分钟的热情可以放弃往下看了.2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发.3.有时多google,baidu,我们往往都遇不到好心的大神,谁会无聊天天给你做解答.4.遇到实在搞不懂的,可以先放放,以后再来解决. 基…

欧洲杯:高精度定位技术,重塑体育赛事新体验

随着科技的飞速发展&#xff0c;体育赛事的观赏体验与竞技水平正被不断推向新的高度。在即将到来的2024年欧洲杯赛场上&#xff0c;一项革命性的技术——高精度定位&#xff0c;正悄然改变着比赛的每一个细节&#xff0c;为球迷们带来前所未有的观赛享受&#xff0c;同时也为运…

昇思25天学习打卡营第7天|保存与加载

Python语言 AI框架&#xff1a;Mindspore 1.模型构建 class Network(nn.Cell):def __init__(self):super().__init__()self.flatten nn.Flatten()self.dense_relu_sequential nn.SequentialCell(nn.Dense(28*28, 512, weight_init"normal", bias_init"zeros…

力扣双指针算法题目:移动零

1.题目 . - 力扣&#xff08;LeetCode&#xff09; 2.思路解析 这个题目的思路和“使用递归排序快速排序解决数组的排序问题”相同 class solution { public:void QuickSort(vector<int>& nums, int left, int right){if (left > right) return;int key left…

VSCode常用的一些插件

Chinese (Simplified) 汉语&#xff08;简体&#xff09;拓展包。 Auto Close Tag 可以自动增加xml/html的闭合标签。 CodeSnap 截图神器。截图效果在下面。 Dracula Official vscode一个很好看的主题。 Git Graph git管理工具。 GitHub Repositories 有了它&#xff0c;不…

AI一键音频转文字工具 速度超快,支持实时转换,无需联网,本地整合包下载

这是 CapsWriter-Offline &#xff0c;一个 PC 端的语音输入、字幕转录工具。可用实现简单一键将音频文件转换成文字的懒人工具。 两个功能&#xff1a; 1、实时转换&#xff0c;按下键盘上的 大写锁定键&#xff0c;录音开始&#xff0c;当松开 大写锁定键 时&#xff0c;就会…

TaskDisplayArea、ActivityStack、Task以及ActivityRecord之间的关系

目录 一、TaskDisplayArea、ActivityStack、TaskRecord以及ActivityRecord关系图 二、TaskDisplayArea、ActivityStack、Task以及ActivityRecord相关代码 1、ActivityRecord 2、Task 3、ActivityStack 4、TaskDisplayArea 前言&#xff1a;对TaskDisplayArea、ActivitySt…

go语言day08 泛型 自定义错误处理 go:协程

泛型&#xff1a; 抛错误异常 实现error接口类型 用java语言解释的话&#xff0c;实现类需要重写error类型的抽象方法Error().这样就可以自定义异常处理。 回到go语言&#xff0c;在Error()方法中用*argError 这样一个指针类来充当error接口的实现类。 在f2()方法中定义返回值…

CONFIG_FEATURE_MOUNT_NFS

CONFIG_FEATURE_MOUNT_NFS是一个Linux内核配置选项&#xff0c;它允许系统支持挂载NFS文件系统。如果您在编译内核或构建根文件系统时遇到关于NFS支持的问题&#xff0c;您可能需要检查这个配置选项是否被启用。在某些情况下&#xff0c;例如使用BusyBox作为工具集时&#xff0…

漏洞分析|OpenSSH漏洞(CVE-2024-6387)

一、网传漏洞POC信息 漏洞编号&#xff1a;CVE-2024-6387 漏洞名称&#xff1a;OpenSSH regreSSHion 漏洞 POC上传者&#xff08;作者不确定&#xff09;&#xff1a;7etsuo 发布日期&#xff1a;2024-07-01 漏洞类型&#xff1a;远程代码执行&#xff08;RCE&#xff09;…

昇思MindSpore学习笔记3-03热门LLM及其他AI应用--基于MobileNetv2的垃圾分类

摘要&#xff1a; MindSpore AI框架使用MobileNetv2模型开发垃圾分检代码。检测本地图像中的垃圾物体&#xff0c;保存检测结果到文件。记录了开发过程和步骤&#xff0c;包括环境准备、数据下载、加载和预处理、模型搭建、训练、测试、推理应用等。 1、实验目的 了解垃圾分…

解决pip默认安装位置在C盘方法

新版python中使用pip命令将opencv库安装到base环境中 首先我们打开命令控制窗口&#xff0c;激活base环境&#xff0c;输入conda activate base 然后检查一下自己base环境中是否安装opencv库&#xff0c;输入conda list 往下找&#xff0c;找到o开头的地方&#xff0c;发现是…

达梦数据库 页大小与数据库字段长度的关系

对于达梦数据库实例而言&#xff0c;页大小 (page_size)、簇大小 (extent_size)、大小写敏感 (case_sensitive)、字符集 (charset) 这四个参数&#xff0c;一旦确定无法修改&#xff1b;如果过程中发现这些数据设置的不对&#xff0c;只能是重新新建数据库实例&#xff0c;而不…

GraphQL与RESTful API的区别和优势

GraphQL GraphQL是一种用于API设计的语言和查询协议&#xff0c;由Facebook于2015年推出。它允许客户端向服务器指定他们需要的数据字段&#xff0c;而不是像RESTful API那样请求整个资源然后过滤数据。在GraphQL中&#xff0c;客户端发送一个单一的请求&#xff0c;而服务器返…

通过npm安装OpenLayers库,vue3+ts环境下OpenLayers实现加载本地高德离线地图并添加标记点、标记点气泡及标记点气泡按钮事件

在Vue 3和TypeScript的环境下使用OpenLayers来加载高德地图的离线瓦片&#xff0c;并添加标记点、标记点气泡以及处理气泡上的按钮事件&#xff0c;涉及到几个步骤。首先&#xff0c;需要明确高德地图的瓦片数据格式和如何配置OpenLayers以使用这些瓦片。接着&#xff0c;我们需…

零信任沙箱是什么?零信任沙箱有什么作用?

零信任沙箱是什么&#xff1f;零信任沙箱有什么作用&#xff1f; 在当今数字化时代&#xff0c;数据安全已成为各行各业的核心关注点。零信任沙箱作为一种新兴的安全技术&#xff0c;不仅适用于政府和金融等关键领域&#xff0c;其实用性覆盖了更广泛的场景&#xff0c;如医疗…

数智化配补调:零售品牌增长新引擎

随着科技的不断进步和消费者需求的日益个性化、多元化&#xff0c;传统服装行业正面临着前所未有的挑战与机遇。在这个快速变化的时代&#xff0c;如何精准把握市场脉搏&#xff0c;实现库存的高效管理&#xff0c;成为了服装品牌生存与发展的关键。数智化配补调策略应运而生&a…

mysql定时备份数据库

文章目录 核心目标思路具体方法一、编写脚本二、修改文件属性三、找一个mysqldump文件四、把.sh放到定时器里 其它&#xff1a;windows的脚本 核心目标 解决数据库定时备份的工作。centos环境。 思路 用centos的crontab定时执行脚本。 具体方法 一、编写脚本 编写backup_…