epoll
eppll 即使使用ET模式,一个socket上的某个事件还是可能被触发多次,采用线程城池的方式来处理事件,可能一个socket同时被多个线程处理
如果对描述符socket注册了EPOLLONESHOT事件,那么操作系统最多触发其上注册的一个可读、可写或者异常事件,且只触发一次。。想要下次再触发则必须使用epoll_ctl重置该描述符上注册的事件,包括EPOLLONESHOT 事件。
EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里
例子:
epoll_event event;
event..data.fd=fd;
evnet.events=EPOLLIN | EPOLLT |EPOOLLONESHOT
epoll_ctl( epollfd,EPOLL_CTL_ADD , fd , &event );// 第一次添加
epoll_wait 返回, 处理fd的读事件,一直读一直读,读到没有数据 ( errno==EAGAIN) ,这时才重置fd上的事件
epoll_event event;
event..data.fd=fd;
evnet.events=EPOLLIN | EPOLLT |EPOOLLONESHOT
epoll_ctl( epollfd,EPOLL_CTL_MOD , fd , &event );
我身后空无一人,我怎敢倒下