【发布时间】:2010-12-25 00:31:12
【问题描述】:
前奏
sendfile() 是一个非常有用的系统调用,原因有两个:
首先,它比read()/write()(或recv()/send(),如果您更喜欢那个jive)循环更少。
其次,它比上述方法更快(更少的系统调用,实现可以在设备之间复制没有缓冲区等)。
更少的代码。更高效。太棒了。
在 UNIX 中,一切(大部分)都是一个文件。这是柏拉图理论与现实世界实践碰撞的丑陋领域。我知道套接字与驻留在某些设备上的文件根本不同。我还没有通过 Linux/*BSD/Darwin/whatever OS 实现 sendfile() 的源代码来了解为什么这个特定的系统调用仅限于写入套接字(特别是流式套接字)。
我只是想知道...
问题
是什么限制了sendfile() 允许目标文件描述符是套接字以外的东西(如磁盘文件或管道)?
【问题讨论】:
-
在 2.6.33 及更高版本中,sendfile 的 out_fd 参数可以是任何 fd(不仅仅是套接字)。
标签: unix kernel implementation system-calls sendfile