了解sendfile()和splice()

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

Solutions Collecting From Web of "了解sendfile()和splice()"

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

从概念上讲,你可以做些什么来使其工作是:

  • 像往常一样设置入站套接字fd和输出文件fd
  • pipe(2)创建一个管道pipe(2)
  • 在一个循环中:
    • splice从套接字读到管道的写入侧
    • 从管道的读取一侧写入文件与splice

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

在Linux中使用sendfile()和splice()进行零拷贝具有这种技术的实现。