前奏

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

第一,它的 不少代码read()/write() (或 recv()/send() 如果你喜欢摇摆)的循环。
第二,它的 速度更快 (小的系统调用,实现可复制设备之间 没有 缓冲器,等等。),比前述的方法。

小的代码。更有效率。真棒。

在UNIX,一切都是(大部分)的文件。这是丑陋的领土从碰撞的柏拉图式的理论和实际做法。我的理解是,插座是从根本上不同于文件居住在一些设备。我没有挖过来源的Linux/*BSD/达尔文/无论OS实现了 sendfile() 知道为什么这一具体的系统调用是限于书面插座(具体而言,流sockets).

我只是想知道...

的问题

什么是限制 sendfile() 从允许目的地的文件描述要的东西除了一个插座(像个磁盘文件,或一个管)?

有帮助吗?

解决方案

从根本上讲,唯一的限制是,"没有一个人写的代码"。

然而,我收集的原因,没有人写的代码这两个案件的您说的是,他们都会需要的数据可以复制,其中删除的许多优点的使用 sendfile 在第一位。

  • 对于文件备案 sendfile, 你会需要一个副本,因为否则同一页就必须在页缓存作为清洁页源文件中和一个肮脏的一页的目的地的文件。我不认为页缓存是建立处理这种情况下在那一刻,(尽管当然,这可能是改变,如果有足够的动机).

  • 对于一个文件管 sendfile, 你需要一个副本而不管因为目的地的过程中需要得到一个私营的、可复制的数据。无论如何,对于大多数使用的这种情况下,我们已经有 mmap.

其他提示

我似乎记得,这是一个限制引进了早期Linux2.6(2.4没有限制).

由于2.6.17Linux具有的拼接()system call其是类似的;更加灵活,但稍有效率较低。莱纳斯谈到重新执行与在拼接().看看 http://kerneltrap.org/node/6505

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top