多路复用,调用select/poll,或者调用epoll_create活epoll_wait的触发条件是什么?

sfasdfasdfasf 发布于 04/19 10:38
阅读 322
收藏 0

开源软件供应链点亮计划,等你来!>>>

在看多路复用,有一个疑问,博客上讲到进程每次调用select/poll,都会把文件描述符集合从用户态拷贝到内核态,那么进程调用的触发条件是什么?还有调用epoll_create活epoll_wait的触发条件是什么?还是说有固定多长时间调用一次,有什么频率吗?

 

加载中
0
mickelfeng
mickelfeng
  1. 新建epoll描述符==epoll_create()
  2. epoll_ctrl(epoll描述符,添加或者删除所有待监控的连接)
  3. 返回的活跃连接 ==epoll_wait( epoll描述符 )
0
j
jungggle
该评论暂时无法显示,详情咨询 QQ 群:912889742
0
很成立
很成立

动手去实践一下你就知道了

0
Kerwin-Sun
Kerwin-Sun

这里说的调用应该指的就是代码里正常的调用。
一般使用 epoll 的时候都是先使用 epoll_create 初始化一个 poll,然后使用 epoll_ctl 往里面加入文件句柄,之后再使用无限循环监听 epoll_wait 返回的状态 ready 的文件句柄集合,处理完毕后继续 epoll_wait 获得下一批,直到没有。
大致的伪代码:

struct epoll_event ev, events[10]
int listen_files, files, efd

efd = epoll_create()

ev.events = EPOLLIN
ev.data.fd = listen_files

epoll_ctl(efd, EPOLL_CTL_ADD, listen_files, ev)

for(;;){
    files = epoll_wait(efd, events, MAX_EVENTS, -1)
    if (files == -1) break

    for(int n=0;n<files;n++){
        // do something
        ...
    }
}

 

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部