2009-03-30 6 views
21

질문에 모두 그랬지만 누군가 C++ 콘솔 응용 프로그램을 닫으면 어떻게됩니까? 에서와 같이 상단 모서리에있는 "x"를 클릭하십시오. 즉시 닫습니까? 그것은 일종의 예외를 던집니까? 정의되지 않은 동작입니까?C++ 콘솔 응용 프로그램을 닫을 때 어떤 일이 발생합니까?

+1

관심있는 플랫폼은 무엇입니까? Windows? 리눅스? 그것은 실제로 해답에 영향을 미친다. –

+0

"콘솔 앱"이라는 문구를 사용하면 문자 모드 앱의 MS 용어 인 창을 의미합니다. – AndrewR

답변

19

상단 코너에 "x"가있는 C++ 콘솔 응용 프로그램을 닫으면 SetConsoleCtrlHandler 기능을 사용하여 제어 처리기를 설정하면 catch하고 처리 할 수있는 CTRL_CLOSE_EVENT이 표시됩니다. 거기에서 닫기 기능을 무시하고 수행 할 작업을 수행 한 다음 선택적으로 여전히 기본 동작을 수행 할 수 있습니다.

+0

콘솔 닫기를 재정의 할 수 없습니다. 프로세스가'TRUE' 또는'FALSE'를 리턴하는지 여부에 관계없이 프로세스가 종료됩니다. 대신 지연하거나 반환하는 경우 (예 : 정리 작업을하기 전에 프로세스가 종료되기 전에 기본적으로 5 초가 주어집니다. 수동으로'AllocConsole' 또는'AttachConsole'을 호출 했더라도 똑같습니다. 핸들러에서 FreeConsole을 호출하기에는 너무 늦었습니다. 콘솔을 닫는 사용자가 주 프로세스를 종료하지 않아야 콘솔의 하위 프로세스를 사용하고 표준 I/O를 파이프에 연결해야합니다. – eryksun

8

, 콘솔이 별도의 프로세스로 실행됩니다. 쉘을 닫으면 현재 실행중인 프로세스 나 백그라운드에서 실행되지 않는 프로세스에 SIGHUP 신호를 전송합니다. 프로그래머가 처리하지 않으면 프로세스가 종료됩니다. 터미널과 활성 프로세스로 SSH 세션을 닫으면 동일한 신호가 전송됩니다.

3

SIGBREAK은 Windows에서 발생합니다.

+0

이 질문에 대한 답을 제공하지 않습니다. 비평하거나 저자의 설명을 요청하려면 게시물 아래에 의견을 남겨 둡니다. – DLeh

+1

물론 있습니다. 나는이 페이지를 발견했을 때 내가 원했던 대답이다. – slater

+0

C 런타임을 사용하는 경우에만'SIGBREAK'가 발생합니다. Windows 자체에는 유닉스 신호가 없습니다. C 런타임은'CTRL_C_EVENT'을'SIGINT '에 그리고 다른 모든 제어 이벤트를'SIGBREAK'에 매핑하는 콘솔 제어 처리기를 가지고 있습니다. – eryksun

관련 문제