首页 > 代码库 > epoll的一些关键点和总结(二)
epoll的一些关键点和总结(二)
epoll异步精髓(ET模式):
2个epoll初始化片段:
</pre><p><pre name="code" class="cpp">epoll_event ev; ev.events = EPOLLIN | EPOLLET; ev.data.fd = fd; int ret = epoll_ctl(_epfd, EPOLL_CTL_ADD, fd, &ev);
_pEvents = new epoll_event[EPOLL_SIZE - 1]; int n = epoll_wait(_epfd, _pEvents, EPOLL_SIZE - 1, EPOLL_TIME_OUT);
epoll_ctl第三个参数为需要监听的fd,第四个参数告诉内核要监听的事件,data为用户携带的参数,一般为了方便都会顺带这个监听的fd,也可用自定义类型。
epoll_wait第二个参数是 N个监听到的事件的数组,内核会把这N个发生事件的epoll_ctl中第四个参数的数据拷贝到这里。
epoll_wait循环里:
if (_pEvents[i].events & EPOLLIN) { OnReadEpoll(i); } else if (_pEvents[i].events & EPOLLOUT) { OnWriteEpoll(i); }
OnReadEpoll中:
epoll_event ev; ev.data.fd = _pEvents[i].data.fd; //也可用自定义类型mydate //ev.data.ptr = <span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:10px;">mydate</span></span><span style="font-family: Arial, Helvetica, sans-serif;">;</span> ev.events = EPOLLOUT | EPOLLET; epoll_ctl(_epfd, EPOLL_CTL_MOD, _pEvents[i].data.fd, &ev);
读到数据,改为监听是否可写。
OnWriteEpoll中:
<pre name="code" class="cpp"> epoll_event ev; ev.data.fd = _pEvents[i].data.fd; ev.events = EPOLLIN | EPOLLET; epoll_ctl(_epfd, EPOLL_CTL_MOD, _pEvents[i].data.fd, &ev);
写了数据,改为监听是否可读。
以上为同一个fd中数据收发的关键点,如果是跨fd转发程序,情况将更复杂。
示例情景:当fd1读到数据时监听fd2的EPOLLOUT事件,此时fd2若可写,又将监听fd1的EPOLLIN事件,于是将造成一直从fd1读,一直往fd2写。。暂不赘述
epoll的一些关键点和总结(二)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。