2012-01-29 15 views
5

私は、時には戻ってこないperlスクリプト(system()を使用)からコマンドラインアプリケーションを実行しています。アプリケーションを中止するためのユーザー入力。このスクリプトは、system()コマンドを使用して実行しているアプリケーションの自動テストに使用されます。自動テストの一部であるため、例外が発生した場合にsytem()コマンドが返され、テストが失敗したものとみなされます。Windowsで一定時間が経過した後にシステムを終了する

このアプリケーションを実行するコードを書きたいと思います。例外が発生した場合は、このテストが失敗すると考えてスクリプトを続行する必要があります。

これを実行する方法の1つは、一定の期間アプリケーションを実行することです。システムコールがその時間内に戻らない場合は、システムを終了してスクリプトを続行する必要があります。これを達成するための (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 ([email protected]) { 
    print "Test Failed"; 
} else { 
    #compare the returned value with expected 
} 

が、私はこの上でいくつかの研究を行なったし、SIGは、(WindowsのブックプログラミングPerlを動作しないことが判明、このコードは、Windows上では動作しません。 )。 Windowsでこれを実現するにはどうすればいいのでしょうか?

答えて

6

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フラグを使用していくつかの例を参照してください。何が効果的かを知るには、その部分で遊ぶ必要があります。

+0

どうもありがとうです!できます :) – int80h

1

Proc::Backgroundを参照してください、それはWin32とLinuxの両方のコードを抽象化し、機能がtimeout_system($seconds, $command, $arg, $arg, $arg)