码迷,mamicode.com
首页 > 其他好文 > 详细

epoll的一些关键点和总结(二)

时间:2015-01-12 17:38:26      阅读:311      评论:0      收藏:0      [点我收藏+]

标签:c   epoll   linux   socket   异步   

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的一些关键点和总结(二)

标签:c   epoll   linux   socket   异步   

原文地址:http://blog.csdn.net/tc725210/article/details/42644515

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!