是否有可能从套接字“拼接()”到“零拷贝”的缓冲区?

是否有可能splice()从一个套接字到“零复制”的缓冲区? 如果是的话,怎么样?


我find的splice() 代码示例有两个步骤( 拼接示例代码 ):

  1. 从套接字到pipe道的拼接
  2. 从pipe道拼接到文件描述符

是否总会有一个使用pipe道的中间步骤(即,你不能在用户空间中执行零拷贝操作)?

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

你不能从套接字splice()到“零拷贝”的缓冲区。


你不能使用splice()的原因是因为splice() “ 要求源或者目的地是管道 ”。 换句话说,当源是一个套接字时,由于API的限制('源或目的地或两者都必须是管道'),目的地必须是管道。


这是回答是或否的问题,而不是“为什么”。

我仍然有关于“为什么”或具体的问题:

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

Linus Torvalds直接在链接中回答这些问题,他的回答对我来说似乎是清晰和简洁的(如果不是对他写的东西进行一点研究的话):http: //yarchive.net/comp/linux/splice.html