前奏
sendfile()
是一个非常有用的系统调用,原因有两个:
首先,它比 read()
/write()
(或 recv()
)代码更少/send()
(如果您更喜欢 jive)循环。
其次,它比上述方法更快(更少的系统调用,实现可以在没有缓冲区的设备之间复制,等等)。
更少的代码。更高效。太棒了。
在 UNIX 中,一切(大部分)都是文件。这是柏拉图理论与现实世界实践碰撞产生的丑陋领域。我知道套接字与驻留在某些设备上的文件有根本的不同。我还没有深入研究 Linux/*BSD/Darwin/任何实现 sendfile()
的操作系统的源代码来了解为什么这个特定的系统调用仅限于写入套接字(特别是流套接字)。
我只是想知道...
问题
什么限制 sendfile()
允许目标文件描述符是套接字以外的东西(如磁盘文件或管道)?
最佳答案
我好像记得这是早期Linux 2.6中引入的限制(2.4没有这个限制)。
从 2.6.17 开始,Linux 有了类似的 splice() 系统调用;更灵活,但效率稍低。 Linus 谈到了用 splice() 重新实现 sendfile。请参阅http://kerneltrap.org/node/6505
关于unix - 写入套接字是否是 sendfile() 系统调用的任意限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1876993/