2014-10-30 2 views
0

, 하나는 사용하여 ctrl+c를 눌러 잡을 수 있습니다 : 그것은 모든 사용자가 십자가를 누를 때 작동하지 않습니다 제외Windows 콘솔 응용 프로그램 - closing 이벤트에 대한 신호는 윈도우 콘솔 응용 프로그램에서

#include <stdio.h> 
#include <signal.h> 

void SigInt_Handler(int n_signal) 
{ 
    printf("interrupted\n"); 
} 

int main(int n_arg_num, const char **p_arg_list) 
{ 
    signal(SIGINT, &SigInt_Handler); 
    getchar(); // wait for user intervention 
} 

이가 잘 작동 × 콘솔 창을 닫습니다. 거기에 어떤 신호가 있습니까?

내가 이것을 필요로하는 이유는 무언가를 계산하는 동안 컴퓨터가 닫히는 경향이있는이 CUDA 응용 프로그램을 가지고 있기 때문입니다. 코드는 멀티 플랫폼이기 때문에 SetConsoleCtrlHandler보다는 신호를 선호합니다. 방법이 있습니까?

답변

1

올바른 하나 SIGBREAK, 당신은 그것을 시도 할 수 있습니다 : 프로그램이 "closed"을 인쇄 할 콘솔 창을 닫을시

#include <stdio.h> 
#include <signal.h> 

void SigInt_Handler(int n_signal) 
{ 
    printf("interrupted\n"); 
    exit(1); 
} 

void SigBreak_Handler(int n_signal) 
{ 
    printf("closed\n"); 
    exit(2); 
} 

int main(int n_arg_num, const char **p_arg_list) 
{ 
    signal(SIGINT, &SigInt_Handler); 
    signal(SIGBREAK, &SigBreak_Handler); 
    getchar(); // wait for user intervention 
    return 0; 
} 

과 2

+0

는 그렇게하지가 돌아갑니다, 하지만 그 시점에서 출구를 중단 할 수는 없습니까? 핸들러 내부에서 콘솔이 종료되지 않도록하는 것 같습니다. –

+1

당신은 영원히 기다릴 수 있습니다. "Force close"대화 상자가 나타납니다. 그러나 반환 값이 없으므로 중단 할 수 없습니다. 방금 응용 프로그램을 종료하고 응용 프로그램을 종료하는 방법을 원했습니다. –

+0

@theswine, Vista에서는 나중에 대화가 없습니다. 제어 처리기가 TRUE를 반환하거나 반환하는 데 5 초 이상이 걸리면 Windows (csrss.exe)가 강제로 프로세스를 종료합니다. 핸들러가'FALSE'를 리턴하면, 디폴트 핸들러는'ExitProcess'를 호출합니다. 이 경우 프로세스 종료 코드는'STATUS_CONTROL_C_EXIT' (0xC000013A)입니다. – eryksun