Как определить, является ли дескриптор файла Perl дескриптором чтения или записи? - PullRequest
13 голосов
/ 23 марта 2009

Вам предоставляется либо IO::File объект, либо глобус типа (\*STDOUT или Symbol::symbol_to_ref("main::FH")); Как бы вы определили, является ли он ручкой для чтения или записи? Интерфейс не может быть расширен для передачи этой информации (я переопределяю close, чтобы добавить вызовы к flush и sync до фактического закрытия).

В настоящее время я пытаюсь flush и sync дескриптор файла и игнорирую ошибку "Invalid argument" (что я получаю, когда пытаюсь flush или sync чтение дескриптора файла):

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: $!";
        }
};

1 Ответ

7 голосов
/ 23 марта 2009

Посмотрите на опции fcntl. Может быть F_GETFL с O_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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...