【问题标题】:How to use libuv for direct file descriptor reads?如何使用 libuv 进行直接文件描述符读取?
【发布时间】:2014-08-19 18:48:50
【问题描述】:

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

  1. 检测来自客户端连接的数据
  2. 将文件描述符传递给工作线程进行读取和处理

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 可以用于这种场景吗?

提前致谢!

【问题讨论】:

    标签: libuv


    【解决方案1】:

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

    你可以使用:

    int uv_fileno(const uv_handle_t* handle, uv_os_fd_t* fd);
    

    然后从 FD 中读取您认为合适的内容。

    【讨论】:

      【解决方案2】:

      我终于找到了一个例子,它与我在上一篇文章中描述的一样。对于那些对如何完成感兴趣的人,这里是the link

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多