如何在 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
源显示 $VERSION
的 20200505.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 捕获超时异常?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 USB 声卡在 Windows 10 上启用 android 模拟器声音?
如何在 Windows 10 上使用 Powershell 将 Google Colab 与本地 TensorFlow Jupyter 服务器一起使用?