代码之家  ›  专栏  ›  技术社区  ›  MathGladiator

libevent2和文件IO

  •  1
  • MathGladiator  · 技术社区  · 16 年前

    我一直在玩弄libevent2,我有阅读文件的工作,但它阻止了。是否有任何方法可以使文件读取不只是在libevent内阻塞。或者,我是否需要使用另一个IO库来存储文件,并让它抽取我需要的事件。

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

    O_nonblock标志也不起作用。

    3 回复  |  直到 11 年前
        1
  •  3
  •   janneb    16 年前

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

    有posix a i o,但例如,在Linux上,它有许多限制,使其不适合一般用途(仅对于o_direct,I/O必须与扇区对齐)。

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

        2
  •  2
  •   nos    16 年前

    不。

    我还没有看到一个*nix,在这里您可以在常规文件上不阻塞I/O,而无需诉诸更特殊的 AIO library (但对于某些情况,例如Solaris,如果其他人持有该文件的锁,则O_nonblock具有效果)

        3
  •  -1
  •   Clemens    11 年前

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

    它是libeio的一个很好的替代方案,因为它在所有主要的操作系统上都表现良好,从Windows到BSD、Mac OS X,当然还有Linux。 它支持I/O完成端口,这使它成为比libeio更好的选择,如果您是针对Windows的。

    C代码也是非常可读的,我强烈推荐本教程: https://nikhilm.github.io/uvbook/