1 // ConsoleClose.cpp 2 3 #include "StdAfx.h" 4 5 #include "ConsoleClose.h" 6 7 #ifndef UNDER_CE 8 9 #ifdef _WIN32 10 #include "../../../Common/MyWindows.h" 11 #else 12 #include <stdlib.h> 13 #include <signal.h> 14 #endif 15 16 namespace NConsoleClose { 17 18 unsigned g_BreakCounter = 0; 19 static const unsigned kBreakAbortThreshold = 3; 20 21 #ifdef _WIN32 22 HandlerRoutine(DWORD ctrlType)23static BOOL WINAPI HandlerRoutine(DWORD ctrlType) 24 { 25 if (ctrlType == CTRL_LOGOFF_EVENT) 26 { 27 // printf("\nCTRL_LOGOFF_EVENT\n"); 28 return TRUE; 29 } 30 31 if (++g_BreakCounter < kBreakAbortThreshold) 32 return TRUE; 33 return FALSE; 34 /* 35 switch (ctrlType) 36 { 37 case CTRL_C_EVENT: 38 case CTRL_BREAK_EVENT: 39 if (g_BreakCounter < kBreakAbortThreshold) 40 return TRUE; 41 } 42 return FALSE; 43 */ 44 } 45 CCtrlHandlerSetter()46CCtrlHandlerSetter::CCtrlHandlerSetter() 47 { 48 if (!SetConsoleCtrlHandler(HandlerRoutine, TRUE)) 49 throw 1019; // "SetConsoleCtrlHandler fails"; 50 } 51 ~CCtrlHandlerSetter()52CCtrlHandlerSetter::~CCtrlHandlerSetter() 53 { 54 if (!SetConsoleCtrlHandler(HandlerRoutine, FALSE)) 55 { 56 // warning for throw in destructor. 57 // throw "SetConsoleCtrlHandler fails"; 58 } 59 } 60 61 #else // _WIN32 62 HandlerRoutine(int)63static void HandlerRoutine(int) 64 { 65 if (++g_BreakCounter < kBreakAbortThreshold) 66 return; 67 exit(EXIT_FAILURE); 68 } 69 CCtrlHandlerSetter()70CCtrlHandlerSetter::CCtrlHandlerSetter() 71 { 72 memo_sig_int = signal(SIGINT, HandlerRoutine); // CTRL-C 73 if (memo_sig_int == SIG_ERR) 74 throw "SetConsoleCtrlHandler fails (SIGINT)"; 75 memo_sig_term = signal(SIGTERM, HandlerRoutine); // for kill -15 (before "kill -9") 76 if (memo_sig_term == SIG_ERR) 77 throw "SetConsoleCtrlHandler fails (SIGTERM)"; 78 } 79 ~CCtrlHandlerSetter()80CCtrlHandlerSetter::~CCtrlHandlerSetter() 81 { 82 signal(SIGINT, memo_sig_int); // CTRL-C 83 signal(SIGTERM, memo_sig_term); // kill {pid} 84 } 85 86 #endif // _WIN32 87 88 /* 89 void CheckCtrlBreak() 90 { 91 if (TestBreakSignal()) 92 throw CCtrlBreakException(); 93 } 94 */ 95 96 } 97 98 #endif 99