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

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

相关文章

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Java中&和&&以及|和||的区别、应用场景和代码示例

《Java中&和&&以及|和||的区别、应用场景和代码示例》:本文主要介绍Java中的逻辑运算符&、&&、|和||的区别,包括它们在布尔和整数类型上的应用,文中通过代码介绍的非常详细,需要的朋友可... 目录前言1. & 和 &&代码示例2. | 和 ||代码示例3. 为什么要使用 & 和 | 而不是总是使

Redis中管道操作pipeline的实现

《Redis中管道操作pipeline的实现》RedisPipeline是一种优化客户端与服务器通信的技术,通过批量发送和接收命令减少网络往返次数,提高命令执行效率,本文就来介绍一下Redis中管道操... 目录什么是pipeline场景一:我要向Redis新增大批量的数据分批处理事务( MULTI/EXE

Python循环缓冲区的应用详解

《Python循环缓冲区的应用详解》循环缓冲区是一个线性缓冲区,逻辑上被视为一个循环的结构,本文主要为大家介绍了Python中循环缓冲区的相关应用,有兴趣的小伙伴可以了解一下... 目录什么是循环缓冲区循环缓冲区的结构python中的循环缓冲区实现运行循环缓冲区循环缓冲区的优势应用案例Python中的实现库

SpringBoot整合MybatisPlus的基本应用指南

《SpringBoot整合MybatisPlus的基本应用指南》MyBatis-Plus,简称MP,是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,下面小编就来和大家介绍一下... 目录一、MyBATisPlus简介二、SpringBoot整合MybatisPlus1、创建数据库和

Linux中的进程间通信之匿名管道解读

《Linux中的进程间通信之匿名管道解读》:本文主要介绍Linux中的进程间通信之匿名管道解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基本概念二、管道1、温故知新2、实现方式3、匿名管道(一)管道中的四种情况(二)管道的特性总结一、基本概念我们知道多

Linux进程终止的N种方式详解

《Linux进程终止的N种方式详解》进程终止是操作系统中,进程的一个重要阶段,他标志着进程生命周期的结束,下面小编为大家整理了一些常见的Linux进程终止方式,大家可以根据需求选择... 目录前言一、进程终止的概念二、进程终止的场景三、进程终止的实现3.1 程序退出码3.2 运行完毕结果正常3.3 运行完毕

Linux命名管道方式

《Linux命名管道方式》:本文主要介绍Linux命名管道方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、命名管道1、与匿名管道的关系2、工作原理3、系统调用接口4、实现两个进程间通信二、可变参数列表总结一、命名管道1、与匿名管道的关系命名管道由mkf

python中time模块的常用方法及应用详解

《python中time模块的常用方法及应用详解》在Python开发中,时间处理是绕不开的刚需场景,从性能计时到定时任务,从日志记录到数据同步,时间模块始终是开发者最得力的工具之一,本文将通过真实案例... 目录一、时间基石:time.time()典型场景:程序性能分析进阶技巧:结合上下文管理器实现自动计时