2014-07-12 9 views
1

나는 다음과 같은 라인을 따라 정의 된 제한 시간 내에 종료해야 자식 프로세스를 시작하고 살고있다. 내 주요 프로그램은 C#로 작성되었으며 Visual Studio 2013Windows 7 64 비트을 사용하여 개발했습니다.자식 프로세스는 영원히

대부분의 경우 위 코드가 작동하고 적절한 프로세스 시간 초과 종료가 수행됩니다. 그러나 약 5 %의 경우에 process.Kill()에는 눈에 띄는 효과가 없습니다. 하위 프로세스는 활성 상태로 유지됩니다.

낮은 우선 순위로 하위 프로세스를 시작하려고했습니다. 나는 또한 그것을 죽이기 전에 그것을 중단하려했다. 외부 도구로 TASKKILL /F을 호출하는 것이 항상 도움이되는 것은 아닙니다. 문제는 모든 SAT 해결사에게 발생하지 않습니다. 관리자 권한이 있지만 관리자로 주 프로그램을 실행하지 않습니다.

내 응용 프로그램의 하위 프로세스를 안정적으로 종료하려면 어떻게해야합니까?

편집 : 외에도 자신의 타임 아웃 예산을 초과에서
는, 자식 프로세스는 매우 정상적인 행동과 (관리자 상승없이) 프로세스 탐색기를 사용하여 수동으로 사망 할 수 있습니다. 문제는 시간 초과 후 프로세스가 실행되지 않도록하는 방법입니다.

해결 방법 : 내가 VC++ 2013를 사용하여 제한 시간 도구를 구현 한
. 자식 프로세스를 직접 호출하는 대신, 지금은 자식 프로세스를 호출하는 도구를 호출합니다. 이 도구는 CreateProcess()TerminateProcess()을 사용하여 하위 프로세스를 시작하고 중지합니다. C# 프로그램에서 CreateProcess()TerminateProcess()을 직접 호출 할 수 있습니다. 추가 프로세스를 생성하지 않고 직접 호출 할 수 있습니다.
해결 방법은 좋지 않지만 내 문제는 해결됩니다.

+1

은, 모든 IO는 취소 할 수. 처리 할 수없는 IO가 해결되지 않으면 좀비 상태가 될 수 있습니다. 그것은 매우 드뭅니다. – usr

+0

'Kill'에 대한 문서에서 : "Kill 메서드는 비동기 적으로 실행됩니다.Kill 메서드를 호출 한 후 WaitForExit 메서드를 호출하여 프로세스가 종료 될 때까지 기다리거나 HasExited 속성을 검사하여 프로세스가 종료되었는지 확인합니다. –

+1

또한 Kill에서 발생하는 예외를 잡으려고 시도하십시오. 응용 프로그램이 종료되기 때문에 예외가 throw되고 표시되지 않을 수 있습니다. –

답변

0

양방향 WCF 파이프로 인해 상위 프로세스와 하위 프로세스가 모니터링되는 하위 프로세스 관리 라이브러리를 만들었습니다. 자식 프로세스가 종료되거나 부모 프로세스가 종료되면 서로에게 통지됩니다. VS 디버거를 시작된 하위 프로세스에 자동으로 연결하는 디버거 도우미도 사용할 수 있습니다.

어쩌면 아이 프로세스를 제어하는 ​​데 사용할 수 있습니다.

프로젝트 사이트 :

http://www.crawler-lib.net/child-processes

NuGet 패키지 : Windows에서

https://www.nuget.org/packages/ChildProcesses https://www.nuget.org/packages/ChildProcesses.VisualStudioDebug/

+0

내 응용 프로그램에서 하위 프로세스는 변경할 수없는 외부 타사 .exe 프로세스입니다. 프로세스 상태를보고 kill 명령을 실행하기 위해 일반적인 Windows 메커니즘을 사용할 수 있습니다. 나는 당신의 접근 방식을 완전히 이해하지는 못했지만 제 경우에는 적용되지 않습니다. –

+0

오, 나는 자식 프로세스가 C#으로 작성되었다고 생각했다. 증서 내 접근법은 타사 프로세스에 충분하지 않습니다. 프로세스를 종료하지 않고 종료하려고 시도 했습니까? 프로세스를 종료하면 특정 리소스가 차단 될 수 있으며 항상 가능하지는 않습니다. –

+0

콘솔 응용 프로그램은 Ctrl-C를 보내서 종료되며 Windows 응용 프로그램은 WM_CLOSE 메시지를 보내 종료됩니다. http://stackoverflow.com/questions/283128/how-do-i-send-ctrlc-to-a-process-in-c http://stackoverflow.com/questions/5402158/using-sendmessage -to-send-wm-close-to-another-process 이것이 작동하지 않고 프로세스가 실제로 "멈춤"하는 경우 프로세스를 죽일 것입니다. –