Linux——进程通信(二) 匿名管道的应用:进程池

前言

之前我们学习了进程通过匿名管道进行通信,实现了两个进程的数据传输。

如果我们管理的是很多个进程,通过管道发送指令,因为如果管道中没有数据,读端必须等待,也就是被管理的进程们都在等待我发送的指令,那么我们可以通过特定的通讯方式,对进程实施控制,也就是让进程根据传输的指令去完成相应的操作。

一、进程池概念

我们知道,系统资源的获取是有成本的,比如我们创建进程,需要花一定的时间去完成,比如现在我们有一些比较重要的任务需要处理,如果等待任务到来,再创建进程去处理任务,时间上会慢一点,如果我们提前将进程创建好,任务到来,我们直接对进程分派任务,这样就能节省时间,这些提前创建好并被管理的进程,有任务来就分派执行,我们可以称之为进程池

打个比方,比如说你喝娃哈哈矿泉水,如果你感觉到口渴了,才去外面超市买娃哈哈矿泉水,这样成本是不是比较高,有点浪费时间,但是如果你提前在家里面放上一箱娃哈哈矿泉水,渴了就喝,顺手就拿的事情,效率就提高了,这也相当于把矿泉水进行池化了。

二、进程池实现

主要思路是先创建进程和信道,再发布任务,最后等待关闭父进程的写进程,让子进程read读到0,就退出子进程。最后父进程进行资源回收。

具体可以看代码注释,这里就不多BB了

ProcessPool.cpp

