我如何使用epoll?

时间:2015-07-05 13:13:00

标签: linux

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

如果我想异步读写文件,我该怎么办?我是否使用正常的读写通话?我是否在调用epoll_wait之前或之后调用这些函数,是否将文件描述符标记为非块?

1 个答案:

答案 0 :(得分:2)

您正在混合这些概念。 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_create(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),但请确保您执行的操作实际上已确定为可用,这样您就不会t block。

哦,请记住epoll(7)是特定于Linux的。