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 16namespace NConsoleClose { 17 18unsigned g_BreakCounter = 0; 19static const unsigned kBreakAbortThreshold = 2; 20 21#ifdef _WIN32 22 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 g_BreakCounter++; 32 if (g_BreakCounter < kBreakAbortThreshold) 33 return TRUE; 34 return FALSE; 35 /* 36 switch (ctrlType) 37 { 38 case CTRL_C_EVENT: 39 case CTRL_BREAK_EVENT: 40 if (g_BreakCounter < kBreakAbortThreshold) 41 return TRUE; 42 } 43 return FALSE; 44 */ 45} 46 47CCtrlHandlerSetter::CCtrlHandlerSetter() 48{ 49 if (!SetConsoleCtrlHandler(HandlerRoutine, TRUE)) 50 throw "SetConsoleCtrlHandler fails"; 51} 52 53CCtrlHandlerSetter::~CCtrlHandlerSetter() 54{ 55 if (!SetConsoleCtrlHandler(HandlerRoutine, FALSE)) 56 { 57 // warning for throw in destructor. 58 // throw "SetConsoleCtrlHandler fails"; 59 } 60} 61 62#else // _WIN32 63 64static void HandlerRoutine(int) 65{ 66 g_BreakCounter++; 67 if (g_BreakCounter < kBreakAbortThreshold) 68 return; 69 exit(EXIT_FAILURE); 70} 71 72CCtrlHandlerSetter::CCtrlHandlerSetter() 73{ 74 memo_sig_int = signal(SIGINT, HandlerRoutine); // CTRL-C 75 if (memo_sig_int == SIG_ERR) 76 throw "SetConsoleCtrlHandler fails (SIGINT)"; 77 memo_sig_term = signal(SIGTERM, HandlerRoutine); // for kill -15 (before "kill -9") 78 if (memo_sig_term == SIG_ERR) 79 throw "SetConsoleCtrlHandler fails (SIGTERM)"; 80} 81 82CCtrlHandlerSetter::~CCtrlHandlerSetter() 83{ 84 signal(SIGINT, memo_sig_int); // CTRL-C 85 signal(SIGTERM, memo_sig_term); // kill {pid} 86} 87 88#endif // _WIN32 89 90/* 91void CheckCtrlBreak() 92{ 93 if (TestBreakSignal()) 94 throw CCtrlBreakException(); 95} 96*/ 97 98} 99 100#endif 101