【进程间通信】管道应用场景---简易进程池

2024-09-02 02:28

本文主要是介绍【进程间通信】管道应用场景---简易进程池,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#include<iostream>
#include<vector>
#include<string>
#include<cstring>
#include<cstdlib>
#include<unistd.h>
#include<sys/stat.h>
#include<sys/wait.h>//把5个子进程要管理起来,要先描述再组织
const int processnum=5;
//先描述
class channel
{
public:channel(pid_t slaverpid,int cmdfd,std::string slavername):_slaverpid(slaverpid),_slavername(slavername),_cmdfd(cmdfd){}
public:pid_t _slaverpid;//子进程pidint _cmdfd;//发送任务的文件描述符std::string _slavername;//子进程的名字,方便打印日志
};void  Slaver()
{while(true){int cmdnode=0;int n=read(0,&cmdnode,sizeof(int));if(n==sizeof(int)){std::cout<<std::endl;std::cout <<"slaver say@ get a command: "<< " cmdcode: " << cmdnode << std::endl;//执行任务列表switch(cmdnode){case 1:{std::cout<<"刷新野怪"<<std::endl;break;}case 2:{std::cout<<"购买装备"<<std::endl;break;}case 3:{std::cout<<"释放技能"<<std::endl;break;}               case 4:{std::cout<<"查看战绩"<<std::endl;break;}}}if(n==0) break;}
}
void Initprocesspool(std::vector<channel>& channels)
{std::vector<int> oldwfd;//用来存储旧的写端fd, 确保每一个子进程都只有一个写端for(int i=0;i<processnum;i++){int pipefd[2]={0};int n=pipe(pipefd);if(n<0) return ;pid_t id=fork();if(id==0) //child{for(auto& fd:oldwfd) close(fd);//关闭从父进程继承下来的写端close(pipefd[1]);dup2(pipefd[0],0);//把标准输入重定向到读端文件,简化代码,可以不这么写Slaver();close(pipefd[0]);exit(0);}close(pipefd[0]);//添加channel字段std:: string name="process-"+std::to_string(i);channels.push_back(channel(id,pipefd[1],name));oldwfd.push_back(pipefd[1]);}}
void Debug(const std::vector<channel> &channels)
{// testfor(const auto &c :channels){std::cout << c._cmdfd << " " << c._slaverpid << " " << c._slavername << std::endl;}
}void menu()
{std::cout<<"###########################################"<<std::endl;std::cout<<"######     1.刷新野怪       2.购买装备######"<<std::endl;std::cout<<"######     3.释放技能       4.查看战绩#######"<<std::endl;std::cout<<"######               0.退出          #######"<<std::endl;std::cout<<"###########################################"<<std::endl;
}
void Ctrlprocess(std::vector<channel> channels)
{while(true){int select=0;menu();std::cout<<"please select@";std::cin>>select;if(select<1||select>4) break ;//选择进程,随机选择int processpos=rand()%channels.size();std::cout<<"father say:"<<"select:"<<select<<"  can todo "<<channels[processpos]._slaverpid<<"slavername:"<<channels[processpos]._slavername<<std::endl;//发放任务write(channels[processpos]._cmdfd,&select,sizeof(select));sleep(1);}
}void Quitprocess(const std::vector<channel>& channels)
{for(const auto& process:channels){close(process._cmdfd);waitpid(process._slaverpid,nullptr,0);}
}int main()
{srand(time(nullptr));std::vector<channel> channels;//1.初始化进程池Initprocesspool(channels);Debug(channels);//2.控制子进程Ctrlprocess(channels);//3.清理收尾Quitprocess(channels);return 0;}

 

这篇关于【进程间通信】管道应用场景---简易进程池的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1128740

相关文章

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

用Java打造简易计算器的实现步骤

《用Java打造简易计算器的实现步骤》:本文主要介绍如何设计和实现一个简单的Java命令行计算器程序,该程序能够执行基本的数学运算(加、减、乘、除),文中通过代码介绍的非常详细,需要的朋友可以参考... 目录目标:一、项目概述与功能规划二、代码实现步骤三、测试与优化四、总结与收获总结目标:简单计算器,设计

将Python应用部署到生产环境的小技巧分享

《将Python应用部署到生产环境的小技巧分享》文章主要讲述了在将Python应用程序部署到生产环境之前,需要进行的准备工作和最佳实践,包括心态调整、代码审查、测试覆盖率提升、配置文件优化、日志记录完... 目录部署前夜:从开发到生产的心理准备与检查清单环境搭建:打造稳固的应用运行平台自动化流水线:让部署像

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

python多进程实现数据共享的示例代码

《python多进程实现数据共享的示例代码》本文介绍了Python中多进程实现数据共享的方法,包括使用multiprocessing模块和manager模块这两种方法,具有一定的参考价值,感兴趣的可以... 目录背景进程、进程创建进程间通信 进程间共享数据共享list实践背景 安卓ui自动化框架,使用的是

Linux中Curl参数详解实践应用

《Linux中Curl参数详解实践应用》在现代网络开发和运维工作中,curl命令是一个不可或缺的工具,它是一个利用URL语法在命令行下工作的文件传输工具,支持多种协议,如HTTP、HTTPS、FTP等... 目录引言一、基础请求参数1. -X 或 --request2. -d 或 --data3. -H 或

在Ubuntu上部署SpringBoot应用的操作步骤

《在Ubuntu上部署SpringBoot应用的操作步骤》随着云计算和容器化技术的普及,Linux服务器已成为部署Web应用程序的主流平台之一,Java作为一种跨平台的编程语言,具有广泛的应用场景,本... 目录一、部署准备二、安装 Java 环境1. 安装 JDK2. 验证 Java 安装三、安装 mys

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

java中VO PO DTO POJO BO DO对象的应用场景及使用方式

《java中VOPODTOPOJOBODO对象的应用场景及使用方式》文章介绍了Java开发中常用的几种对象类型及其应用场景,包括VO、PO、DTO、POJO、BO和DO等,并通过示例说明了它... 目录Java中VO PO DTO POJO BO DO对象的应用VO (View Object) - 视图对象