gpt4 book ai didi

perl - 在 Windows 中经过一定时间后终止 system()

转载 作者:行者123 更新时间:2023-12-04 18:13:07 25 4
gpt4 key购买 nike

我正在从 perl 脚本(使用 system())中运行有时不返回的命令行应用程序,确切地说,它会引发异常,需要用户输入以中止应用程序。该脚本用于自动测试我正在使用 system() 命令运行的应用程序。由于它是自动化测试的一部分,因此如果发生异常,sytem() 命令必须返回并认为测试失败。

我想编写一段代码来运行这个应用程序,如果发生异常,考虑到这个测试失败,它必须继续执行脚本。

一种方法是运行应用程序一段时间,如果系统调用在这段时间内没有返回,我们应该终止 system() 并继续执行脚本。
(How can I terminate a system command with alarm in Perl?)

实现此目的的代码:

my @output;
eval {
local $SIG{ALRM} = sub { die "Timeout\n" };
alarm 60;
return = system("testapp.exe");
alarm 0;
};
if ($@) {
print "Test Failed";
} else {
#compare the returned value with expected
}

但是这段代码在windows上不起作用我对此做了一些研究,发现SIG不适用于windows(书编程Perl)。
有人可以建议我如何在 Windows 中实现这一目标吗?

最佳答案

我建议查看 Win32::Process模块。它允许您启动一个进程,等待它一段时间,甚至在必要时终止它。根据文档提供的示例,它看起来很简单:

use Win32::Process;
use Win32;

sub ErrorReport{
print Win32::FormatMessage( Win32::GetLastError() );
}

Win32::Process::Create($ProcessObj,
"C:\\path\\to\\testapp.exe",
"",
0,
NORMAL_PRIORITY_CLASS,
".")|| die ErrorReport();

if($ProcessObj->Wait(60000)) # Timeout is in milliseconds
{
# Wait succeeded (process completed within the timeout value)
}
else
{
# Timeout expired. $! is set to WAIT_FAILED in this case
}

您也可以休眠适当的秒数并使用 kill本模块中的方法。我不完全确定 NORMAL_PRIORITY_CLASS创建标志是您要使用的标志;该模块的文档非常糟糕。我看到一些使用 DETACHED_PROCESS 的示例旗帜。您必须尝试使用​​该部分才能看到有效的方法。

关于perl - 在 Windows 中经过一定时间后终止 system(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9050147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com