【问题标题】:Terminating a system() after certain amount of time in Windows在 Windows 中经过一定时间后终止 system()
【发布时间】:2012-02-21 10:29:18
【问题描述】:

我正在从 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 中实现这一目标吗?

【问题讨论】:

    标签: perl


    【解决方案1】:

    我建议查看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 标志的示例。您必须尝试该部分才能看到有效的方法。

    【讨论】:

      【解决方案2】:

      Proc::Background,它抽象了win32和linux的代码,函数是timeout_system( $seconds, $command, $arg, $arg, $arg )

      【讨论】:

        猜你喜欢
        • 2018-08-28
        • 1970-01-01
        • 1970-01-01
        • 2013-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-03
        相关资源
        最近更新 更多