公众号里的电影网站怎么做的wordpress超链接颜色

pingmian/2026/1/23 8:20:34/文章来源:
公众号里的电影网站怎么做的,wordpress超链接颜色,建网站找汉狮,电子商务网站建设技术文章目录 1、理解Epoll和对应接口2、简单实现 1、理解Epoll和对应接口 poll依然需要OS去遍历所有fd。一个进程去多个特定的文件中等待#xff0c;只要有一个就绪#xff0c;就使用select/poll系统调用#xff0c;让操作系统把所有文件遍历一遍#xff0c;哪些就绪就加上哪… 文章目录 1、理解Epoll和对应接口2、简单实现 1、理解Epoll和对应接口 poll依然需要OS去遍历所有fd。一个进程去多个特定的文件中等待只要有一个就绪就使用select/poll系统调用让操作系统把所有文件遍历一遍哪些就绪就加上哪些fd再返回。一旦文件太多了遍历效率就显而易见地低。epoll是为处理大批量句柄而作了改进的poll句柄就是访问某种资源时标识这个资源的东西比如C语言中的FILE结构体文件描述符等。不过select/poll并不是没有用处一些老型操作系统并不支持epoll就得使用poll或者select。epoll是在Linux内核2.5.44时引入的到现在为止都是Linux中最高效的多路转接IO方案。 epoll有3个接口。 size是一个被忽略的参数只要大于0就行。如果成功返回一个epoll文件描述符在系统内部创建一些数据结构帮助进行已就绪的fd的管理暂且叫做epoll模型失败返回-1。不用这个epoll文件描述符后要close(epollfd)。 创建后用户要告诉内核应当关心哪个文件描述符上的哪个事件是否就绪select通过一个位图结构fd_set来实现poll通过poll_fd来实现的。另外内核要告诉用户关心的哪些fd上的哪些事件event已经就绪了。epoll还有两个接口去做这两个事。 epfd就是创建函数的返回值op表示想做什么有3个值EPOLL_ADDEPOLL_MODEPOLL_DEL分别是添加、修改、删除fd表示哪一个fdevent表示这个fd上的哪个事件要被关心。 进行等待的接口。返回值和selectpoll接口一样就绪的fd数量timeout的作用和poll一样输入型参数单位是毫秒ms为0表示非阻塞小于0表示阻塞大于0poll在这段时间内阻塞等待如果一直没有事件就绪那么超过时间就返回0中间两个参数是输出型参数操作系统通过这两个告知用户就绪的fd上就绪的事件event。 events是一个32位整数用户输入的是关心的事件返回时操作系统通过这个整数来告诉用户哪些fd的events事件就绪了data的类型是一个联合体通常会使用prt或者fd。events有几种取值 EPOLLIN表示对应的文件描述符可以读 (包括对端SOCKET正常关闭) EPOLLOUT表示对应的文件描述符可以写 EPOLLPRI表示对应的文件描述符有紧急的数据可读 (这里应该表示有带外数据到来) EPOLLERR表示对应的文件描述符发生错误 EPOLLHUP表示对应的文件描述符被挂断 EPOLLET将EPOLL设为边缘触发(Edge Triggered)模式这是相对于水平触发(Level Triggered)来说的 EPOLLONESHOT只监听一次事件当监听完这次事件之后如果还需要继续监听这个socket的话需要 再次把这个socket加入到EPOLL队列里 上面的就是宏。这里只关心EPOLLIN和EPOLLOUT。 TCP报头中6个标记位中有一个代表PSH用来提示对方应用层立刻从接收缓冲区读取数据。但PSH并不一定能让应用层读取数据它的催促是让套接字观察的fd对应的文件里的数据处于就绪状态。 操作系统可以把数据从应用层拷贝到缓冲区然后将数据交给网卡。当网卡收到数据后网卡会发送硬件中断操作系统通过查看中断向量表知道发来的中断号是网卡的所以就知道网卡有了数据。select/poll都是在软件层面去检测是否有数据的。 CPU有对应的寄存器寄存器是二进制序列是一种存储单元由硬件电路构成。数据拷贝到CPU的硬件本质是利用高低电频对CPU内的寄存器进行充放电让CPU的寄存器变成和内存一样的值。CPU和所有外设之间都有针脚间接相连。发送中断就像是某个外设产生电流从和它间接相连的针脚向寄存器充电把数据放到寄存器中。之后网卡就可以发送中断号让CPU拷贝数据到内存了。所以数据是可以从外设拷贝到内存的。 用户层往下是系统调用层再往下是操作系统再往下就是传输层及以下了。当用户层创建epoll时OS会维护一个红黑树开始时只有一个根节点并且epoll还会创建一个就绪队列为空。红黑树的节点是结构体里面有fd有事件event整个红黑树就是用户告诉OS要关心哪些fd以及fd上的哪些事件。所以可以看出epoll_ctl本质是对这个红黑树进行增删改比如要删就传对应的fd事件设为nullptr/NULL那就是对红黑树某个节点的删除。fd决定节点是红还是黑左节点还是右节点插入到哪里。内核中一个数据结构对象既可以属于红黑树也可以属于另一个结构。 红黑树上只有某个fd上有对应的事件发生了那么就把这个fd的节点接入到就绪队列中队列只保存已经准备好的fd 对应的event。队列每一个元素也可以是一个结构体只取红黑树中已就绪节点里面的值来填充。epoll_wait接口中间两个参数就是从就绪队列中拿取节点这个接口只看就绪队列可以以时间复杂度为O(1)的方式来检测事件就绪也就是队列是否为空。 节点放入队列实际不是将一个节点内容拷贝到队列节点里而是红黑树节点也是队列节点节点就是一个结构体结构体里可以放入表示已经就绪的事件放入红黑树相关指针信息放入队列相关指针信息建立起队列就是用这个队列相关的指针去指向下一个节点。 当数据就绪时操作系统通过网卡经过网络协议栈拷贝到每个文件的文件缓冲区中。每个节点都有回调机制假设每个文件结构体都有一个变量如果没设置回调就置为空每次操作系统拷贝数据到缓冲区后就去判断一下这个变量为空就退出不为空就调用回调函数回调函数做的工作就是把红黑树上已就绪的节点放到就绪队列中。 红黑树就绪队列回调机制这三个整体就是epoll模型所以epoll_create使用时就是创建了这些从操作系统内部到系统调用形成了一个体系。红黑树就像select/poll中的数组但epoll这里核心的维护交由系统来做不让用户去做。 为什么epoll_create要返回就绪fd的个数以及另外两个接口还需要用这个数字整个机制是由系统做的接口是由进程调用的进程在运行时会创建task_struct指向文件描述符表files_struct表里有一个数组类型是struct file012默认被占用当创建epoll模型操作系统也创建了一个struct file里面有个指针指向epoll模型这个struct file就在调用epoll接口的进程的文件描述符表中。用户进程task_structfiles_structstruct file这是一整个路线。通过epoll_create的返回值也就是另外两个接口的参数epfd两个接口就可以找到进程维护的文件描述符表进而找到struct file然后找到epoll模型就可以对红黑树就绪队列进行操作了。 epoll的红黑树比数组更有效率也不需要底层在线性遍历所有节点上层也不需要遍历节点只需要查看就绪队列用户只需要调用接口就可以操作整个体系。 2、简单实现 Main.cc #include EpollServer.hpp #include memoryint main() {std::unique_ptrEpollServer svr(new EpollServer());svr-InitServer();svr-Start();return 0; }Makefile epollserver:Main.ccg -o $ $^ -stdc11 .PHONY:clean clean:rm -f epollserverEpollServer.hpp中先写基础的 #pragma once#include iostream #include string #include Sock.hpp #include log.hppconst static int gport 8888;class EpollServer { public:EpollServer(uint16_t port gport) : port_(port){}void InitServer(){listensock_.Socket();listensock_.Bind(port_);listensock_.Listen();}void Start(){while(true){sleep(3);}}~EpollServer(){} private:uint16_t port_;Sock listensock_; };现在还不能Accept因为还不知道底层是否有文件就绪如果没有整个服务器就得阻塞了。epoll这里的思路就是把自己的权利交给epoll。要将listensock添加到epoll中不过得先有epoll模型。 创建一个Epoll.hpp #pragma once#include iostream #include string #include sys/epoll.hstatic const int defaultepfd -1;class Epoller { public:Epoller():epfd_(defaultepfd){}~Epoller(){} private:int epfd_; };完善一下Epoll模型并初始化和析构 Epoll.hpp #pragma once#include iostream #include string #include cstdlib #include sys/epoll.h #include err.hpp #include log.hppstatic const int defaultepfd -1; static const int gsize 128;class Epoller { public:Epoller():epfd_(defaultepfd){}void Create(){epfd_ epoll_create(gsize);if(epfd_ 0){logMessage(Fatal, epoll_create error, code: %d, errstring: %s, errno, strerror(errno));exit(EPOLL_CREAT_ERR);//err.hpp里加上这个错误}}int Fd(){return epfd_;}void Close(){if(epfd_ ! defaultepfd) close(epfd_);}~Epoller(){} private:int epfd_; };EpollServer.hpp #pragma once#include Epoll.hpp #include Sock.hpp #include log.hppconst static int gport 8888;class EpollServer { public:EpollServer(uint16_t port gport) : port_(port){}void InitServer(){listensock_.Socket();listensock_.Bind(port_);listensock_.Listen();epoller_.Create();logMessage(Debug, init server success);}void Start(){//1、将listensock添加到epoll中要先有epoll模型while(true){sleep(3);}}~EpollServer(){listensock_.Close();epoller_.Close();} private:uint16_t port_;Sock listensock_;Epoller epoller_; };接下来关注事件。 Epoll.hpp //用户告诉内核要关心哪些事件bool AddEvent(int fd, uint32_t events){struct epoll_event ev;ev.events events;ev.data.fd fd;//fd就是就绪的文件描述符int n epoll_ctl(epfd_, EPOLL_CTL_ADD, fd, ev);if(n 0){logMessage(Fatal, epoll_ctl error, code: %d, errstring: %s, errno, strerror(errno));return false;}return true;}EpollServer.hpp void Start(){//1、将listensock添加到epoll中要先有epoll模型bool r epoller_.AddEvent(listensock_.Fd(), EPOLLIN);//只关心读事件assert(r);//可以做别的判断(void)r;while(true){;}}然后就可以在循环中获取事件了使用wait。从队列里拿数据这个过程是线性拷贝的因为系统不相信用户所以要定义一个struct epoll_event类型的数组来接收。以及wait接口中的events参数里由于拷贝的缘故数据是从左到右连续有效的而返回值 - 1就是当前最后一个有效的下标。 EpollServer.hpp void Start(){//1、将listensock添加到epoll中要先有epoll模型bool r epoller_.AddEvent(listensock_.Fd(), EPOLLIN);//只关心读事件assert(r);//可以做别的判断(void)r;struct epoll_event revs_[gnum];int timeout 1000;while(true){int n epoller_.Wait(revs_, gnum, timeout);switch (n){case 0:logMessage(Debug, timeout...);break;case -1:logMessage(Warning, epoll_wait failed);break;default:logMessage(Debug, 有%d个事件就绪了, n);HandlerEvents(n);//一定有数据就绪break;}}}void HandlerEvents(int num){for(int i 0; i num; i){int fd revs_[i].data.fd;uint32_t events revs_[i].events;logMessage(Debug, 当前正在处理%d上的%s, fd, (eventsEPOLLIN) ? EPOLLIN : OTHER);if(events EPOLLIN)//判断读事件就绪{if (fd listensock_.Fd()){// 1、新连接到来std::string clientip;uint16_t clientport;int sock listensock_.Accept(clientip, clientport);if (sock 0)continue;logMessage(Debug, %s:%d 已经连上服务器了, clientip.c_str(), clientport);// 还不能recv即使有了连接但也不知道有没有数据// 只有epoll知道具体情况所以将sock添加到epoll中bool r epoller_.AddEvent(sock, EPOLLIN);assert(r);(void)r;}else // 2、读事件{char buffer[1024];ssize_t s recv(fd, buffer, sizeof(buffer) - 1, 0);if (s 0){buffer[s - 1] 0;//对打印格式buffer[s - 2] 0;//做一下调整std::string echo buffer;echo [epoll server echo]\r\n;std::cout client# echo std::endl;send(fd, echo.c_str(), echo.size(), 0);}else{if (s 0)logMessage(Info, client quit ...);elselogMessage(Warning, recv error, client quit...);close(fd);//将文件描述符移除//在处理异常的时候fd必须合法才能被处理epoller_.DelEvent(fd);}}}}}Epoll.hpp //用户告诉内核要关心哪些事件bool AddEvent(int fd, uint32_t events){struct epoll_event ev;ev.events events;ev.data.fd fd;//属于用户的数据epoll底层不对该数据做任何修改为了给未来就绪返回int n epoll_ctl(epfd_, EPOLL_CTL_ADD, fd, ev);if(n 0){logMessage(Fatal, epoll_ctl error, code: %d, errstring: %s, errno, strerror(errno));return false;}return true;}bool DelEvent(int fd){return epoll_ctl(epfd_, EPOLL_CTL_DEL, fd, nullptr) 0;}int Wait(struct epoll_event* revs, int num, int timeout){return epoll_wait(epfd_, revs, num, timeout);}读事件处理中我们目前无法读到一个完整的报文。因为完整报文由应用层协议规定我们的代码没有应用层协议所以得自定义一个。 先用回调函数来处理数据 #include functional using func_t std::functionstd::string (std::string);public:EpollServer(func_t func, uint16_t port gport) : func_(func), port_(port){} private:uint16_t port_;Sock listensock_;Epoller epoller_;struct epoll_event revs_[gnum];func_t func_;读事件处理时 else // 2、读事件{char request[1024];ssize_t s recv(fd, request, sizeof(request) - 1, 0);if (s 0){request[s - 1] 0;//对打印格式request[s - 2] 0;//做一下调整std::string response func_(request);send(fd, response.c_str(), response.size(), 0);}else{if (s 0)logMessage(Info, client quit ...);elselogMessage(Warning, recv error, client quit...);close(fd);//将文件描述符移除//在处理异常的时候fd必须合法才能被处理epoller_.DelEvent(fd);}}在Main.cc中传入函数 #include EpollServer.hpp #include memorystd::string echoServer(std::string r) {std::string resp r;resp [echo]\r\n;return resp; }int main() {std::unique_ptrEpollServer svr(new EpollServer(echoServer));svr-InitServer();svr-Start();return 0; }下一篇仍然是Epoll代码。 基本版Epoll 结束。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/86539.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

化妆品网站模板下载沙井网站制作联系电话

CTF概念 CTF是Capture The Flag的缩写,中文一般译作夺旗赛 CTF起源于1996年DEFCON全球黑客大会 DEFCONCTF是全球技术水平和影响力最高的CTF竞赛 竞赛模式 解题模式:解决网络安全技术挑战(即找到flag),提交后获取相应分值。 攻防赛模式:要求找到其他队…

网站备案入口单位做好安全生产举报奖励宣传工作的总结

CentOS7出来的时间已经不算短了,前段时间一直在虚拟机上使用,最近闲下来了,就像在自己的笔记本上装一个win7和Centos7的双系统体验以下实体机的效果,几经波折之后终于顺利的装上了WIN7和CentOS7的双系统!在这里主要是想…

网络网站建设公司智慧旅游门户网站建设方案

央视网消息 :连接甘肃兰州至新疆乌鲁木齐的兰新高铁,是我国“八纵八横”高速铁路网的重要组成部分。开通运营近六年来,兰新高铁已累计运输旅客6760多万人次,在推动地区协调发展,便捷旅客出行等方面发挥了重要作用。乘坐…

重庆奉节网站建设公司哪家专业软件开发外包管理

Kotlin 是一门现代但已成熟的编程语言,旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作,并提供了多种方式在多个平台间复用代码,以实现高效编程。 https://play.kotlinlang.org/byExample/01_introduction/02_Functio…

