linux - 理解 sendfile() 和 splice()

标签 linux splice sendfile

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

最佳答案

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

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

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

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

Zero-Copy in Linux with sendfile() and splice()有这种技术的实现。

关于linux - 理解 sendfile() 和 splice(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8626263/

相关文章:

javascript - javascript 中拼接删除随机元素问题

linux - 总是在 Linux 上将 sendfile 与 nginx 一起使用吗?

linux - 如何将一个服务器套接字的 'pipe' 或 'chain' 输出发送到另一个服务器套接字的输入(类似于sendfile)?

c - C语言的套接字编程-从服务器向客户端发送文件

linux - 如果 "echo $?"命令返回 2 怎么办?

linux - 为什么linux有足够的内存但是使用了swap

javascript - 是否可以使用 javascript 中的 'for of' 循环从数组中拼接项目?

Javascript 数组拼接无法正常工作

linux - 目录要求全部拒绝不工作

linux - Bash: '$(( ))' 表示 'expr' 和 '[ ]' 表示 'test'?