有没有可能``splice()`从套接字到缓冲区"零拷贝"?

时间:2014-12-09 21:41:07

标签: c linux sockets

从套接字到具有“零拷贝”的缓冲区是否可以splice()?如果是,怎么样?


我为splice()找到的示例代码有两个步骤(splice example code):

  1. 从插座到管道的拼接
  2. 从管道拼接到文件描述符
  3. 是否总会有使用管道的中间步骤(即,您无法对用户空间中的缓冲区执行零复制操作)?

1 个答案:

答案 0 :(得分:2)

@yeyo在问题的评论IMO中回答了这个问题,但没有提供及时答复。所以我将总结一下:

您无法splice()从套接字到具有“零拷贝”的缓冲区。


您无法使用splice()的原因是splice()" requires either the source or destination to be a pipe"。换句话说,当源是套接字时,由于API的限制('源或目标或两者都必须是管道'),目标必须是管道。


这回答了是或否的问题而不回答"为什么"。

我仍然对"为什么"或者具体地说:

  • "为什么splice()要求源或目标成为管道?"
  • "为什么我不能直接从套接字拼接到用户内存?"

Linus Torvalds直接在链接中回答了这些问题,他的回答似乎清晰简明(如果没有对他写的内容进行一点研究):http://yarchive.net/comp/linux/splice.html