理解sendfile()和splice()

时间:2011-12-24 18:42:43

标签: linux splice sendfile

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

1 个答案:

答案 0 :(得分:12)

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

从概念上讲,你可以做的是:

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

重复上一步,直到读完所有数据。

Zero-Copy in Linux with sendfile() and splice()实现了这项技术。