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

有多少网站建设外包网站建设公司如何发展

有多少网站建设外包,网站建设公司如何发展,南京网站设计网站,如何优化百度seo排名【Linux进程间通信】用管道实现简单的进程池、命名管道 目录 【Linux进程间通信】用管道实现简单的进程池、命名管道为什么要实现进程池#xff1f;代码实现命名管道创建一个命名管道 理解命名管道匿名管道与命名管道的区别命名管道的打开规则 作者#xff1a;爱写代码的刚子…【Linux进程间通信】用管道实现简单的进程池、命名管道 目录 【Linux进程间通信】用管道实现简单的进程池、命名管道为什么要实现进程池代码实现命名管道创建一个命名管道 理解命名管道匿名管道与命名管道的区别命名管道的打开规则 作者爱写代码的刚子 时间2024.2.10 前言本篇博客将会介绍并实现简单的线程池 为什么要实现进程池 系统调用是有成本的池化技术是为了我们的访问速度和效率在需要频繁的创建删除较多进程的情况下,导致计算机资源消耗过多进程池则是创建指定进程数量等待执行事件避免了不必要的创建和销毁过程 代码实现 ProcessPool_Task.hpp #pragma once#include iostream #include functional #include vectorusing task_tstd::functionvoid(); //typedef void(*task_t)(); void task1() {std::couttask1std::endl; }void task2() {std::couttask2std::endl; }void task3() {std::couttask3std::endl; }void task4() {std::couttask4std::endl; }void LoadTask(std::vectortask_t *tasks) {tasks-push_back(task1);tasks-push_back(task2);tasks-push_back(task3);tasks-push_back(task4);}ProcessPool.cc #include ProcessPool_Task.hpp #include string #include vector #include ctime #include unistd.h #include cstdlib #include cassert #include iostream#include sys/wait.h #include sys/stat.hconst int processnum 5; //描述std::vectortask_t tasks; class channel { public:channel(int cmdfd,int slaverid,const std::string processname):_cmdfd(cmdfd),_slaverid(slaverid),_processname(processname){}public:int _cmdfd;pid_t _slaverid;std::string _processname; };void slaver() {while(true){int cmdcode 0;int n read(0,cmdcode, sizeof(int));//如果父进程不给子进程发送数据则会阻塞等待if(n sizeof(int)){//执行cmdcode对应的任务列表std::cout slaver say get a command: getpid() : cmdcode: cmdcode std::endl;if(cmdcode 0 cmdcodetasks.size()) tasks[cmdcode]();}if(n 0)break;} } //参数规范 //输入const //输出* //输入输出void InitProcessPool(std::vectorchannel *channels) {//确保每一个子进程都只有一个写端std::vectorint oldfds;for(int i0;iprocessnum;i){int pipefd[2];//临时空间int n pipe(pipefd);assert(!n);(void)n;pid_t id fork();if(id0)//子进程,子进程拿到的pipefd都是3{std::cout child getpid() close history fd: ;for(auto fd : oldfds) {std::coutfd ;close(fd);}std::cout\n;close(pipefd[1]);dup2(pipefd[0],0);//将pipefd[0]重定向到0将来直接往键盘文件fd为0文件里面读即可。close(pipefd[0]);slaver();std::cout process : getpid() quit std::endl;//方法一//slaver(pipefd[0]);exit(0);}//父进程,父进程拿到的pipefd是456...close(pipefd[0]);//添加channel字段std::string name process- std::to_string(i);channels-push_back(channel(pipefd[1],id,name ));//pipefd[1]表示父进程要往pipefd[1]里面写oldfds.push_back(pipefd[1]);} }void Debug(const std::vectorchannel channels) {for(const auto c : channels){std::coutc._cmdfd c._slaverid c._processname std::endl;} }void ctrlSlaver(const std::vectorchannel channels) {int which 0;//轮转的方式while(true){//1.选择任务int cmdcode rand()%tasks.size();//2.选择进程//[负载均衡(1.随机数 2.轮转)]int processpos rand()%channels.size();//3.发送任务write(channels[which]._cmdfd,cmdcode,sizeof(cmdcode));which;which % channels.size();sleep(1);} }void QuitProcess(const std::vectorchannel channels) {//for(const auto c : channels) close(c._cmdfd);//for(const auto c : channels) waitpid(c._slaverid,nullptr,0);//这里存在子进程有多个写端的问题解决办法//方法一.从后往前关闭子进程int last channels.size()-1;for(int i last;i 0;i--){close(channels[i]._cmdfd);waitpid(channels[i]._slaverid,nullptr,0);}//方法二.确保每一个子进程都只有一个写端} int main() {LoadTask(tasks);//随机数srand(time(nullptr)^getpid()^1023);//组织std::vectorchannel channels;//将特定的结构转化为数据的增删查改//初始化InitProcessPool(channels);Debug(channels);//控制子进程ctrlSlaver(channels);//清理收尾QuitProcess(channels);return 0; }图解 命名管道 管道应用的一个限制就是只能在具有共同祖先具有亲缘关系的进程间通信。 如果我们想在不相关的进程之间交换数据可以使用FIFO文件来做这项工作它经常被称为命名管道。 命名管道是一种特殊类型的文件 创建一个命名管道 $ mkfifo filename在命令行上创建命名管道 p开头表示这是命名管道但是并不在磁盘上,同时管道文件的大小为0 *int mkfifo(const char filename, mode_t mode); 程序中创建命名管道的函数 理解命名管道 不同的两个进程打开同一个文件的时候在内核中操作系统文件描述符只会指向同一个文件进程间通信的前提先让不同的进程看到同一份资源管道文件则不需要进行刷盘内存级文件所以大小为0字节。 【问题】如何保证打开的是同一个文件看到同一个路径下的同一个文件名。inode即 路径 文件名唯一性 匿名管道与命名管道的区别 匿名管道由pipe函数创建并打开。 命名管道由mkfifo函数创建打开用open FIFO命名管道与pipe匿名管道之间唯一的区别在它们创建与打开的方式不同一但这些工作完成之后它们具有相同的语义。 命名管道的打开规则 如果当前打开操作是为读而打开FIFO时 O_NONBLOCK disable阻塞直到有相应进程为写而打开该FIFOO_NONBLOCK enable立刻返回成功 如果当前打开操作是为写而打开FIFO时 O_NONBLOCK disable阻塞直到有相应进程为读而打开该FIFOO_NONBLOCK enable立刻返回失败错误码为ENXIO
http://www.w-s-a.com/news/269593/

