我知道对epoll_ctl注册了对文件描述符的兴趣,但我找不到有关如何实际使用epoll的任何信息。
如果我想异步读写文件,我该怎么办?我是否使用正常的读写通话?我是否在调用epoll_wait之前或之后调用这些函数,是否将文件描述符标记为非块?
答案 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的。