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 :
실제로보고 싶다면 :
-
calc.exe 또는 notepad.exe를 바탕 화면에 복사합니다.
-
CFF 탐색기에서 복사 한 calc.exe 열기
-
Nt 헤더-> 선택적 헤더로 이동하십시오.
-
하위 시스템을 0x002에서 0x003으로 변경
-
저장해
이제 새로 수정 된 계산을 실행하면 명령 프롬프트가 종료 될 때까지 대기하는 것을 볼 수 있습니다.
답변
명령 프롬프트의 기본값은 별도의 프로세스 / 포크에서 GUI 프로그램을 생성하는 것입니다. 그러나 명령 프롬프트 / 셸 스크립트를 사용하여 메모장 (또는 기타 GUI 프로그램)을 인라인으로 실행할 수 있습니다.
start /w notepad.exe
이렇게하면 notepad.exe 프로세스가 종료 된 후에 만 명령 프롬프트 / 셸 스크립트가 계속됩니다.
이것이 도움이되기를 바랍니다, TW
답변
새 프로세스를 시작할 때 실제로 프롬프트 경계 밖에서 작동하는이 컨텍스트의 GUI 애플리케이션은 프롬프트가 기다리지 않습니다. 그러나 현재 프롬프트 인스턴스의 경계에서 완전히 작동하는 명령을 실행하면 대기합니다.
따라서 command notepad
는 메모장 응용 프로그램을 시작하고 응용 프로그램의 제어권을 남깁니다. 반면 명령 ipconfig
은 프롬프트 의 도메인 ( 응용 프로그램 도메인 이 아님 )에서 실행됩니다.
매우 일반화하려면 Process.Start
해당 C #에서 사용할 때 기다리지 마십시오. 어쨌든 그렇지 않습니다.