如何在 Windows 10 上使用 IPC::Run 捕获超时异常?

Posted

技术标签:

【中文标题】如何在 Windows 10 上使用 IPC::Run 捕获超时异常?【英文标题】:How to catch timeout exception with IPC::Run on Windows 10? 【发布时间】:2021-04-29 19:28:47 【问题描述】:

我正在尝试在 Windows 10 上使用 IPC::Run 捕获超时异常(使用 Strawberry Perl 版本 5.30.1):

use strict;
use warnings;
use feature qw(say);
use Data::Dumper;
use IPC::Run qw(run timeout);

my $timeout = 3;
my $cmd = ['perl', '-E', "sleep 5; say 'stdout_text'; say STDERR 'stderr_text'"];
my $in;
my $out;
my $err;
my $result;
eval 
    $result = run $cmd, \$in, \$out, \$err, timeout($timeout );
;
if ( $@ ) 
    say "Timed out: $@";

else 
    print Dumper(  out => $out, err => $err);

上述程序在 3 秒后终止:

Terminating on signal SIGBREAK(21)

如何在 Perl 脚本中捕获超时异常?

另请参阅this 问题。

【问题讨论】:

您尝试处理信号了吗?也许像here @zdim 感谢您的链接,是的,它似乎可以与安装的 $SIGBREAK 处理程序一起使用! 刚开始尝试一下——我没有收到 SIGBREAK,而是一个实际的异常(像往常一样由 eval 处理)。这是在带有 Strawberry Perl v5.30.2 的 Windows 10(在 VM 中)上; IPC::Run 源显示 $VERSION20200505.0。 (我很困惑?) 【参考方案1】:

感谢@zdim!您需要为BREAK 信号安装信号处理程序。以下作品:

use strict;
use warnings;
use feature qw(say);
use Data::Dumper;
use IPC::Run qw(run timeout);

my $timeout = 3;
my $cmd = ['perl', '-E', "sleep 4; say 'stdout_text'; say STDERR 'stderr_text'"];
my $in;
my $out;
my $err;
my $result;

    local $SIGBREAK = sub  die "Got timeout signal" ;
    eval 
        $result = run $cmd, \$in, \$out, \$err, timeout($timeout );
    ;

if ( $@ ) 
    say "Timed out: $@";

else 
    print Dumper(  out => $out, err => $err);
 

输出

> perl p.pl
Timed out: Got timeout signal at p.pl line 14.

【讨论】:

以上是关于如何在 Windows 10 上使用 IPC::Run 捕获超时异常?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 10 上安装 nodemon?

如何使用 USB 声卡在 Windows 10 上启用 android 模拟器声音?

如何在 Windows 10 上安装 Torch?

如何在 Windows 10 上控制蓝牙 LE 连接?

如何在 Windows 10 上远程启动服务

如何在 Windows 10 上使用 Powershell 将 Google Colab 与本地 TensorFlow Jupyter 服务器一起使用?