我知道epoll_ctl对文件描述符感兴趣,但我找不到任何关于如何实际使用epoll的信息。
如果我想异步读写文件,我该如何做?我是否使用普通的读写电话?是在调用epoll_wait之前还是之后调用这些函数,是否将文件描述符标记为非块?
发布于 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特有的。
https://stackoverflow.com/questions/31230708
复制相似问题