2009-11-10 4 views
13

Process 클래스를 사용하여 exe를 실행하고 있습니다.내 프로세스가 입력을 기다리고 있습니까?

exe는 내가 제어하지 않는 타사 콘솔 응용 프로그램입니다.

프로세스가 명령 줄에서 입력을 기다리고 있는지 여부를 알고 싶습니다.

차이가 있다면 입력 대기 중일 때 응용 프로그램을 종료하려고합니다.

프로그램에서 출력을 기다리는 동안 적절한 이벤트가 있지만 프로세스가 입력을 참을성있게 기다리고있을 때 비슷한 이벤트가 표시되지 않습니다.

  ProcessStartInfo info = new ProcessStartInfo(); 
      info.FileName = "myapp.exe"; 
      info.CreateNoWindow = true; 
      info.UseShellExecute = false; 
      info.RedirectStandardError = true; 
      info.RedirectStandardInput = true; 
      info.RedirectStandardOutput = true; 
      process.StartInfo = info; 

      process.OutputDataReceived += new DataReceivedEventHandler(process_OutputDataReceived); 
      process.ErrorDataReceived += new DataReceivedEventHandler(process_ErrorDataReceived); 

      process.Start(); 

      process.BeginOutputReadLine(); 
      process.BeginErrorReadLine(); 


      process.WaitForExit(); 

프로세스가 입력 대기 중임을 어떻게 감지합니까? (시작을 호출 한 후 그 ... 당신이

process.StandardInput.Close(); 

에 시도 할 수 실패

foreach(ProcessThread thread in process.Threads) 
    if (thread.ThreadState == ThreadState.Wait 
     && thread.WaitReason == ThreadWaitReason.UserRequest) 
      process.Kill(); 

: 제 3 자 프로세스가 정확히 폴링의 스레드 '상태를 시도 할 수 무엇을하고 있는지에 따라

+0

내 관심사가 당신의 문제가됩니다. GUI 응용 프로그램 (내 질문 참조)에서 모달 루프를 감지하기위한 몇 가지 단점을 만들었지 만 콘솔 응용 프로그램에 대해서는 아직까지 좋은 해결책을 찾지 못했습니다. – jdehaan

답변

14

), 표준 입력에서 읽으려는 경우 하위 프로세스에서 예외가 발생한다고 추측합니다.

+0

이것은 내 테스트 장비에서 작동하는 것으로 보입니다. 나는 그것을 다음에 문제를 일으키는 실제 프로그램과 비교해 볼 것입니다. 정보 : process.StandardInput.Close()를 사용하여 실행중인 프로그램이 예외를 수신하지 못했으며 조용히 실행이 중지되었습니다. –

+1

오늘 WaitReason이'ThreadWaitReason.LpcReply'인지 확인하고 싶습니다. –

2

콘솔 응용 프로그램에 입력 대기 중의 프롬프트가있는 경우 프로세스의 Process.StandardOutput 등록 정보를 사용하여 콘솔 출력 텍스트를 정기적으로 구문 분석하고 프롬프트를 기다릴 수 있습니다. 적절한 문자열이 감지되면 입력을 기다리는 것을 알 수 있습니다. http://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardoutput.aspx을 참조하십시오.

+0

훌륭한 접근 방식. 그것은 내 문제를 해결하지 않지만 출력을 처리 할 수있는 상황에 대한 올바른 접근 방법입니다. 다시 한번 감사드립니다. –

+0

일부 콘솔 프로그램은 응답을받을 때까지 사용자 프롬프트를 콘솔로 플러시하지 않으므로이 방법이 항상 작동하지 않을 수도 있습니다. –

관련 문제