2012-01-29 2 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 
} 

하지만이에 대한 몇 가지 연구를하고 SIG는 (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 및 리눅스 모두를위한 코드는 함수가 timeout_system($seconds, $command, $arg, $arg, $arg)

관련 문제