理解sendfile()和splice()

问题描述 投票:0回答:1

sendfile()
可以用来将数据从“文件”描述符传输到“套接字”描述符,以便从机器A获取数据到机器B。是否可以在接收端从“套接字”获取数据具有类似零拷贝语义的文件描述符?我认为
sendfile()
在这里没有帮助,因为
sendfile()
需要数据源是“页面/缓冲区”缓存。我的理解正确吗?在这种情况下
splice()
可以帮忙吗?

linux splice sendfile
1个回答
17
投票

您对

sendfile
对此的限制是正确的。是的,
splice
可以提供帮助,但它并不是微不足道的:
splice
要求源文件描述符或目标文件描述符中至少之一是管道。所以你不能直接从套接字到普通文件描述符
splice

从概念上讲,您可以采取以下措施使其发挥作用:

  • 像平常一样设置入站套接字 fd 和输出文件 fd
  • 使用
    pipe(2)
  • 创建管道
  • 循环:
  • 使用
    splice
  • 从套接字读取到管道的写入端
  • 也使用
    splice
    从管道的读取端写入文件

重复最后的步骤,直到读取所有数据。

Linux 中使用 sendfile() 和 splice() 进行零复制 具有此技术的实现。

© www.soinside.com 2019 - 2024. All rights reserved.