fri*_*edo 14
这似乎不是一个特别聪明的想法,但绑定文件句柄应该工作.根据perltie
联机帮助页:
当STDERR绑定时,将调用其PRINT方法以发出警告和错误消息.在调用期间暂时禁用此功能,这意味着您可以在PRINT中使用warn()而无需启动递归循环.
所以像这样的东西(改编自手册页的例子)应该工作:
package FatalHandle;
use strict;
use warnings;
sub TIEHANDLE { my $i; bless \$i, shift }
sub PRINT {
my $r = shift;
die "message to STDERR: ", @_;
}
package main;
tie *STDERR, "FatalHandle";
warn "this should be fatal.";
print "Should never get here.";
Run Code Online (Sandbox Code Playgroud)
并输出(退出代码255):
message to STDERR: this should be fatal. at fh.pl line 17.
Run Code Online (Sandbox Code Playgroud)
这是一个无论如何写入STDERR(fd 2)的方法,即使它是一个不使用Perl STDERR
变量的C扩展也是如此.它甚至会杀死写入STDERR的子进程!
{
pipe(my $r, my $w)
or die("Can't create pipe: $!\n");
open(STDERR, '>&', $w)
or die("Can't dup pipe: $!\n");
close($r);
}
print "abc\n";
print "def\n";
print STDERR "xxx\n";
print "ghi\n";
print "jkl\n";
Run Code Online (Sandbox Code Playgroud)
$ perl a.pl
abc
def
$ echo $?
141
Run Code Online (Sandbox Code Playgroud)
在Windows上不起作用.如果添加SIGPIPE处理程序,则不起作用.
归档时间: |
|
查看次数: |
228 次 |
最近记录: |