Libevent 和文件 I/O

Posted

技术标签:

【中文标题】Libevent 和文件 I/O【英文标题】:Libevent and file I/O 【发布时间】:2011-11-15 20:53:54 【问题描述】:

libevent 是否处理缓冲文件 I/O?我知道它可以很好地处理套接字,但它是否也涉及普通文件或者它“只是”一个 epoll/... 包装器?

【问题讨论】:

【参考方案1】:

使用带有普通文件描述符的 libevent(或任何底层就绪通知机制,例如 epollkqueue)通常没有意义。例外情况是 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的主要内容,如果未能解决你的问题,请参考以下文章

文件删除/修改期间的 libevent

libevent简单服务端和客户端实现

libevent 交叉编译生成的库怎么不能用

如何检查已安装的 libevent 版本?

windows 平台使用 VS2017 编译 libevent 源码

libevent:在文件更改时引发事件