检测封闭流

时间:2014-05-08 11:17:08

标签: perl

我有这个简单的程序:

close STDIN;
exec("cat");

输出:

cat: -: Bad file descriptor
cat: closing standard input: Bad file descriptor

我想在Perl脚本中检测相同的情况,exec代替cat

到目前为止,我尝试了filenotellScalar::Util::openhandle,但都没有产生好结果

解决方案同样适用于STDERRSTDINSTDOUT

2 个答案:

答案 0 :(得分:0)

这也可以。

print "closed" if (tell(STDIN) == -1);

答案 1 :(得分:0)

对于POSIX兼容的操作系统,您可以使用select(2)

#!/usr/bin/perl
use strict;
use warnings;

use POSIX qw[STDIN_FILENO];
use Errno qw[EBADF];

close STDIN unless @ARGV;

sub is_stdin_closed {
    vec(my $fdset = '', STDIN_FILENO, 1) = 1;
    my $nfound = select($fdset, undef, undef, 0);
    return ($nfound == -1 && $! == EBADF);
}

printf "is STDIN closed? %s\n", is_stdin_closed()? 'yes' : 'no';