加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

unix – 写一个socket是sendfile()系统调用的任意限制吗?

发布时间:2020-12-16 01:45:03 所属栏目:安全 来源:网络整理
导读:序幕 sendfile()是一个非常有用的系统调用,原因有两个: 首先,如果你喜欢jive)循环,它的代码少于read()/ write()(或recv()/ send(). 其次,它比上述方法更快(更少的系统调用,实现可以在没有缓冲区的设备之间复制等). 更少的代码.更高效.真棒. 在UNIX中,一切都
序幕

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

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

更少的代码.更高效.真棒.

在UNIX中,一切都是(大部分)文件.这是柏拉图理论与现实世界实践碰撞的丑陋领域.我知道套接字根本不同于驻留在某些设备上的文件.我没有挖掘Linux / * BSD / Darwin的来源/任何操作系统实现sendfile()以了解为什么这个特定的系统调用仅限于写入套接字(特别是流套接字).

我只是想知道…

什么限制sendfile()允许目标文件描述符除了套接字(如磁盘文件或管道)之外的东西?

解决方法

从根本上说,唯一限制它的是“没有人编写代码”.

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

>对于文件到文件的sendfile,您需要一个副本,因为否则同一页面必须在pagecache中作为源文件中的干净页面和目标文件中的脏页面.我认为目前没有构建pagecache来处理这种情况(当然,如果有足够的动机,这可能会改变).>对于文件到管道的sendfile,因为目标进程需要获取数据的私有可写副本.无论如何,对于这种情况的大多数用途,我们已经有了mmap.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读