首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用epoll?

如何使用epoll?
EN

Stack Overflow用户
提问于 2015-07-05 13:12:59
回答 1查看 1.6K关注 0票数 1

我知道epoll_ctl对文件描述符感兴趣,但我找不到任何关于如何实际使用epoll的信息。

如果我想异步读写文件,我该如何做?我是否使用普通的读写电话?是在调用epoll_wait之前还是之后调用这些函数,是否将文件描述符标记为非块?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-05 13:59:25

你在混淆这些概念。epoll(7)与异步I/O不同,select(2)poll(2)epoll(7)和其他类似的函数可以阻止底层文件描述符是否阻塞或非阻塞;它们提供了一种同步的通知形式--除非您明确要求,否则系统不会告诉您任何事情。

select(2)poll(2)和系列的要点是您可以进行I/O复用:使用单个阻塞调用,您可以在给定的一组文件描述符中等待有趣的事件。这与异步I/O不一样。

另一方面,POSIX异步I/O使用AIO控制块来描述I/O操作(struct aiocb),它主要由aio_read(3)aio_write(3)aio_return(3)aio_suspend(3)执行。除非你有一个非常好的理由这样做,不要-它使设计相当复杂。

要使用epoll(7),除了可以在man 7 epoll中阅读的内容之外,没有什么可说的

  • 使用epoll或最近的变体epoll_create1(2)创建一个epoll_create1(2)实例。
  • 使用epoll_ctl(2)注册对文件描述符的兴趣。
  • 调用epoll_wait(2)等待I/O事件,可能会阻塞调用线程,直到某个事件可用为止

一旦epoll_wait(2)返回,假设它成功,您将保证至少一个您以前在epoll_ctl(2)中注册的感兴趣的操作不会被阻止。不阻塞的事件由epoll_wait(2)在您输入的缓冲区中返回(第二个参数给epoll_wait(2))。

遍历这个缓冲区,找出您想要做的事情。例如,如果您注册了读取文件描述符的兴趣,并且它是由epoll_wait(2)返回的(该条目的events字段包括EPOLLIN),那么您可以在知道它不会阻塞的情况下调用read(2)write(2)也是如此,但前提是您注册了知道什么时候write(2)不会阻塞的兴趣,并且该事件由epoll_wait(2)返回。

因此,是的,您可以在read(2) / write(2)之后调用epoll_wait(2),但要确保执行的操作实际上是可用的,这样就不会阻塞。

哦,记住epoll(7)是Linux特有的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31230708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档