epoll 小记
来源:互联网 发布:java多线程,代码多的书 编辑:程序博客网 时间:2024/05/17 02:00
记录一下 其他地方看到的摘要吧。
linux 下 epoll 只有3个函数
int epoll_create(int size)
用于创建一个 epoll 后面的size 在2.6以后可以忽略
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
操作epoll
第一个参数 是 epoll_create 的返回值
第二个参数 是 操作项
EPOLL_CTL_ADD:注册新的fd到epfd中;
EPOLL_CTL_MOD:修改已经注册的fd的监听事件;
EPOLL_CTL_DEL:从epfd中删除一个fd;
第三个参考是要操作的fd
第四个参数是 一个 struct epoll_event结构体
typedef union epoll_data {
void *ptr;
int fd;
__uint32_t u32;
__uint64_t u64;
} epoll_data_t;
//感兴趣的事件和被触发的事件
struct epoll_event {
__uint32_t events; /* Epoll events */
epoll_data_t data; /* User data variable */
};
EPOLLIN :表示对应的文件描述符可以读(包括对端SOCKET正常关闭);
EPOLLOUT:表示对应的文件描述符可以写;
EPOLLPRI:表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来);
EPOLLERR:表示对应的文件描述符发生错误;
EPOLLHUP:表示对应的文件描述符被挂断;
EPOLLET: 将EPOLL设为边缘触发(Edge Triggered)模式,这是相对于水平触发(Level Triggered)来说的。
EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里
3. int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
最后就是 去等待事件的到来。
events 这个参数是一个 out 参数, 一个struct epoll_event 数组。
maxevents 是events数组的长度。 用于这一次只收集多少个fd事件
timeout 是超时时间
然后是 水平模式和边缘模式
边缘模式(Edge triggered)
通俗点讲的话。
水平模式就是 只要你这个fd有事件。就会一直通知你。 直到你处理为止
边缘模式就是 每次有一个事件,只会通知你一次,除非下一次有新的事件到来,才能通过 epoll_wait 收集到数据。
边缘模式是比水平模式要快的。
但是要处理的东西也比较多。
如果不小心没处理完。。- -如果没有下一次事件。。那啥。你就永远就再也见不了他了。
然后
使用水平触发模式;当socket可写时,会不停的触发socket可写的事件,如何处理?
有2个解决方法。
一:当发送的时候才将fd加入epoll 。写完后移除。
记录一个地址
http://www.ccvita.com/515.html
- epoll 小记
- epoll
- epoll
- epoll
- epoll
- epoll
- epoll
- epoll
- epoll
- epoll
- epoll
- epoll
- epoll
- epoll
- epoll
- epoll
- epoll
- epoll
- 软件开发基本原则—— 典型错误
- vs2010中添加opencv路径
- popScene之后Layer的析构函数没被调用
- poj2481
- Oracle 函数 Translate 的用法
- epoll 小记
- Oracle 多表视图更新(待看完触发器后再来看)
- [leetcode] Reverse Words in a String
- 外圆内方中的玄机
- 判断回文数
- GlusterFS源码解析 —— GlusterFS 源码安装
- js中new Function的用法
- 扩展windows下julia语言的时间串处理函数
- 一个锁屏应用