繁体   English   中英

向套接字写入sendfile()系统调用的任意限制吗?

[英]Is writing to a socket an arbitrary limitation of the sendfile() syscall?

序幕

sendfile()是一个非常有用的系统调用,其原因有两个:

首先,它的代码少于read() / write() (或者如果您喜欢jive的话,则为recv() / send() )循环。
其次,它比上述方法更快 (更少的系统调用,实现可以在没有缓冲区的设备之间进行复制等)。

更少的代码。 更高效。 太棒了

在UNIX中,所有内容(大部分)都是文件。 这是柏拉图理论与现实世界相撞的丑陋领域。 我了解套接字与驻留在某些设备上的文件从根本上不同。 我没有深入研究Linux / * BSD / Darwin /的源代码,无论什么操作系统实现sendfile()都知道为什么这个特定的系统调用仅限于写入套接字(特别是流套接字)。

我只是想知道...

是什么限制sendfile()允许目标文件描述符不是套接字(例如磁盘文件或管道)之外的内容?

我似乎记得这是早期Linux 2.6中引入的限制(2.4没有限制)。

从2.6.17版本开始,Linux具有类似splice()的系统调用。 更灵活,但效率略低。 Linus谈到了用splice()重新实现sendfile。 参见http://kerneltrap.org/node/6505

从根本上讲,唯一限制的是“还没有人写过代码”。

但是,我认为没有人为您提到的这两种情况编写代码的原因是,它们都需要复制数据,这首先消除了使用sendfile许多优势。

  • 对于文件到文件sendfile ,您需要一个副本,因为否则,同一页必须与源文件中的干净页和目标文件中的脏页一样位于页缓存中。 我不认为页面缓存目前是用来处理这种情况的(当然,如果有足够的动机,可以更改此设置)。

  • 对于文件到管道sendfile ,无论目标进程是否需要获取数据的私有可写副本,都需要一个副本。 无论如何,对于这种情况的大多数使用,我们已经有了mmap

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM