perl syswrite函数

计算机技术 · perl 程序开发2013-05-010次浏览0 个评论

syswrite用法:

text
syswrite FILEHANDLE, SCALAR, LENGTH, OFFSET
syswrite FILEHANDLE, SCALAR, LENGTH
syswrite FILEHANDLE, SCALAR

syswrite函数详解:

这个函数试图用 write(2) 系统调用向你声明的 FILEHANDLE 里写入从变量 SCALAR 里获取的 LENGTH 字节的数据。该函数返回实际写入的字节数,或者是出错时返回 undef。如果声明了 OFFSET,那么它指明从字串里的哪个位置开始写。(比如,你可能用一个字串做一个缓冲区,这时你就需要这个功能了,或者你需要从一个部分写中恢复过来。)负数 OFFSET 表示写应该从该字串的后面向前数这么多个字节。如果 SCALAR 是空的,那么唯一允许的 OFFSET 是 0。如果 LENGTH 为负数或者 OFFSET 指向了字串的外面,那么就会抛出一个例外。
要从文件句柄 FROM 中拷贝数据到文件句柄 TO,你可以用下面这样的东西:

perl
use Errno qw/EINTR/;
$blksize = (stat FROM)[11] || 16384;      # 选定的块大小?
while ($len = sysread FROM, $buf, $blksize) {
  if (!defined $len) {
     next if $! == EINTR;
     die "System read error: $!\n"
  }
  $offset = 0;
  while ($len) {            # 处理部分写问题
     $written = syswrite TO, $buf, $len, $offset;
     die "System write error: $!\n" unless defined $written;
     $offset   += $written;
     $len   -= $written;
  }
}

你必须准备处理标准 I/O 通常会为你处理的问题,比如部分写。因为 syswrite 绕开了 C 标准 I/O 库,所以不要把它的调用和读(除了 sysread 以外),写(象 print,printf,或者 write),或者其他 stdio 函数,比如 seek,tell,或者 eof 混合在一起用,除非你想自找麻烦。

评论

0

评论加载中…

发表评论

0/2000