1

我一直在玩弄 libevent2,并且可以读取文件,但它会阻塞。有什么方法可以让文件读取不只是在 libevent.xml 中被阻塞。或者,我是否需要为文件使用另一个 IO 库并使其泵送我需要的事件。

fd = open("/tmp/hello_world",O_RDONLY);
evbuffer_read(buf,fd,4096);

O_NONBLOCK 标志也不起作用。

4

3 回答 3

3

在 POSIX 中,磁盘被认为是“快速设备”,这意味着它们总是阻塞(这就是为什么 O_NONBLOCK 不适合你)。只有网络套接字可以是非阻塞的。

有 POSIX AIO,但例如在 Linux 上,它带有一堆限制,使其不适合通用用途(仅适用于 O_DIRECT,I/O 必须与扇区对齐)。

如果您想将普通 POSIX IO 集成到异步事件循环中,似乎人们会求助于线程池,其中阻塞系统调用由一个工作线程在后台执行。这样一个库的一个例子是libeio

于 2010-08-11T18:48:32.230 回答
2

不。

我还没有看到一个*nix,您可以在其中对常规文件执行非阻塞 i/o,而无需求助于更特殊的AIO 库(尽管对于某些,例如 solaris,O_NONBLOCK 会在其他人持有锁定时产生影响文件)

于 2010-08-11T18:40:23.933 回答
0

请看一下node.js / io.js使用的libuv:https ://github.com/libuv/libuv

它是 libeio 的一个很好的替代品,因为它在所有主要操作系统上运行良好,从 Windows 到 BSD、Mac OS X,当然还有 Linux。它支持 I/O 完成端口,如果您以 Windows 为目标,这使其成为比 libeio 更好的选择。

C 代码也非常易读,我强烈推荐这个教程:https ://nikhilm.github.io/uvbook/

于 2015-03-12T16:29:05.203 回答