Linux之进程间通信(二)---模拟进程池

发布时间:2026/9/27 15:11:53

Linux之进程间通信(二)---模拟进程池
进程池创建多个子进程只有一个父进程一个子进程外层套循环创建多个进程父进程还要对channle进行先描述在组织对管道进行描述-class Channel大纲1.创建多个子进程2.对子进程和管道进行管理3.释放资源阶段检测是否创建子进程成功和文件描述符接下来对现有函数进行封装--利用c类class ProcessPool { public: // a. 创建多个进程,创建多个管道 int CreateProcessPool() { for (int i 0; i 5; i) { int pipefd[2] {0}; int n pipe(pipefd); if (n 0) { cerr pipe error endl; return pipeerror; } pid_t id fork(); if (id 0) { cerr fork error endl; return forkerror; } else if (id 0) { // 子进程 close(pipefd[1]); // 子进程关掉写,进行读 DoTask(pipefd[0]); exit(OK); } else { // 父进程 close(pipefd[0]); // 父进程写 // pipefd[1]循环一下就没有了,要储存 Channel ch(pipefd[1], id); // 将子进程和要写的管道文件进行记录 channels.push_back(ch); cout 创建子进程成功,pid: id endl; } } return OK; } void DebugPrint() { for(auto ch : channels) { ch.Print(); } } private: // 未来维护和组织所有的channel vectorChannel channels; };将创建多个子进程,和打印,文件描述符,创建子进程是否成功都封装到ProcessPool这个类里面,然后将vectorChannel channels 变成该类的成员变量,main函数的内容变得十分简洁实现完成不同任务的需求约定统一四字节进行读写任务我们想要不要让他很重复,这个时候要用到函数指针,然后回调的操作来实现functionvoid(int)可调用对象包装器。void函数返回值为 void(int)这个可调用对象接收 1 个 int 类型参数task_t就是别名代表所有可以接收 int 参数、返回 void 的可调用类型。可以包装普通函数、函数指针、lambda 表达式、仿函数对象。using task_tfunctionvoid(int);task_t是类型别名代表一个可调用对象接收 1 个 int 参数返回 voidvoid CreateProcessPool(task_t cb)cbcallback 回调类型是task_t。意思函数CreateProcessPool接收一个可调用对象进来不在本函数内部执行交给子进程去调用。//子进程分支 close(pipefd[1]); cb(pipefd[0]); // 执行回调 exit(OK);子进程拿到管道读端pipefd[0]把文件描述符当做实参传给回调执行用户传入的函数。pool.Init(DoTask);把DoTask函数传进去。DoTask签名void DoTask(int fd)正好匹配void(int)。整体流程main 把 DoTask 作为回调传给 Init → Init 传给 CreateProcessPool → fork 出子进程 → 子进程调用cb(pipefd[0])等价执行DoTask(pipefd[0])。对子进程和管道进行管理那么要如何选择一个进程呢???比较好的是将任务平均分配到子进程1.轮询2.随机3.权重接下来我们采用轮询的方式来分配任务选择任务制作任务清单任务表实现的底层typedef 干了什么typedef void(*mytask_list)();void (*)()这是函数指针类型代表保存一个函数地址该函数没有参数返回值 void。typedef给这个复杂类型起一个简短名字mytask_list。// 普通int a; a是int类型变量 // 现在mytask_list fp; fp就是一个函数指针变量可以存函数地址 mytask_list fp SyncDick; fp(); //等价 SyncDick();mytask_list mytask[4];mytask[4]这是函数指针数组数组里面每一格都能存放一个函数的地址。{SyncDick, Download, PrintLog, UpdateStatus}把 4 个全局函数的地址依次填进数组 0、1、2、3 下标位置。数组下标存储的函数地址调用写法0SyncDickmytask[0]();→执行 SyncDick ()1Downloadmytask[1]();→执行 Download ()2PrintLogmytask[2]();→执行 PrintLog ()3UpdateStatusmytask[3]();→执行 UpdateStatus ()种下随机数种子^pid,让取出来的数更加随机验证任务分配是否随机发送任务给进程processpoolChannel补充写和管道名的成员函数子进程完成发送过来的任务释放资源processpool创建成员函数Quit用来释放资源要将管道关闭然后将子进程进行回收问题一如果父进程关闭,但是子进程还没有跑完会有影响吗是没有的,子进程只有将管道内容全部读完才会结束问题二将Quit这样可以吗发现卡住了那么这是为什么呢???实际上是因为管道文件没有被关干净子进程是以父进程为模板创建的,很多的内核数据结构的信息都是和父进程一样的也就是说,越到后面创建的子进程对于前面父进程创造的管道文件都拥有写的权限将父进程对于管道文件的写权限关闭,其管道文件对应的子进程并不能接受到管道以全部关闭,然后再退出,因为这其中后面创建的子进程对于改管道文件依然可以写入那么应该要如何解决这个问题呢???解决方案:1.从最后一个创建的子进程开始关闭管道文件2.实现真正w:r1:1让之后创建的子进程关闭之前的管道文件

相关新闻

AI模型对比实战:DeepSeek、Claude、Kimi API调用与性能评估指南

AI模型对比实战:DeepSeek、Claude、Kimi API调用与性能评估指南

2026/9/27 2:45:11

在实际 AI 模型应用和开发中,我们经常需要对比不同模型在特定任务上的表现,以选择最适合当前场景的工具。近期,围绕 DeepSeek-V4-Pro、Fable5、GPT-5.6-Sol 和 KimiK3 等模型的讨论非常热烈,尤其是在代码生成、对话和推理能力方面…

PC端微信QQ防撤回终极指南:3步实现消息永久保存

PC端微信QQ防撤回终极指南:3步实现消息永久保存

2026/9/2 21:12:12

PC端微信QQ防撤回终极指南:3步实现消息永久保存 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址: https://gitcode.com/GitH…

如何快速上手ComfyUI IPAdapter Plus:5分钟掌握图像风格迁移的终极指南

如何快速上手ComfyUI IPAdapter Plus:5分钟掌握图像风格迁移的终极指南

2026/8/11 10:29:16

如何快速上手ComfyUI IPAdapter Plus:5分钟掌握图像风格迁移的终极指南 【免费下载链接】ComfyUI_IPAdapter_plus 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI_IPAdapter_plus 还在为AI图像生成缺乏个性化控制而烦恼吗?ComfyUI IPAdap…

CANN/GE ACL数据集缓冲区添加函数

CANN/GE ACL数据集缓冲区添加函数

2026/9/26 19:14:12

aclmdlAddDatasetBuffer 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、Te…

用ffmpeg高效批量调整图片尺寸的实战指南

用ffmpeg高效批量调整图片尺寸的实战指南

2026/9/27 1:30:29

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

2026/9/27 1:30:37

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱 【免费下载链接】transformers 🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and mu…

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

2026/9/27 1:30:35

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system sup…

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

2026/9/27 1:30:34

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

2026/9/26 16:36:51

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system supporting mi…

远程协作的工作台整理

远程协作的工作台整理

2026/9/26 14:29:04

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/26 13:57:22

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/26 23:35:16

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…