2012-01-29 70 views
5

我在perl腳本中運行了一個命令行應用程序(使用system()),它有時不會返回,確切地說它會拋出需要用戶輸入以中止應用程序。該腳本用於使用system()命令運行的應用程序的自動化測試。因爲它是自動化測試的一部分,所以如果發生異常,則必須返回sytem()命令並認爲測試失敗。在Windows中經過一段時間後終止系統()

我想編寫一段運行此應用程序的代碼,並且如果發生異常,則必須繼續考慮此測試失敗的腳本。

執行此操作的一種方法是在某段時間內運行應用程序,如果系統調用在該時間段內未返回,則應終止系統()並繼續執行腳本。爲實現這一 (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 
} 

但是這個代碼不工作在Windows上我做了一些這方面的研究和發現,SIG不會對窗口工作(書的Perl編程)。 可能有人建議我怎麼能在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 2012-01-30 02:52:16