相关文章:

  • 网站的流量怎么赚钱经销做网站都有什么好处
  • 如何做好网站首页企术建站
  • 杭州网站建设咨询蓝韵网络聊城有制作网站的吗
  • 网站开发注意的事项深圳企业网站
  • 哈尔滨网站制作哪里专业网站建设维护有哪些内容
  • 花的网站建设规划书网络营销培训
  • 又拍云wordpress全站cdn无锡做网站品牌公司
  • 计算机网络工程网站建设黄石建设信息网站
  • 旅游网站开发毕业设计开题报告青岛网站建设服务公司
  • 人员调动在网站上怎么做网站开发课程意见和建议
  • 卓训网是个什么网站wordpress命令执行时间
  • 网站建设需要做哪些工作网片焊接
  • 网站优化方案dedecms win8风格网站模板
  • 企业如何制作网站管理系统慈溪住房和城乡建设部网站
  • 青岛网站建设有哪些公司区块链网站开发价格
  • 怎么设置网站的logo微信公众号的h5网站开发6
  • 粉色的网站绍兴市建设局网站
  • 个人网站的基本风格是wordpress 模板选择
  • 南昌专业做网站公司有哪些广州市住房城乡建设部门户网站
  • 福州网站建设团队淘宝联盟网站怎么建设
  • 福州企业网站建站模板国内黑色风格的网站
  • 好看的网站首页设计android移动开发
  • 域名注册完成后如何做网站域名 删除 wordpress
  • wordpress xml导入大小东莞seo优化方案
  • 网站建设效益网站销售怎么做的
  • 利用网站空间做代理设计方案的格式范文
  • 无锡建设工程质量监督网站遵义做手机网站建设
  • 衡阳商城网站制作ps做网站首页规范尺寸
  • 微信网站应用开发营销推广的方案
  • 广州做网站商城的公司制作一个app的完整流程