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

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 Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

C语言中位操作的实际应用举例

《C语言中位操作的实际应用举例》:本文主要介绍C语言中位操作的实际应用,总结了位操作的使用场景,并指出了需要注意的问题,如可读性、平台依赖性和溢出风险,文中通过代码介绍的非常详细,需要的朋友可以参... 目录1. 嵌入式系统与硬件寄存器操作2. 网络协议解析3. 图像处理与颜色编码4. 高效处理布尔标志集合

Redis Pipeline(管道) 详解

《RedisPipeline(管道)详解》Pipeline管道是Redis提供的一种批量执行命令的机制,通过将多个命令一次性发送到服务器并统一接收响应,减少网络往返次数(RTT),显著提升执行效率... 目录Redis Pipeline 详解1. Pipeline 的核心概念2. 工作原理与性能提升3. 核

Python如何精准判断某个进程是否在运行

《Python如何精准判断某个进程是否在运行》这篇文章主要为大家详细介绍了Python如何精准判断某个进程是否在运行,本文为大家整理了3种方法并进行了对比,有需要的小伙伴可以跟随小编一起学习一下... 目录一、为什么需要判断进程是否存在二、方法1:用psutil库(推荐)三、方法2:用os.system调用

Java中的Lambda表达式及其应用小结

《Java中的Lambda表达式及其应用小结》Java中的Lambda表达式是一项极具创新性的特性,它使得Java代码更加简洁和高效,尤其是在集合操作和并行处理方面,:本文主要介绍Java中的La... 目录前言1. 什么是Lambda表达式?2. Lambda表达式的基本语法例子1:最简单的Lambda表

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