Libevent 和文件 I/O
Posted
技术标签:
【中文标题】Libevent 和文件 I/O【英文标题】:Libevent and file I/O 【发布时间】:2011-11-15 20:53:54 【问题描述】:libevent
是否处理缓冲文件 I/O?我知道它可以很好地处理套接字,但它是否也涉及普通文件或者它“只是”一个 epoll/...
包装器?
【问题讨论】:
【参考方案1】:使用带有普通文件描述符的 libevent(或任何底层就绪通知机制,例如 epoll
或 kqueue
)通常没有意义。例外情况是 NFS 上的文件或使用带有 eventfd
的内核 AIO。
本地磁盘上的文件描述符始终准备就绪,始终有足够的缓冲区空间,并且操作始终“立即”完成。写操作只是将数据复制到缓冲区缓存,而 实际 写入磁盘发生...whenever it happens。 (请注意,此链接是特定于 Linux 的,但除了一些小的实现细节之外,它在其他系统上的工作方式相同)
【讨论】:
【参考方案2】:libevent 不是 epoll 包装器。它选择每个平台上可用的最高性能方法。
套接字也是文件描述符,因此您应该能够将 libevent 用于文件 io。
你需要禁用 libevent 的 epoll 使用。如果我没记错的话,Epoll 不支持 unix 文件。
struct event_config *cfg = event_config_new();
event_config_avoid_method(cfg, "epoll");
【讨论】:
【参考方案3】:libevent 位于比缓冲文件 I/O 更低的级别(使用 stdio.h
得到的),直接使用文件描述符。您认为它“只是”一个 epoll/select/kevent/etc 包装器是正确的。它的目的是监听描述符上的事件,这是文件 I/O 的最低级别。但是,您可以将它与stdio.h
文件 I/O 库设施结合使用,因为它最终也会使用文件描述符。您可以使用fileno(3)
从您要等待的FILE *
中检索文件描述符。
【讨论】:
以上是关于Libevent 和文件 I/O的主要内容,如果未能解决你的问题,请参考以下文章