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

问题描述 投票:21回答:1

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

perl io system-calls
1个回答
25
投票

关于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个参数。
© www.soinside.com 2019 - 2024. All rights reserved.