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

ike*_*ami 20 io perl system-calls

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

ike*_*ami 24

关于read:

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

关于sysread:

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

总结和结论:

  • read适用于任何Perl文件句柄,同时sysread仅限于映射到系统文件句柄/描述符的Perl文件句柄.
  • read[5]不兼容,但兼容.selectsysreadselect
  • 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参数.

  • 此外,你可以从不是实际文件的东西"读取"(也许你打开文件句柄到scalarref或`TIEHANDLE`d的东西),但你只能`sysread`一些积极的`fileno()`. (3认同)