명령 프롬프트는 종료 대기 시점을 어떻게 알 수 있습니까?
C #에서 Windows 명령 프롬프트를 다시 코딩하려고했습니다. 명령 프롬프트가 프로세스가 종료되기를 기다릴 때와 호출 된 프로세스가 종료 될 때까지 기다리지 않을 때를 어떻게 아는지 궁금합니다.
예를 들어 "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
은 프롬프트 의 도메인 ( 응용 프로그램 도메인 이 아님 )에서 실행됩니다.
To extremely generalize, when you use Process.Start
in your C# equivalent, do not wait. It anyway will not.
참고URL : https://stackoverflow.com/questions/22273777/how-does-the-command-prompt-know-when-to-wait-for-exit
'programing tip' 카테고리의 다른 글
"바이트 수"를 0으로 설정하여 memcpy () 및 memmove ()를 호출 할 수 있습니까? (0) | 2020.09.08 |
---|---|
여러 CSS / JS 파일 결합 및 축소 (0) | 2020.09.08 |
약속 : 다음 대 다음 + 잡기 (0) | 2020.09.08 |
어셈블리 바인딩 리디렉션 : 방법 및 이유 (0) | 2020.09.08 |
PHP 세션 ID는 얼마나 고유합니까? (0) | 2020.09.08 |