作为我正在研究的项目调查的一部分,我一直在研究用于检测和读取套接字数据的不同事件循环机制/库。具体来说,我需要做的很简单:
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
可以用于吗?
提前致谢!
答案 0 :(得分:1)
此提交增加了获取基础流的文件描述符的可能性:https://github.com/joyent/libuv/commit/4ca9a363897cfa60f4e2229e4f15ac5abd7fd103
然后你可以使用它从你认为合适的FD读取。
答案 1 :(得分:0)
我终于能够找到一个能够完成我在上一篇文章中描述的示例。对于那些对如何做到这一点感兴趣的人,这里是the link。
对此进行测试产生了其他问题,但我会单独发布这些问题,因为它们更多地与边缘/级别触发器行为而不是库相关。