【问题标题】:What is the difference between `read` and `sysread`?`read` 和 `sysread` 有什么区别?
【发布时间】:2016-07-18 19:52:20
【问题描述】:

readsysread 有非常相似的文档。两者有什么区别?

【问题讨论】:

  • grrr :-) 这是个好问题
  • 感谢@G。 Cito 提出这个问题。

标签: perl io system-calls


【解决方案1】:

关于read

  • read 支持 PerlIO 层。
  • read 适用于任何 Perl 文件句柄[1]
  • read 缓冲区。
  • read 以固定大小的 8 KiB 块从系统获取数据[2]
  • 如果可用数据少于请求的数据,read 可能会阻止[3]

关于sysread

  • sysread 不支持 PerlIO 层(这意味着它需要一个原始的 a.k.a. 二进制句柄)。
  • sysread 仅适用于映射到系统文件句柄/描述符的 Perl 文件句柄[4]
  • sysread 不缓冲。
  • sysread 执行单个系统调用。
  • sysread 如果有数据可以返回,则立即返回,即使数据量小于请求的数量。

总结和结论:

  • read 适用于任何 Perl 文件句柄,而 sysread 仅限于映射到系统文件句柄/描述符的 Perl 文件句柄。
  • readselect 不兼容[5],而 sysreadselect 兼容。
  • read 可以为你解码,而sysread 需要你自己解码。
  • read 对于非常小的读取应该更快,而sysread 对于非常大的读取应该更快。

注意事项:

  1. 例如,这些包括绑定的文件句柄和使用 open(my $fh, '<', \$var) 创建的句柄。

  2. 在 5.14 之前,Perl 读取 4 KiB 块。从 5.14 开始,在构建 perl 时可以配置块的大小,默认为 8 KiB。

  3. 根据我的经验,read 在从普通文件读取时将准确返回请求的数量(如果可能),但在从管道读取时可能返回更少。这些结果绝不能保证。

  4. fileno 为这些返回一个非负数。例如,这些包括从普通文件、管道和套接字读取的句柄,但不包括 [1] 中提到的句柄。

  5. 我指的是 IO::Select 调用的 4 参数。

【讨论】:

  • 很棒的总结。 - 应该在 perlfunc 中。这:“read 对于小读取应该更快,而sysread 对于大读取应该更快。”正是需要的。当然,考虑到真实单词的无限可能性,它可能并不总是正确,但我想要的是一个最真实的 perlish 指南。
  • 在回复another question 时,我使用了Stream::Reader。作为一个实验,我在Reader.pm 中用sysread 替换了read,并获得了9-10% 的吞吐量——这似乎太容易了。除了明显的位(缓冲、编码)之外,这只是基准测试和测试的问题吗?您能谈谈其中的任何数据完整性、故障转移/稳健性元素吗?
  • @G.Cito 在 Stream::Reader 等可重用代码中,您必须假设文件句柄可能有层,因此 sysread 不是一个选项。
  • @G。 Cito,谈到“UTF-8 模式”意味着它们不仅有可能具有层,而且它是一种受支持的操作模式。这会阻止 sysread 成为有效选项。
  • 另外,你可以read来自实际上不是文件的东西(也许你打开了一个标量引用或TIEHANDLEd的文件句柄),但你只能sysread带有a的东西积极fileno().
猜你喜欢
  • 2010-10-09
  • 1970-01-01
  • 2017-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-19
相关资源
最近更新 更多