如何使用libuv进行直接文件描述符读取?

时间:2014-08-19 18:48:51

标签: libuv

作为我正在研究的项目调查的一部分,我一直在研究用于检测和读取套接字数据的不同事件循环机制/库。具体来说,我需要做的很简单:

  1. 从客户端连接中检测数据
  2. 将文件描述符传递给工作线程以进行读取和处理
  3. Epoll边缘触发非常适用于此目的,我喜欢边缘触发行为,因此我只会在数据可用时收到通知。我尝试使用libev实现类似下面的伪代码,这看似起作用:

    void read_cb(struct ev_loop *loop, struct ev_io *watcher, int revents) {
        1. Check for errors
        2. ev_io_stop(loop, watcher) so I don't get constantly notified
        3. Assign the ev_io watcher pointer into worker thread accessible data structure
        3. Signal worker thread
        4. Worker thread begins reading from watcher->fd
        5. When worker thread get EAGAIN, start the watcher again
    

    由于libuv旨在用于类似目的并且是边缘触发的,因此我尝试做类似的事情,但尚未成功。使用libuv,我了解您可以use uv_read_start从流中读取数据,但使用此方法,uv_read_cb会返回填充数据的缓冲区。由于我需要操作需要读取的大量数据,并且为了避免将数据从此缓冲区额外复制到不同的结构,我希望能够直接从套接字读取。

    这种情况是libuv可以用于吗?

    提前致谢!

2 个答案:

答案 0 :(得分:1)

此提交增加了获取基础流的文件描述符的可能性:https://github.com/joyent/libuv/commit/4ca9a363897cfa60f4e2229e4f15ac5abd7fd103

然后你可以使用它从你认为合适的FD读取。

答案 1 :(得分:0)

我终于能够找到一个能够完成我在上一篇文章中描述的示例。对于那些对如何做到这一点感兴趣的人,这里是the link

对此进行测试产生了其他问题,但我会单独发布这些问题,因为它们更多地与边缘/级别触发器行为而不是库相关。