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

培训网站 建江山企业自适应网站建设首选

培训网站 建,江山企业自适应网站建设首选,珠海网站建设那家好,王者荣耀wordpress前言#xff1a;大佬写博客给别人看#xff0c;菜鸟写博客给自己看#xff0c;我是菜鸟。 1.实现思路 思路#xff1a;通过创建匿名管道#xff0c;来实现父子进程之间的通信 注1#xff1a;父写#xff0c;子读 注2#xff1a;匿名管道只能用来进行具有血管关系的进程…前言大佬写博客给别人看菜鸟写博客给自己看我是菜鸟。 1.实现思路 思路通过创建匿名管道来实现父子进程之间的通信 注1父写子读 注2匿名管道只能用来进行具有血管关系的进程进行进程间的通信 ①.父进程通过for循环创建五个管道和子进程管道与子进程间一一对应。五个子进程处于阻塞状态等待父进程向管道内写入数据。 注父进程在创建子进程时子进程会继承父进程的所有数据包括管道。 ②.通过自定义类Channel管理类成员 pipefd[0]和子进程的pid 注当管道创建时同一管道间的pipe[0]和pipe[1]是一一对应的即假设我向管道1写入那么子进程则会从管道1读取数据 ③.大体结构——创建三个自定义类 Ⅰ.管道(Channel) 成员包含pipe[0]以及对应子进程建立管道和子进程间一一对应的关系 函数包含向管道写入数据、管道关闭、等待子进程 Ⅱ.管道管理(Channel) 成员包含通过vectorChannel _channel 对管道数据进行管理 函数包含管道选取、管道关闭、子进程回收。 Ⅲ.进程池(ProcessPool) 成员包含管道管理实例化对象_cm、任务管理实例化对象_tm、进程数量/管道数量 函数包含进程池初始化/创建、子进程阻塞等待管道写入并执行、执行任务 注父进程创建管道后(该管道会返回文件描述符假设为34)再创建子进程子进程能够进程父进程的管道。因为父进程负责写入因此需要把读取端口关掉假设关闭3。这样父进程就通过文件描述符4向管道写入数据。而整个管道的创建过程是循环创建的当父进程再次创建管道时此时文件描述符为3、5重复刚才的操作这样父进程就能通过文件描述符5向管道写入数据直至所有管道创建完毕。 问既然子进程会继承父进程那在第二次或者后面的循环过程中子进程会不会继承父进程的写端从而实现子进程向管道写入 答会 问这样子会出现什么问题 答当我们通过父进程关闭管道回收子进程时你以为管道已经关闭了但实际上还有子进程能够向这个管道进行写入操作实际上管道未关闭子进程并不会退出而是会阻塞。 解决措施1从后往前关闭管道对于最后一个管道而言没有子进程能够向其写入父进程是唯一的写入端因此关闭这个管道后子进程能够顺利关闭因为信道关闭了子进程也就退出了而当前子进程能够向上一个管道写入但是当前子进程退出了因此上一个管道的写入端就少了一个(实际上关闭当前子进程后上一个管道的写入端就只剩父进程一个了这样循环向上就能够确保通过父进程能够关闭所有的管道从而使得所有的子进程关闭而非处于阻塞状态) 解决措施2创建子进程后在处理子进程时遍历vectorChannel _channel因为内部存储了所有管道对应的写端然后在子进程内调用  _channel.Close();关闭所有写端 问这样调用子进程是否会关闭父进程的管道 答不会父子进程相互独立。父子进程如果要修改原始数据会发生写实拷贝。 匿名管道的创建方式 int pipefd[2] {0}; int n pipe(pipefd); 其中 pipefd[0]为输入\向管道读 pipefd[1]为输出\从管道写 2.实现代码 2.1Main.cc 主要分三部分 ①.进程池初始化 ②.执行任务 ③.回收、结束进程池 int main() {// 创建进程池对象ProcessPool pp(gdefaultnum);// 启动进程池pp.Start();// 自动派发任务int cnt 10;while(cnt--){pp.Run();sleep(1);}// 回收结束进程池pp.Stop();return 0; } 2.2进程池(ProcessPool) 2.2.1进程池大体成员以及函数 class ProcessPool { public:ProcessPool(int num) : _process_num(num){//进程池创建时等级需要执行的任务这部分通过另一个自定义类来实现}void Work(int rfd){//子进程阻塞等待父进程向管道写入数据读取后执行相应任务}bool Start(){//进程池初始化}void Run(){//执行任务}void Stop(){//关闭管道、回收子进程}~ProcessPool(){}private:ChannelManager _cm;int _process_num;TaskManager _tm; }; 2.2.2任务登记/管理 TaskManager自定义类 通过函数指针/随机函数来实现任务的随机选取 typedef void (*task_t)(); //函数指针void Task1() {std::cout 印日志的任务 std::endl; }void Task2() {std::cout 下载的任务 std::endl; }void Task3() {std::cout 上传的任务 std::endl; }class TaskManager { public:TaskManager(){srand(time(nullptr));//生成随机数种子}void Register(task_t t){_tasks.push_back(t);//将当前函数指针插入到vector数组中}int Code(){return rand() % _tasks.size();//返回一个随机数大小不超过最大任务数量-1}void Execute(int code) //根据code执行相应任务{if(code 0 code _tasks.size()){_tasks[code]();//回调函数}}~TaskManager(){} private:std::vectortask_t _tasks; }; 开始时将所有任务插入vectortask_t _tasks中 ProcessPool(int num) : _process_num(num){_tm.Register(Task1);_tm.Register(Task2);_tm.Register(Task3);} 注这部分可以自定义写你想要实现的任务即可。 2.2.3进程池初始化 大致思路为外循环循环五次 ①.每次创建一个管道 ②.每次创建一个子进程 ③.关闭父子进程相应的管道父写子读 ④.子进程执行阻塞等待 / 父进程执行将当前通道信息(pipefd[1])和对应子进程subid通过ChannelManager插入到verctorChannel _channels 中。 bool Start(){for (int i 0; i _process_num; i){// 1. 创建管道int pipefd[2] {0};int n pipe(pipefd);if (n 0)return false;// 2. 创建子进程pid_t subid fork();if (subid 0)return false;else if (subid 0){// 子进程//关闭不需要的写端_cm.CloseAll();// 3. 关闭不需要的文件描述符close(pipefd[1]);Work(pipefd[0]); close(pipefd[0]);exit(0);}else{// 父进程// 3. 关闭不需要的文件描述符close(pipefd[0]); // 写端pipefd[1];_cm.Insert(pipefd[1], subid);} }return true;} 注上述循环过程结束后通过_cm.Insert();创建了五个自定义类_channels这五个_channels中包含了 1.各自的管道 2.对应的子进程pid 后续在关闭管道后可以通过pid来回收子进程对应管道关闭了子进程就没有存在的必要了                      2.2.4子进程阻塞等待父进程写入 void Work(int rfd){while (true){int code 0;ssize_t n read(rfd, code, sizeof(code));if (n 0){if (n ! sizeof(code)){continue;}std::cout 子进程[ getpid() ]收到一个任务码: code std::endl;_tm.Execute(code);}else if (n 0){std::cout 子进程退出 std::endl;break;}else{std::cout 读取错误 std::endl;break;}}} 注read返回值的含义 当 n 0: 成功读取数据n表示实际读取的字节数 当 n 0管道关闭或者没有更多数据可读表示读到了流的末尾 当 n 0:读取出错 如果管道内没有数据read()调用会阻塞直到有数据可读取。因此不会直接调用n0的逻辑。 如果管道关闭或没有更多数据read返回0进入 n0 的逻辑表示子进程退出 2.2.5父进程向管道写入数据 void Run(){// 1. 选择一个任务int taskcode _tm.Code();//返回一个随机数随机数不大于总任务个数// 2. 选择一个信道[子进程],负载均衡的选择一个子进程完成任务auto c _cm.Select();// 3. 向管道写入数据/发送任务然后2.2.4中的子进程会读取到管道中的数据并开始执行任务c.Send(taskcode);} 2.3管道(Channel) 2.3.1管道大体成员以及函数 class Channel { public:Channel(int fd, pid_t id) : _wfd(fd), _subid(id){//实例化对象中包含写入管道的接口以及子进程pid }~Channel(){}void Send(int code){//向管道写入数据int n write(_wfd, code, sizeof(code));(void)n; // ?}void Close(){//关闭管道close(_wfd);}void Wait(){//进程等待pid_t rid waitpid(_subid, nullptr, 0);(void)rid;} private:int _wfd;pid_t _subid; }; 2.4管道管理(ChannelManager) 2.4.1管道管理大体成员以及函数 class ChannelManager { public:ChannelManager() : _next(0){}void Insert(int wfd, pid_t subid){//_channels.emplace_back(wfd, subid);}//管道选取Channel Select(){auto c _channels[_next];_next;_next % _channels.size();return c;}//管道关闭//void StopSubProcess()//{// for (auto channel : _channels)// {// channel.Close();// std::cout 关闭: channel.Name() std::endl;// }//}//回收子进程//void WaitSubProcess()//{// for (auto channel : _channels)// {// channel.Wait();// std::cout 回收: channel.Name() std::endl;// }//}//关闭子进程中多余的写窗口void CloseAll(){for(auto C : _channel){C.Close();}{//从后往前关void CloseAndWait(){for (int i _channel.size()-1; i0; i--){channel.Close();std::cout 关闭: channel.Name() std::endl;channel.Wait();std::cout 回收: channel.Name() std::endl;}}~ChannelManager() {}private:std::vectorChannel _channels;//通过vectorChannel 将实例化的管道管理起来int _next; }; 3.命名管道 匿名管道通过父子进程之间的继承关系能够使得父子进程间看到同一份资源。 问那么对于两个没有任何血缘关系的进程而言如何能看到同一份资源 答通过命名管道——打开同一个路径下的同一个文件文件有路径路径具有唯一性 3.1命名管道的创建 int mkfifo ( const char *filename, mode_t mode); 例 mkfifo( fifo , 0644 ); 3.2匿名管道和命名管道的区别 ①匿名管道由pipe函数创建并打开 ②命名管道由mkfifo创建并由open打开 注这样一看命名管道是不是和文件很相似
http://www.hkea.cn/news/14311258/

