了解 sendfile() 和 splice()
sendfile()
可用于将数据从“文件”描述符传输到“套接字”描述符,以便从机器A获取数据到机器B。是否可以在接收端获取数据从“套接字”描述符结束到具有类似零拷贝语义的文件?我认为 sendfile()
在这里没有帮助,因为 sendfile()
需要数据源是“页面/缓冲区”缓存。我的理解正确吗? splice()
在这种情况下可以提供帮助吗?
sendfile()
can be used to transmit data from a "file" descriptor to a "socket" descriptor in order to get data from machine A to machine B. Is it possible to get the data at the receiving end from the "socket" descriptor to a file with similar zero-copy semantics? I think sendfile()
doesn't help here because sendfile()
needs the source of data to be "page/buffer" cache. Is my understanding correct? Can splice()
help in this situation?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您对
sendfile
对此的限制是正确的。是的,splice
可以提供帮助,但它并不是微不足道的:splice
要求源文件描述符或目标文件描述符至少之一是管道。因此,您不能直接从套接字拼接
到普通文件描述符。从概念上讲,您可以做的就是:
pipe(2)
splice
splice
从管道的读取端写入文件也重复最后的步骤,直到读取所有数据。
Linux 中使用 sendfile() 和 splice( ) 有此技术的实现。
You're correct about the limitation of
sendfile
for this. And yes,splice
can help, but it's not trivial:splice
requires that at least one of the source or target file descriptors be a pipe. So you can't directlysplice
from a socket to a plain file descriptor.Conceptually, what you can do to make it work is:
pipe(2)
splice
splice
alsoRepeat the last steps until all the data is read.
Zero-Copy in Linux with sendfile() and splice() has an implementation of this technique.