我一直在玩libevent2,我已经阅读了文件,但它阻止了。有没有办法让文件读取不在libevent中阻止。或者,我是否需要为文件使用另一个IO库,并使其成为我需要的泵事件。
fd = open("/tmp/hello_world",O_RDONLY);
evbuffer_read(buf,fd,4096);
O_NONBLOCK标志也不起作用。
答案 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/