2014-11-08 1 views
1

spawn function (exec을 호출하는 것과 동일한 효과가 있음)에 _P_OVERLAY을 전달하는 콘솔 응용 프로그램은 현재 프로세스를 파괴합니다. 그것은 그렇게하는 현실에서 그 수신자의 하위 프로세스를 양산 반면 , 그 수신자가 돌아왔다 가정 (종종 cmd.exe입니다) 과정을 호출 유발한다는 사실이 없었다면이 원하는 동작 것exec() 또는 스폰 (P_OVERLAY)를 호출하면 콘솔의 차단이 해제됩니다. 콘솔을 차단하지 않으려면 어떻게합니까?

여전히 실행 중이므로 호출자는 콘솔을 계속 사용하기 전에 호출 수신자가 종료 될 때까지 기다려야합니다. 호출자가 cmd.exe (명령 프롬프트) 인 경우

그래서, 무슨 일 호출 수신자가 하위 프로세스를 생성하는 즉시로, 사용자가 즉시 C:\Users\User> 프롬프트가 표시되어, 더욱 명령을 입력 할 자유가된다 하위 프로세스가 아직 실행 중이더라도

내가 가진 최선의 해결책은 자식 프로세스가 종료 될 때까지 현재 프로세스를 종료하지 않는 것입니다.하지만 궁금합니다. 호출 프로세스가 호출 된 프로세스가 호출 수신자가있을 때 계속 대기하기 전에 대기해야합니다. 종료 되었습니까?

+0

그래서'exec()'를 사용하지 않을까요? – alk

+0

@alk : 무슨 뜻이야? 둘은 똑같은 방식으로 행동합니다. – Mehrdad

+0

질문이 명확하지 않습니다. 자식 프로세스를 기다리고 싶니? 또는'cmd.exe'가 어떻게 동작하는지 제어하고 싶습니까? 'CreateProcess' 나'ShellExecute [Ex]'를 사용할 수 없습니까? – Ajay

답변

2

아니,이 작업을 수행 할 수있는 방법이 없습니다 - 당신은 당신의 아이가 종료 때까지 기다릴 cmd.exe를 원하는 경우, 당신의 아이가 종료하는 당신이 필요 기다려야 .

이유는 cmd.exe이 프로세스를 시작하면 프로세스 핸들을 수신하기 때문입니다. 그런 다음 프로세스 핸들이 신호가 될 때까지 기다립니다. 다른 대부분의 부모 (예 : C 런타임 라이브러리)도 동일한 방식으로 작동합니다. 프로세스 핸들은 그들이 참조하는 프로세스가 종료 할 때 신호를받으며, 그 동작을 변경할 수있는 방법은 없습니다.

해결 방법 : UNIX 코드에서 이식 중이기 때문에 _P_OVERLAY를 사용하고있는 것으로 보입니다. 종료하기 전에 모든 인스턴스를 편리하게 변경하여 인스턴스를 종료 할 수있는 코드가있는 경우 프로세스가 시작되자 마자 자식 프로세스를 시작하고 자식에서 모든 UNIX 기반 코드를 실행할 수 있습니다. 이 모델에서 최상위 프로세스가 수행하는 유일한 작업은 나머지 프로세스 트리가 종료 될 때까지 대기하는 것입니다. (작업 객체를 사용하여 프로세스 트리를 추적 할 수 있습니다.)

+0

+1이 대답을 읽는 것을 싫어했지만. – Mehrdad

+0

네이티브 Windows 코드에서이 작업을 수행하려는 이유가 거의 없습니다. :-) –

관련 문제