有用node.js做的网站吗市场来说网站建设销售发展怎么样

掉豆子是指一个人拿着一袋豆子在回家的过程中袋子有一个小孔,一颗一颗不停的掉豆子,顾名思义就是数组元素的单个依次输出。 使用重载MainClass类的printArray方法输出不同类型的数组。 完整代码 public class MainClass {public static void printArr…

优质的企业网站建设网站开发项目报告

一、概念 测试用例的基本概念: 测试用例(Test Case)是为了实施测试而向被测试的系统提供的一组集合,这组集合包含:测试环境、操作步骤、测试数据、预期结果等要素 。 主要步骤: 测试环境——测试步骤—…

如何用wordpress做一个企业网站白山网站设计

集合类 集合(Collection) 1、 List列表 : 有序 可重复 1、ArrayList : 数组列表 ,内部是通过Array实现,对数据列表进行插入、删除操作时都需要对数组进行拷贝并重排序,因此在知道存储数据量时&#xff0c…

给别人网站做跳转seo网站查询工具

win10的任务栏是一个关键的用户界面元素,允许您轻松访问应用程序和系统功能。然而,有时您可能会遇到win10底部任务栏无响应的问题,这会妨碍您的工作流程。本篇文章将介绍解决win 10底部任务栏无响应的问题的三种方法,每种方法都会…

网站开发流程指什么编程软件powermill

private static和public static的比较,区别在于修改的范围不同,但作用域都是全局的即整个进程内共享,与具体线程无关。以下是测试代码:声明静态内部变量的抽象类package atest.privateStatic;public abstract class TypeObject {p…

做网站端口映射做网站宜宾

背景 hi,粉丝朋友们: 大家好! 下面来介绍一下新的framework专题halperfettosurafceflinger,这个专题主要就是分为3大块,但是彼此直接又是相互关联的。 比如surfaceflingre模块深入分析需要用到hal相关的模块&#xff…

石狮网站建设科技公司推广文案

商务助理简历模板下载(可在线编辑制作):来幻主简历,做好简历! 商务助理简历1: 求职意向 求职类型:全职 意向岗位:国际商务、产品助理 意向城市:广东广州 …

下列关于网站开发中网页做视频网站公司要怎么做的

编辑 | 宋慧 出品 | CSDN云计算 金蝶国际软件集团有限公司(“金蝶国际”、“金蝶”或“公司”,连同其附属公司统称“集团”;股份编号:0268.HK)今日公布其截至2021年12月31日止十二个月(“报告期”&#xf…

做商城网站的项目背景外贸网络营销方案

使用lv_obj_set_flex_flow(obj, flex_flow)函数 横向拖动 LV_FLEX_FLOW_ROW 将子元素排成一排而不包裹 LV_FLEX_FLOW_ROW_WRAP 将孩子排成一排并包裹起来 LV_FLEX_FLOW_ROW_REVERSE 将子元素排成一行而不换行,但顺序相反 LV_FLEX_FLOW_ROW_WRAP_REVERSE 将子元素…

企业网站建设模块金蝶财务软件官网首页

基于django电影推荐系统 摘要 该Django电影推荐系统是一个简单而基础的框架,旨在展示系统的基本组件。系统包括两个主要模型,即Movie和Rating,用于存储电影信息和用户评分。视图层包括展示电影列表和电影详情的功能,使用模板进行页…

南京建站在线咨询请将已备案网站接入访问

文章目录 前言呼入进入机器人配置流程创建线路创建线路组呼入配置 创建自动外呼任务1. 实现“一端放音,另一端进入机器人”操作创建拨号方案—“模拟放音”呼叫路由—“internal”启用拨号方案—“模拟放音”队列外呼配置 2. 实现“两端都进入机器人”操作队列外呼配…

青岛app网站开发企业网站定制多少钱

目录 快速排序: 概念: 动画分析: 代码实现: 代码分析: 代码特性: 常见问题: 快速排序: 概念: 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法&a…

有多少做汽车的网站网站建设颜色

Gray码是一个长度为2ⁿ的序列,序列中无相同元素,且每个元素都是长度为n位的二进制位串,相邻元素恰好只有1位不同。例如长度为2的格雷码为(000,001,011,010,110,111,101,100),设计分治算法对任意的n值构造相…

如何建立网站会员系统吗wordpress 展开

文章目录 一、平行视图1.1 示意图1.2 平行视图的基础矩阵1.3 平行视图的极几何1.4 平行视图的三角测量 二、图像校正三、对应点问题3.1 相关匹配法3.2 归一化相关匹配法3.3 窗口问题3.4 相关法存在的问题3.5 约束问题 一、平行视图 1.1 示意图 如下图即是一个平行视图。特点&a…

安庆网站建设推荐安徽秒搜科技沈阳突发事件刚刚

解决办法可以参考:修改hosts 不生效? 三种方法解决

中国十大小说网站排名中小企业网络安全解决方案

目录 范数的意义范数的数学意义范数之于深度学习的意义 L1 范数与 L2 范数L1 范数L2 范数 小结 本节博文是线性代数第二部分,主要内容为 L 1 L1 L1 范数与 L 2 L2 L2 范数;有关线性代数基础知识,请访问:【深度学习】S2 数学基础…