13

给你一个IO::File对象或一个 typeglob(\*STDOUTSymbol::symbol_to_ref("main::FH"));您将如何确定它是读句柄还是写句柄?无法扩展接口以传递此信息(我正在重写以在实际关闭之前和之前close添加调用)。flushsync

目前我正在尝试flushsync文件句柄并忽略错误"Invalid argument"(这是我尝试flushsync读取文件句柄时得到的):

eval { $fh->flush; 1 } or do {
        #this seems to exclude flushes on read handles
        unless ($! =~ /Invalid argument/) {
                croak "could not flush $fh: $!";
        }
};

eval { $fh->sync; 1 } or do {
        #this seems to exclude syncs on read handles
        unless ($! =~ /Invalid argument/) {
                croak "could not sync $fh: $!";
        }
};
4

1 回答 1

8

看看 fcntl 选项。也许F_GETFLO_ACCMODE.

编辑:我在午餐时做了一些谷歌搜索和玩,这里有一些可能不可移植的代码,但它适用于我的 Linux 机器,可能适用于任何 Posix 系统(也许甚至是 Cygwin,谁知道?)。

use strict;
use Fcntl;
use IO::File;

my $file;
my %modes = ( 0 => 'Read only', 1 => 'Write only', 2 => 'Read / Write' );

sub open_type {
    my $fh = shift;
    my $mode = fcntl($fh, F_GETFL, 0);
    print "File is: " . $modes{$mode & 3} . "\n";
}

print "out\n";
$file = new IO::File();
$file->open('> /tmp/out');
open_type($file);

print "\n";

print "in\n";
$file = new IO::File();
$file->open('< /etc/passwd');
open_type($file);

print "\n";

print "both\n";
$file = new IO::File();
$file->open('+< /tmp/out');
open_type($file);

示例输出:

$ perl test.pl 
out
File is: Write only

in
File is: Read only

both
File is: Read / Write
于 2009-03-23T05:43:23.310 回答