libevent2和文件io

时间:2010-08-11 18:20:36

标签: c file-io asynchronous libevent

我一直在玩libevent2,我已经阅读了文件,但它阻止了。有没有办法让文件读取不在libevent中阻止。或者,我是否需要为文件使用另一个IO库,并使其成为我需要的泵事件。

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

O_NONBLOCK标志也不起作用。

3 个答案:

答案 0 :(得分:3)

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

有POSIX AIO,但是在Linux上有一系列限制,使其不适合通用目的(仅适用于O_DIRECT,I / O必须是扇区对齐的)。

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

答案 1 :(得分:2)

没有

我还没有看到* nix,你可以在常规文件上进行非阻塞i / o而不需要使用更特殊的AIO library(虽然对某些人来说,例如solaris,O_NONBLOCK会产生影响,例如:别人持有锁定文件)

答案 2 :(得分:-1)

请查看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/