[c#] 명령 프롬프트는 종료 대기 시점을 어떻게 알 수 있습니까?

Windows 명령 프롬프트를 C #으로 다시 코딩하려고했습니다. 명령 프롬프트가 프로세스가 종료되기를 기다릴 때와 호출 된 프로세스가 종료 될 때까지 기다리지 않을 때를 어떻게 아는지 궁금합니다.

예를 들어 “notepad”명령 프롬프트에 입력하면 메모장 이 시작되지만 다른 명령은 계속 실행할 수 있습니다. 그러나 more.com, ping.exe 또는 다른 유틸리티와 같은 유틸리티를 열면 다른 명령을 실행하기 전에 실행 프로그램이 완료 될 때까지 기다립니다.

명령 프롬프트는 종료를 기다릴 때를 어떻게 알 수 있으며 C #에서이 동작을 어떻게 에뮬레이션 할 수 있습니까?



답변

응용 프로그램이 Win32 GUI 응용 프로그램 인 경우 실행되고 명령 프롬프트는 종료 될 때까지 기다리지 않습니다.

애플리케이션이 콘솔 애플리케이션 인 경우 명령 프롬프트에서 실행되며 명령 프롬프트를 다시 가져 오려면 완료 될 때까지 기다려야합니다.

편집하다:

확인. 기술적 인 설명이 필요한 것 같습니다. 응용 프로그램에서 동일한 기능을 에뮬레이트하려면 여기IMAGE_OPTIONAL_HEADER 에서 EXE 파일을 확인할 수 있습니다 .

내부 IMAGE_OPTIONAL_HEADER에는 다음이 있습니다.

 WORD                 Subsystem;

If SubSystem == 0x02 그것은 GUI 애플리케이션임을 의미합니다.

If SubSystem == 0x03 그것은 명령 프롬프트 앱임을 의미합니다.

편집 2 :

실제로보고 싶다면 :

  1. http://www.ntcore.com/exsuite.php 다운로드

  2. calc.exe 또는 notepad.exe를 바탕 화면에 복사합니다.

  3. CFF 탐색기에서 복사 한 calc.exe 열기

  4. Nt 헤더-> 선택적 헤더로 이동하십시오.

  5. 하위 시스템을 0x002에서 0x003으로 변경

  6. 저장해

이제 새로 수정 된 계산을 실행하면 명령 프롬프트가 종료 될 때까지 대기하는 것을 볼 수 있습니다.


답변

명령 프롬프트의 기본값은 별도의 프로세스 / 포크에서 GUI 프로그램을 생성하는 것입니다. 그러나 명령 프롬프트 / 셸 스크립트를 사용하여 메모장 (또는 기타 GUI 프로그램)을 인라인으로 실행할 수 있습니다.

start /w notepad.exe

이렇게하면 notepad.exe 프로세스가 종료 된 후에 만 ​​명령 프롬프트 / 셸 스크립트가 계속됩니다.

이것이 도움이되기를 바랍니다, TW


답변

새 프로세스를 시작할 때 실제로 프롬프트 경계 밖에서 작동하는이 컨텍스트의 GUI 애플리케이션은 프롬프트가 기다리지 않습니다. 그러나 현재 프롬프트 인스턴스의 경계에서 완전히 작동하는 명령을 실행하면 대기합니다.

따라서 command notepad는 메모장 응용 프로그램을 시작하고 응용 프로그램의 제어권을 남깁니다. 반면 명령 ipconfig은 프롬프트 의 도메인 ( 응용 프로그램 도메인 이 아님 )에서 실행됩니다.

매우 일반화하려면 Process.Start해당 C #에서 사용할 때 기다리지 마십시오. 어쨌든 그렇지 않습니다.


답변