`read`和`sysread`有什么区别?

时间:2016-03-30 16:55:52

标签: perl io system-calls

readsysread的文档非常相似。这两者有什么不同?

1 个答案:

答案 0 :(得分:25)

关于read

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

关于sysread

  • sysread不支持PerlIO图层(意味着它需要原始的a.k.a.二进制句柄)。
  • sysread仅适用于映射到系统文件句柄/描述符 [4] 的Perl文件句柄。
  • 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个参数。

相关问题