当前位置: 首页 > news >正文

匿名管道+进程池+命名管道

mkfifo name_pipe

创建管道文件。

命名管道:

路径+文件名具有唯一性。

匿名管道:

进程池代码:

#include<iostream>
#include<unistd.h>
#include<cstdlib>
#include<cassert>
#include<vector>
#include<string>
#include<ctime>
#include<sys/types.h>
#include<sys/wait.h>#define PROCESS_NUM 5
#define MakeSeed() srand((unsigned long)time(nullptr))typedef void(*func_t)();using namespace std;
class subEp
{
public:    subEp(pid_t subId,int wirteFd):subId_(subId),wirteFd_(wirteFd){char nameBuffer[1024];snprintf(nameBuffer,sizeof nameBuffer,"process-%d[pid(%d)-fd(%d)]",num++,subId_,wirteFd_);name_=nameBuffer;}static int num;string name_;pid_t subId_;//进程idint wirteFd_;//fd[0] fd[1]文件描述符
};
int subEp::num=0;void downLoadTask()
{cout<<getpid()<<":下载任务\n"<<endl;sleep(1);
}
void ioTask()
{cout<<getpid()<<"IO任务\n"<<endl;
}
void flushTask()
{cout<<getpid()<<"刷新任务\n"<<endl;
}
void loadTaskFunc(vector<func_t>* out)
{assert(out);out->push_back(downLoadTask);out->push_back(ioTask);out->push_back(flushTask);
}
int recvTask(int readFd)
{int code=0;ssize_t s=read(readFd,&code,sizeof code);assert(s==sizeof(int));if(s==4) return code;else if(s<=0) return -1;
}void createSubProcess(vector<subEp>* subs,vector<func_t>& funcMap)
{for(int i=0;i<PROCESS_NUM;i++){int fds[2];int n=pipe(fds);assert(n==0);(void)n;pid_t id=fork();if(id==0){//子进程,进行读close(fds[1]);          while(true){//1.获取命令码,如果没有发送,子进程应该阻塞int commenCode=recvTask(fds[0]);//2.完成任务if(commenCode>=0&&commenCode<funcMap.size())funcMap[commenCode]();else if(commenCode==-1)break;}exit(0);}close(fds[0]);subEp sub(id,fds[1]);}
}
void sendTask(const subEp& process,int tasknum)
{cout<<"send task num"<<tasknum<<"sent to -> "<< process.name_<<endl;int n=write(process.wirteFd_,&tasknum,sizeof(tasknum));assert(n==sizeof(int));(void)n;
}
void loadBalanceContrl(vector<subEp> subs,vector<func_t> funcMap,int count)
{//进程个数int processnum=subs.size();//任务个数int tasknum=funcMap.size();bool quit=false;bool forever=(count==0?true:false);while(!quit){//1.选择一个字进程 --> vector<subEp> -> index 随机数int subIdx=rand()%processnum;//2.选择一个任务 --> vector<func_t> -> indexint taskIdx=rand()%tasknum;//3.将任务发送给选择的进程sendTask(subs[subIdx],taskIdx);sleep(1);if(!forever){count--;if(count==0)break;}//write quit -> read 0for(int i=0;i<processnum;i++){close(subs[i].wirteFd_);}}
}
void waitProcess(vector<subEp> process)
{int processnum=process.size();for(int i=0;i<processnum;i++){waitpid(process[i].subId_,nullptr,0);cout<<"wait sub process success ..."<<process[i].subId_<<endl;}
}
int main()
{MakeSeed();//1.建立子进程并建立和子进程通信的管道//1.1  加载方法表vector<func_t> funcMap;loadTaskFunc(&funcMap);//1.2创建子进程,并且维护好父进程通信信道vector<subEp> subs;createSubProcess(&subs,funcMap);//2.到达父进程,父进程控制子进程,负责负载均衡的想子进程发送命令码int taskCnt=3;loadBalanceContrl(subs,funcMap,taskCnt);//3.回收子进程信息waitProcess(subs);return 0;
}

 

#include <sys/ipc.h>#include <sys/shm.h>int shmget(key_t key, size_t size, int shmflg);

通过ftok()创建key

key能进行唯一性标识

共享内存原理理解:

1.进程间通信,是专门设计的,用来ipc

2.共享内存时一种通信方式,所有需要通信的进程均可以使用

3.OS中一定可能会同时存在很多共享内存

ipcs -m------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status  

 查看共享内存。

ipc资源的特征:

共享内存的生命周期是随OS的,不是随进程的。

client.cc

#include"comm.hpp"int main()
{int wfd=open(NAMED_PIPE,O_WRONLY);if(wfd<0) exit(1);char buffer[1024];while(true){cout<<"Please Say# ";fgets(buffer,sizeof(buffer),stdin);ssize_t n=write(wfd,buffer,strlen(buffer));assert(n=strlen(buffer));(void)n;}close(wfd);return 0;
}

 server.cc

#include"comm.hpp"int main()
{bool r=createFifo(NAMED_PIPE);// assert(r);// (void)r;int rfd=open(NAMED_PIPE,O_RDONLY);if(rfd<0) exit(1);//readchar buffer[1024];while(true){ssize_t s=read(rfd,buffer,sizeof(buffer)-1);if(s>0){buffer[s]=0;cout<<"client->server# "<<buffer<<endl;}else if(s==0){cout<<"client quit, me too!!!"<<endl;break;}else{cout<<"err string: "<<strerror(errno)<<endl;break;}}close(rfd);removeFifo(NAMED_PIPE);return 0;
}

 comm.hpp

#pragma once#include<iostream>
#include<cstring>
#include<cerrno>
#include<string>
#include<cassert>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>#define NAMED_PIPE "/tmp/mypipe.xxx"using namespace std;
bool createFifo(const string &path)
{umask(0);int n=mkfifo(path.c_str(),0600);if(n==0) return true;else{cout<<"errno: "<<errno<<"err string: "<<strerror(errno)<<endl;}
}
void removeFifo(const string &path)
{int n=unlink(path.c_str());assert(n==0);(void)n;
}

相关文章:

匿名管道+进程池+命名管道

mkfifo name_pipe 创建管道文件。 命名管道&#xff1a; 路径文件名具有唯一性。 匿名管道&#xff1a; 进程池代码&#xff1a; #include<iostream> #include<unistd.h> #include<cstdlib> #include<cassert> #include<vector> #include&…...

【深度学习】【语音TTS】OpenVoice: Versatile Instant Voice Cloning,论文

https://github.com/myshell-ai/OpenVoice https://arxiv.org/abs/2312.01479 文章目录 摘要1 引言2 方法2.1 直观思路2.2 模型结构2.3 训练细节3 结果4 结论摘要 我们介绍了OpenVoice,一种多功能的即时语音克隆方法,只需参考说话者的短音频片段即可复制其声音,并生成多语…...

一六零、云服务器开发机配置zsh

切换shell 在Linux中默认使用/bin/bash&#xff0c;在用户创建时&#xff0c;会自动给用户创建用户默认的shell。默认的shell就是/bin/bash。要修改shell将其设置为/bin/ksh&#xff0c;有两种方法方法 # 方法一: chsh -s /bin/ksh chsh -s /bin/zsh # 方法二: usermod -s /b…...

[ZJCTF 2019]NiZhuanSiWei1

打开题目 php代码审计 .从代码中可以看出要求&#xff0c;以get方式传递text,file,password三个参数。 3.第一层验证if(isset($text)&&(file_get_contents($text,r)"welcome to the zjctf")) 传入text&#xff0c;而且file_get_contents($text,r)之后内容…...

【网络安全】副业兼职日入12k,网安人不接私活就太可惜了!

暑假来了&#xff0c;很多同学后台私信我求做兼职的路子&#xff0c;这里&#xff0c;我整理了一份详细攻略&#xff0c;请大家务必查收&#xff0c;这可能会帮你把几个学期的生活费都赚够&#xff01; Up刚工作就开始做挖漏洞兼职&#xff0c;最高一次赚了12k&#xff0c;后面…...

[STM32]HAL库实现自己的BootLoader-BootLoader与OTA-STM32CUBEMX

目录 一、前言 二、BootLoader 三、BootLoader的实现 四、APP程序 五、效果展示 六、拓展 一、前言 听到BootLoader大家一定很熟悉&#xff0c;在很多常见的系统中都会存在BootLoader。本文将介绍BootLoader的含义和简易实现&#xff0c;建议大家学习前掌握些原理基础。 …...

鸿萌数据备份服务:中小型企业如何策划及实施云备份方案

天津鸿萌科贸发展有限公司从事数据安全服务二十余年&#xff0c;致力于为各领域客户提供专业的数据安全、数据备份、数据恢复、数据清除等解决方案与服务。 对于中小型企业来说&#xff0c;保护运营数据&#xff08;客户记录、财务文档和项目文件&#xff09;的重要性不言而喻…...

x264 编码过程中延迟逻辑分析

编码延迟相关参数 相关参数:在 common.h文件中 frames 结构体中声明关于编码延迟的变量int i_delay; /* Number of frames buffered for B reordering */ int i_bframe_delay; int64_t i_bframe_delay_time;编码延迟计算 编码延迟计算:在x264_encoder_open函数和x264_…...

前端框架 element-plus 发布 2.7.8

更新日志 功能 组件 [级联选择器 (cascader)] 添加持久化属性以提升性能 (#17526 by 0song)[日期选择器 (date-picker)] 类型添加月份参数 (#17342 by Panzer-Jack)[级联选择器 (cascader)] 添加标签效果属性 (#17443 by ntnyq)[加载 (loading)] 补充加载属性 (#17174 by zhixi…...

2024.8.1(前端服务器的配置以及tomcat环境的配置)

回顾 [roottomcat ~]# cd eleme_web/public/img/ [roottomcat img]# ls 1.jpg [roottomcat public]# cd [roottomcat ~]# cd eleme_web/ [roottomcat eleme_web]# cd src [roottomcat src]# vim views/HomeView.vue [roottomcat src]# nohup npm run serve ctrlc后网页不出…...

使用 宝塔面板 部署 语料库php网站

【语料库网站】宝塔面板 在线部署全过程 代码仓库&#xff1a;https://github.com/talmudmaster/RedCorpus 网站介绍 语料库提供双语文本检索和分享功能。供英语、翻译相关专业的爱好者&#xff0c;学生和老师学习使用。 该网站是对BiCorpus开源项目的二次开发。 技术栈&am…...

springboot农产品报价系统-计算机毕业设计源码37300

摘 要 本研究基于鸿蒙系统&#xff0c;设计开发了一款农产品报价系统小程序&#xff0c;旨在帮助商家与买家更便捷、高效地进行交易。该系统利用鸿蒙系统的优势&#xff0c;实现了跨平台应用程序的开发&#xff0c;同时利用定位技术和数据采集技术&#xff0c;为用户提供了个性…...

食源送系统项目的测试

一、对整个系统编写测试用例 功能测试 性能测试 兼容性测试 易用性测试 安全测试 二、接口测试 针对接口的功能测试&#xff0c;也就是检验接口是否按照接口文档输入输出 2.1 使用Postman发送HTTP请求 2.2 使用Java TestNG 编写自动化测试用例 登录界面功能 package com.sky.…...

JS解构赋值

可以将数组中的值或对象的属性取出&#xff0c;赋值给其他变量。 例如 Let [a, …b] [1, 2, 3]; // a 1, b [2, 3]; let {a, b, …rest} {a : 10, b : 20, c : 30, d : 40}; // a 10, b 20, rest {c : 30, d : 40};...

多多OJ评测系统 前端项目环境初始化 安装Vue脚手架 引入Arco Design组件

目录 确定环境 命令行输入 装一下脚手架 监测一下是否安装成功 创建一个项目 选择一系列的配置后 我们打开webStorm 配置脚手架后我们先运行 我们这边能获取到网址 其实我们脚手架已经帮我们做到了 接下来要引入相关的组件 选择用npm进行安装 我们建议的是完整引入…...

OceanBase 配置项系统变量实现及应用详解(4):新增系统变量

本专题的前几篇文章已经详细阐述了OceanBase的配置项和系统变量的基础用法&#xff0c;并对配置项的源码进行了剖析。但有一些同学可能还对系统变量的实现方式有兴趣&#xff0c;并希望能够像自定义配置项那样&#xff0c;新增一个系统变量。 本文将围绕“如何新增系统变量”这…...

`CAUTION: request is not finished yet!`

前言&#xff1a; 在一次与后台的接口联调中&#xff0c;数据量很大&#xff0c;导致页面卡顿&#xff0c;经排查&#xff0c;浏览器的某个接口显示CAUTION: request is not finished yet! 之前没遇到过这个错误&#xff0c;获取数据的接口开始进行请求&#xff0c;状态码返回…...

科研绘图系列:R语言GWAS曼哈顿图(Manhattan plot)

介绍 曼哈顿图(Manhattan Plot)是一种常用于展示全基因组关联研究(Genome-Wide Association Study, GWAS)结果的图形。GWAS是一种研究方法,用于识别整个基因组中与特定疾病或性状相关的遗传变异。 特点: 染色体表示:曼哈顿图通常将每个染色体表示为一个水平条,染色体…...

DjangoRF-11-创建testcases子应用--任务模块

这里先写任务应用&#xff0c;再写套件&#xff0c;然后写接口&#xff0c;最后再写请求&#xff0c; 这个是新的应用&#xff0c;要创建子应用&#xff0c;然后添加到settings的注册里面 1、和往常一样先写模型&#xff0c;序列化&#xff0c;权限&#xff0c;视图&#xf…...

服务器数据恢复—SAN环境下LUN被重复映射导致写操作不互斥的数据恢复案例

服务器存储数据恢复环境&#xff1a; 一台存储中有一组由6块硬盘组成的RAID6&#xff0c;划分为若干LUN&#xff0c;MAP到不同业务的SOLARIS操作系统服务器上。 服务器存储故障&#xff1a; 由于业务变化需要增加一台服务器&#xff0c;在存储在线的状态下将该存储中的某个LUN映…...

Linux系统安全加固:从防火墙到SELinux策略

1. iptables防火墙配置 •基础规则设定&#xff1a;学习如何设置iptable的基本规则&#xff0c;包括允许/拒绝特定端口的进出流量&#xff0c;限制特定IP地址的访问等。 •状态检查&#xff1a;利用iptables的状态检查功能&#xff0c;只允许已建立连接或相关联的流量通过&am…...

排序算法:归并排序,golang实现

目录 前言 归并排序 代码示例 1. 算法包 2. 归并排序代码 3. 模拟程序 4. 运行程序 5. 从大到小排序 归并排序主要操作 1. 合并 2. 分割&#xff08;Divide&#xff09;与递归排序&#xff08;Conquer&#xff09; 总体思想 循环次数测试 假如 10 条数据进行排序…...

CSS 的工作原理

我们已经学习了CSS的基础知识,它的用途以及如何编写简单的样式表。在本课中,我们将了解浏览器如何获取 CSS 和 HTML 并将其转换为网页。 先决条件:已安装基本软件,了解处理文件的基本知识以及 HTML 基础知识(学习 HTML 简介。目的:要了解浏览器如何解析 CSS 和 HTML 的基…...

买完就后悔?只需几步教你 Apple 怎么申请退款

苹果系统不同于 Android 系统的一点在于下载某一些 App 的时候需要付费才能下载&#xff0c;但是有时候在我们付费之后突然就不想要购买了怎么办呢&#xff1f;别急这可以申请退款&#xff0c;你知道 Apple 怎么申请退款吗&#xff1f;下面就带大家了解一下 Apple 申请退款的步…...

【保卫战】休闲小游戏 链游

...

如何构建自己的交易机器人开发环境

作者&#xff1a;老余捞鱼 原创不易&#xff0c;转载请标明出处及原作者。 写在前面的话&#xff1a; 本文主要讲解如何构建一个交易机器人开发环境。描述具体的步骤和工具&#xff0c;包括使用 GitHub Codespaces、Visual Studio Code&#xff08;VS Code&#xff09;…...

解决WordPress文章引用的图片不显示问题

在使用WordPress发布文章时&#xff0c;有时会遇到复制发布的文档中包含的外链图片无法正常显示的问题。然而&#xff0c;当我们将图片路径复制到浏览器中单独打开时&#xff0c;图片却可以正常显示。以下是解决这一问题的方法。 问题描述 当你在WordPress文章中引用外链图片…...

商业银行国际结算规模创新高,合合信息AI助力金融行业智能处理多版式文档

随着我国外贸新业态的快速增长&#xff0c;银行国际结算业务在服务实体经济发展、促进贸易投资便利化进程中发挥了越来越重要的作用。根据中国银行业协会近日发布的《中国贸易金融行业发展报告&#xff08;2023—2024&#xff09;》&#xff0c;2023年我国主要商业银行国际结算…...

数字芯片设计验证经验分享:将ASIC IP核移植到FPGA上——更新概念并推动改变以完成充满挑战的任务!

作者&#xff1a;Philipp Jacobsohn&#xff0c;SmartDV首席应用工程师 Sunil Kumar&#xff0c;SmartDV FPGA设计总监 本系列文章从数字芯片设计项目技术总监的角度出发&#xff0c;介绍了如何将芯片的产品定义与设计和验证规划进行结合&#xff0c;详细讲述了在FPGA上使用I…...

【Linux】Linux下的日志(日常级)

日志是日后工作中非常重要的一部分&#xff0c;现在写一份简单的日志项目可以帮助我们熟悉并理解原理。 目录 设计思路&#xff1a;一些实现细节&#xff1a;代码&#xff1a;日志的使用方法&#xff1a; 设计思路&#xff1a; 图示是我们的最终目的。 设计一个类&#xff0…...

做网站的如何说服客户/关键词优化搜索引擎

如何在静默模式下运行CMD或.bat文件&#xff1f; 我希望防止向用户显示CMD界面。包括短语echo off在您的蝙蝠脚本的顶部。感谢您的编辑moocha。对其进行了一些改进(格式化&#xff0c;在前面添加了&#xff0c;以便echo语句本身不会导致输出。)但是&#xff0c;这不会阻止调用的…...

网站推广设计方案目标怎么写/百度推广平台登录网址

uname 不等于 passwd&#xff0c;sha1 值不能一样&#xff0c;id 就是 margin php_sha1 碰撞&#xff0c;其中 php_sha1() 函数不能处理数组&#xff0c;可以用数组绕过 得到 flag...

wordpress自定义小工具/品牌网络营销策划

阅读本文需要提前了解 connect 和 ProcessFunction 相关的知识。如果不了解的同学可以先通过官网或其他资料熟悉一下。一、案例分析在生产环境中&#xff0c;我们经常会遇到双流匹配的案例&#xff0c;例如&#xff1a;一个订单包含了订单主体信息和商品的信息。外卖行业&#…...

河北邯郸网站建设公司/厦门seo厦门起梦

学习Office自动化之前先阅读一些COM书籍&#xff0c;对于理解Office自动化有很大帮助。以下示例代码使用VS2010进行编译。目前市面上已有的关于Office自动化的书籍&#xff0c;多是快餐式的&#xff0c;看过之后只能知道最基本的使用。要想更多的了解&#xff0c;非得MSDN不可。…...

创鑫云网络/采集站seo提高收录

JAVA LOCK总体来说关键要素主要包括3点: 1.unsafe.compareAndSwapXXX(Object o,long offset,int expected,int x) 2.unsafe.park() 和 unsafe.unpark() 3.单向链表结构或者说存储线程的数据结构 第1点 主要为了保证锁的原子性&#xff0c;相当于一个锁是否正在被使用的标记&…...

威特视频网站建设方案/西安竞价托管公司

题目描述 变化规则:对于两个单词x和y&#xff0c;如果可以通过删除、添加或者修改1个字母得y&#xff0c;称为1次转换. 给出一个按「字典序」排列的字符串序列w1,Pw2.…wn,求其中一个子序列个子序列的每一项可以由前一项一次转换而来,,且该子序列是按字典序排列的&#xff0c;…...