相关文章:

  • 网站建设找酷风了解网站建设
  • 网站怎么办网站被k怎么恢复
  • 鞍山网站页设计制作建设与管理局网站
  • 玉溪网站建设现状wordpress评论后不显示
  • 怎么做一淘宝客网站吗wordpress集成文库插件
  • 上海营销型网站制作湖北专业网站制作公司
  • 管城郑州网站建设wordpress 页面和菜单
  • 怎么创建网站自己创建wordpress官网插件
  • 建设好网站能赚到钱吗?成都建网站要多少钱
  • 珠海网站哪家好wordpress如何qq登录界面
  • 西宁市网站设计企业软件开发合同范本免费下载
  • 凡科建站怎么删除网站建设the7 wordpress哪个好
  • 做外贸推广的网站如何做互联网创业
  • 网站备案通过wordpress前台显示英文
  • 个人网站名称大全举报网站建设
  • 做平面设计在什么网站能挣钱服务器怎么建网站
  • 网站建设制作网站合肥婚恋网站建设
  • 防水补漏在哪个网站做宣传好做办公室的网站
  • 杭州网站建设杭州京津冀协同发展规划纲要
  • 做我女朋友程序网站酷家乐装修设计官网
  • 国家精品资源共享课程建设网站做渔家乐哪个网站最好
  • 网站的建设方法有哪些专业小程序开发
  • 贵州省城市建设厅网站各大网站收录提交入口
  • 网站建设业务员的工作总结及计划wordpress指定目录文章
  • 注册公司的网站是什么新浪sae安装wordpress
  • 网站模块数据同步图片在线制作二维码
  • 中国造价工程建设管理协会网站北京网站建设明细
  • 音乐网站建设手机网站制作系统
  • 如何以目录形式访问网站内蒙古自治区建设厅网站
  • 电商平台门户网站建设的重要性襄阳专业网站建设公司