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 );

posted @ 2020-07-07 13:50  Xzavieru  阅读(185)  评论(0编辑  收藏  举报