syswrite用法:
text
syswrite FILEHANDLE, SCALAR, LENGTH, OFFSET
syswrite FILEHANDLE, SCALAR, LENGTH
syswrite FILEHANDLE, SCALARsyswrite函数详解:
这个函数试图用 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评论加载中…