unix - 写入套接字是否是 sendfile() 系统调用的任意限制?

标签 unix kernel implementation system-calls sendfile

前奏

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/

相关文章:

linux - 使用 PowerShell 测试与 Unix 服务器的连接

unix中的清除提示

unix find 命令以 '+' 字符结尾

linux - 了解 rt_rq(real time runqueue) 内核中数据成员的使用

linux - Linux 内核模块的 LPM 实现

algorithm - 如何有效地实现二元决策图(BDD)?

java - 如何使用java中的列表结构确定java中当前元素之后是否存在另一个元素

c++ - 在 UNIX 上分配给 C++ 程序的初始堆大小

kernel - 使用按值传递的概念从 opencl 内核调用函数

java - 如何获取从具有指定泛型的接口(interface)继承的所有类的列表(接口(interface)<具体类>)