gpt4 book ai didi

linux - 我如何使用 epoll?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:15:09 26 4
gpt4 key购买 nike

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

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

最佳答案

你在混淆概念。 epoll(7) 与异步 I/O 不同。 select(2), poll(2), epoll(7) 等类似函数可以阻塞,不管底层文件描述符是否阻塞或非阻塞;它们提供同步形式的通知 - 在您明确要求之前,系统不会告诉您任何信息。

select(2)poll(2) 和 family 的要点是您可以进行 I/O 多路复用:通过单个阻塞调用,您可以等待对于给定的一组文件描述符中的有趣事件。这与异步 I/O 不同

另一方面,POSIX 异步 I/O 使用 AIO 控制 block 来描述 I/O 操作 (struct aiocb),它主要通过 aio_read(3)< 执行aio_write(3)aio_return(3)aio_suspend(3)。除非你有充分的理由这样做,否则不要 - 它会使设计复杂化很多。

要使用epoll(7),除了可以在man 7 epoll中阅读外,真的没什么好说的:

  • 使用 epoll_create(2) 或更新的变体 epoll_create1(2) 创建一个 epoll 实例。
  • 使用 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)

所以,是的,你在 epoll_wait(2) 之后调用了 read(2)/write(2),但要确保你执行实际被识别为可用的操作,这样您就不会阻塞。

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

关于linux - 我如何使用 epoll?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31230708/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com