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

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

相关文章

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Python结合PyWebView库打造跨平台桌面应用

《Python结合PyWebView库打造跨平台桌面应用》随着Web技术的发展,将HTML/CSS/JavaScript与Python结合构建桌面应用成为可能,本文将系统讲解如何使用PyWebView... 目录一、技术原理与优势分析1.1 架构原理1.2 核心优势二、开发环境搭建2.1 安装依赖2.2 验

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

SpringShell命令行之交互式Shell应用开发方式

《SpringShell命令行之交互式Shell应用开发方式》本文将深入探讨SpringShell的核心特性、实现方式及应用场景,帮助开发者掌握这一强大工具,具有很好的参考价值,希望对大家有所帮助,如... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F

MySQL 分区与分库分表策略应用小结

《MySQL分区与分库分表策略应用小结》在大数据量、复杂查询和高并发的应用场景下,单一数据库往往难以满足性能和扩展性的要求,本文将详细介绍这两种策略的基本概念、实现方法及优缺点,并通过实际案例展示如... 目录mysql 分区与分库分表策略1. 数据库水平拆分的背景2. MySQL 分区策略2.1 分区概念

SpringBoot条件注解核心作用与使用场景详解

《SpringBoot条件注解核心作用与使用场景详解》SpringBoot的条件注解为开发者提供了强大的动态配置能力,理解其原理和适用场景是构建灵活、可扩展应用的关键,本文将系统梳理所有常用的条件注... 目录引言一、条件注解的核心机制二、SpringBoot内置条件注解详解1、@ConditionalOn

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序