2014-10-30 99 views
0

在Windows控制檯應用程序,可以趕上通過採用擠壓ctrl+cWindows控制檯應用程序 - 用於關閉事件信號

#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,你可以嘗試一下:

#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; 
} 

在關閉控制檯窗口,該程序將打印"closed"將返回2.

+0

是不是這樣,儘管如此,你不能在這一點放棄退出?看起來現在要阻止控制檯在處理程序內部退出。 – 2017-01-18 12:59:40

+1

你可以永遠等待,我猜測,在這之後會彈出一個「強制關閉」對話框。但由於沒有返回值,我猜你不能放棄。我只是想要一種方法來延遲退出並正確關閉應用程序。 – 2017-01-27 15:31:04

+0

@theswine,在Vista和後來沒有對話框。如果控制處理程序返回「TRUE」或需要超過5秒的時間才返回,則Windows(csrss.exe)會強制終止該進程。如果處理程序返回'FALSE',則默認處理程序調用'ExitProcess'。在這些情況下,進程退出代碼是「STATUS_CONTROL_C_EXIT」(0xC000013A)。 – eryksun 2017-09-06 17:23:42

相關問題