我有这个简单的程序:
close STDIN;
exec("cat");
输出:
cat: -: Bad file descriptor
cat: closing standard input: Bad file descriptor
我想在Perl脚本中检测相同的情况,exec
代替cat
。
到目前为止,我尝试了fileno
,tell
和Scalar::Util::openhandle
,但都没有产生好结果
解决方案同样适用于STDERR
,STDIN
和STDOUT
答案 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';