#include <iostream>
#include <unistd.h>
#include <cassert>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <string>
#include <sys/types.h>
#include <sys/wait.h>
#include "Task.hpp"
using namespace std;#define NUM 5class channel
{
public:channel(string name, int fd, pid_t pid): _name(name), _fd(fd), _pid(pid){}public:string _name;int _fd;pid_t _pid;
};void Work()
{while (true){int code = 0;ssize_t n = read(0, &code, sizeof(code));if (n == sizeof(code)){if (!init.Check(code)){cout << "任务码不合法,执行失败" << endl;continue;}init.RunTask(code);}else if (n == 0)break;}
}void CreatProcess(vector<channel> &v)
{vector<int> vfd; // 存放父进程的写信道的fdfor (int i = 0; i < NUM; i++){// 创建管道int pipefd[2];int n = pipe(pipefd);assert(n == 0);// 创建进程pid_t id = fork();if (id < 0){perror("fork");exit(1);}// 构建信道else if (id == 0){// 子进程vfd.push_back(pipefd[1]);for (auto &fd : vfd) // 关闭子进程继承的写信道{close(fd);}dup2(pipefd[0], 0);Work();exit(0);}// 父进程close(pipefd[0]);v.push_back(channel(to_string(i + 1) + "号信道", pipefd[1], id));}
}void PrintChannel(const vector<channel> &v)
{for (auto &c : v){cout << c._name << "," << c._fd << "," << c._pid << endl;}
}void SendTask(const vector<channel> &v, bool flag, int num = 1)
{int pos = 0;while (true){int task = init.SelectTask(); // 选择任务pos %= v.size();              // 选择信道轮流执行任务channel c = v[pos++];cout<<"发送信息"<<init.ToDesc(task)<<"给"<<c._name<<",pid是"<<c._pid<<endl;write(c._fd, &task, sizeof(task)); // 发送任务if (!flag){if (--num <= 0)break;}sleep(1);}sleep(1);cout << "发送任务完成" << endl;
}void WaitPorcess(vector<channel> v)
{for (auto &c : v){close(c._fd);pid_t rid = waitpid(c._fd, nullptr, 0);cout<<"等待子进程"<<c._pid<<"成功"<<endl;}
}int main()
{vector<channel> channels;// 创建进程和信道CreatProcess(channels);// PrintChannel(channels);  //打印测试// 发送任务const bool always_loop = true;SendTask(channels, !always_loop, 10);// 进程等待回收WaitPorcess(channels);return 0;
}

Task.hpp

#pragma once#include <iostream>
#include <functional>
#include <vector>
#include <ctime>using namespace std;typedef function<void()> task_t;void Download()
{cout << "我正在下载,"<< "pid:" << getpid() << endl;
}void Print()
{cout << "我正在打印,"<< "pid:" << getpid() << endl;
}void PlayVideo()
{cout << "我正在播放,"<< "pid:" << getpid() << endl;
}class Init
{
public:Init(){tasks.push_back(Download);tasks.push_back(Print);tasks.push_back(PlayVideo);srand(time(nullptr));}void RunTask(int code){tasks[code]();}string ToDesc(int code){switch (code){case 0:return "Download";case 1:return "Print";case 2:return "PlayVideo";default:return "Unkonw";}}bool Check(int code){return code >= 0 && code < tasks.size();}int SelectTask(){return rand() % tasks.size();}public:vector<task_t> tasks;// 任务码const int download_code = 0;const int print_code = 1;const int PlayVideo_code = 2;
};Init init;

 运行结果如下。

 

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

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

相关文章

CVE-2024-24112 XMall后台管理系统 SQL 注入漏洞分析

------作者本科毕业设计项目 基于 Spring Boot Vue 开发而成...... [Affected Component] /item/list /item/listSearch /sys/log /order/list /member/list (need time-based blind injection) /member/list/remove 项目下载地址 Exrick/xmall: 基于SOA架构的分布式…

cesium viewer camera flyto

一、viewer的flyTo内部调用的是camera的相关定位方法&#xff0c;针对不同的定位对象&#xff0c;计算出合适的位置和相机视角。viewer可以定位到entity、dataSource、Cesium3DTileset、ImageLayer等。 var rect [116.490401, 39.964771, 116.499623, 39.977102];var heading …

2024全国水科技大会:【协办单位】山东文远环保科技股份有限公司

山东文远环保科技股份有限公司坐落于千年古城齐国故都--临淄。初始成立于2011年&#xff0c;是淄博市首批国有资本参股的混合改制企业。 公司着力打造环保设备制造、环保工程及服务、环保水务/固废处理/新能源项目投资及运营管理、固废循环经济产业园等四大板块。是一家集投资、…

Elasticsearch8.x版本Java客户端Elasticsearch Java API 如何并发修改

前言 并发控制&#xff0c;一般有两种方案&#xff0c;悲观锁和乐观锁&#xff0c;其中悲观锁是默认每次更新操作肯定会冲突&#xff0c;所以每次操作都要先获取锁&#xff0c;操作完毕再释放锁&#xff0c;适用于写比较多的场景。而乐观锁是默认每次更新操作都不会冲突&#…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:GridCol)

栅格子组件&#xff0c;必须作为栅格容器组件(GridRow)的子组件使用。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 可以包含单个子组件。 接口 GridCol(option?:{span?: number | …

综合知识篇00-综合知识考点汇总目录(2024年软考高级系统架构设计师冲刺知识点总结-综合知识篇-先导篇)

专栏系列文章推荐&#xff1a; 2024高级系统架构设计师备考资料&#xff08;高频考点&真题&经验&#xff09;https://blog.csdn.net/seeker1994/category_12593400.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】&#xff08;2024年软考高级…

二叉树的初步学习和顺序结构实现

当我们学完顺序表、链表、栈和队列的时候&#xff0c;我们就要开始学习树了。树对于以后的学习有非常大的帮助&#xff0c;尤其是排序。好了&#xff0c;开始我们的学习吧。 1.树的概念及结构 1.1树的结构 树结构是一种非线性结构。它是由n&#xff08;n>0&#xff09;个…

CHINC邀请函 | 全视通邀您共赴青岛,碰撞数智火花

展会名称&#xff1a;2024中华医院信息网络大会&#xff08;CHINC&#xff09; 展会时间&#xff1a;3月29-31日 展会地址&#xff1a;青岛国际会展中心&#xff08;红岛馆&#xff09; 全视通展位&#xff1a;B2-A05A 全视通将携智慧病区、智慧门诊、智慧手术室、智慧后勤…

快速实现鸿蒙侧边栏显示与隐藏

文章目录 前言侧边栏组件使用快速搞定侧边栏总结 一、前言 有好多文章要分享&#xff0c;但是来不及&#xff0c;就把最近觉得比较重要的组件分享下。最近因为在完善玩android的一个app&#xff0c;我的这个app叫玩鸿蒙&#xff0c;过段时间就开源了&#xff0c;敬请期待。 …

免费开源的 Vue 拖拽组件 VueDraggablePlus (兼容移动端)

VueDraggablePlus 支持 Vue2 / Vue3&#xff0c;是被尤雨溪推荐了的拖拽组件。我自己试用过了&#xff0c;还挺好用的&#xff0c;兼容移动端。 官网&#xff1a;https://alfred-skyblue.github.io/vue-draggable-plus/ 官网文档里面很详细了&#xff0c;我就不再介绍安装和用…

Google colab中如何从kaggle中接入数据?

写在前面 使用google colab进行数据分析和探索时&#xff0c;可引用的数据源包括但不限于&#xff1a;1.可上传的数据文件用本地加载的的方式打开数据资源&#xff1b;2.从网络链接中直接打开后加载到缓存中的文件资源&#xff1b;3.通过API或者外部的开放接口加载数据&#x…

【日本語】N2考试湖北报名笔记

阅读资料 视频&#xff1a;JLPT报名技巧 使用浏览器调试模式快速报名&#xff1b; 1 报名流程 【考场选择】 1.1 春季报名&#xff1a;03-19 07:00:00 1.2 预习网站登录信息 1.3 登录验证码&#xff1a;06:55 &#xff08;图片来自视频《教日语的阿飞老师 - 担心能力考抢…

微信小程序选择器picker的使用(省市区)

index.wxml picker中的 moderegion模式&#xff0c;这里同element中的select不同的是&#xff0c;不需要自己在绑定数据原&#xff0c;默认就包含了省市区的整体数据 <view class"section"><view class"section__title">省市区选择器</vie…

【源码阅读】Mybatis底层源码分析(详细Debug查看附代码)

一、搭建测试代码框架 &#xff08;代码已提交到github->测试代码&#xff0c;建议结合代码根据本文debug一遍更有利于理解&#xff0c;帮忙点个Star 哈&#xff0c;本人在这里谢谢了&#xff09; 二、猜想Mybatis是如何设计的 从上面的案例中&#xff0c;可以大致可以猜测…

酷开科技以酷开系统的力量让电视机“活”起来

让用户回归电视的绝不会是因为电视机本身&#xff0c;而是电视系统的内容和交互的形式。酷开科技以系统的力量让电视机“活”起来。对于许多人来说&#xff0c;观看电影是一种享受、一种放松、一种逃避现实的方式。而现在&#xff0c;酷开科技作为行业内领军企业&#xff0c;为…

YOLOV5 部署:QT的可视化界面推理(创建UI,并编译成py文件)

1、前言 之前用YOLOV5 做了一个猫和老鼠的实战检测项目,本章将根据之前训练好的权重进行部署,搭建一个基于QT的可视化推理界面,可以检测图片和视频 本章使用的数据集和权重参照:YOLOV5 初体验:简单猫和老鼠数据集模型训练-CSDN博客 可视化界面如下: 2、安装Pyside6 本…

JSONP漏洞详解

目录 同源策略 JSONP简介 JSONP劫持漏洞 漏洞原理 漏洞利用过程 利用工具 JSONP漏洞挖掘思路 JSONP防御 首先&#xff0c;要了解一下什么是同源策略&#xff1f; 同源策略 同源策略&#xff08;SOP&#xff09;是浏览器的一个安全基石&#xff0c;浏览器为了保证数据…

碳课堂|什么是碳减排?如何减少碳排放?

一、碳减排的定义及提出背景&#xff1a; 碳减排&#xff0c;即减少人类在生产、生活中二氧化碳&#xff08;CO2&#xff09;等温室气体的排放量&#xff0c;以应对全球气候变暖。 18世纪工业革命起&#xff0c;人类在生产活动中使用大量矿物燃料&#xff08;如煤、石油等&am…

从电子邮件到即时通讯:信息技术演变与现代沟通方式的变迁

上世纪90年代&#xff0c;欧美企业界迎来了信息化建设的大爆发时期。Oracle、SAP和Adobe等国际知名软件巨头纷纷致力于推广和普及电子邮件系统&#xff0c;使电子邮件迅速成为企业和个人进行信息交换的主要工具之一。电子邮件的出现&#xff0c;也提供了一种高效的信息传递手段…

zookeeper集群安装部署和集群异常处理

准备jdk和zookeeper安装包【官网即可下载】 zookeeper-3.5.1-alpha.tar.gz jdk1.7.0_8020200612.tar 准备三台linux虚拟机【具体以项目实际需要为准】&#xff0c;并安装jdk和zookeeper 虚拟机地址如下&#xff1a;194.1.1.86&#xff08;server.1&#xff09;、194.1.1.74…