consoleclose.cpp

来自「由7-zip提供的压缩、解压缩程序」· C++ 代码 · 共 86 行

CPP
86
字号
// ConsoleClose.cpp#include "StdAfx.h"#include "ConsoleClose.h"#ifdef ENV_UNIX#include <signal.h>#endifstatic int g_BreakCounter = 0;static const int kBreakAbortThreshold = 2;namespace NConsoleClose {#ifdef ENV_UNIXstatic void HandlerRoutine(int){  g_BreakCounter++;  if (g_BreakCounter < kBreakAbortThreshold)    return ;  exit(EXIT_FAILURE);}#elsestatic BOOL WINAPI HandlerRoutine(DWORD aCtrlType){  g_BreakCounter++;  if (g_BreakCounter < kBreakAbortThreshold)    return TRUE;  return FALSE;  /*  switch(aCtrlType)  {    case CTRL_C_EVENT:    case CTRL_BREAK_EVENT:      if (g_BreakCounter < kBreakAbortThreshold)      return TRUE;  }  return FALSE;  */}#endifbool TestBreakSignal(){  /*  if (g_BreakCounter > 0)    return true;  */  return (g_BreakCounter > 0);}void CheckCtrlBreak(){  if (TestBreakSignal())    throw CCtrlBreakException();}CCtrlHandlerSetter::CCtrlHandlerSetter(){#ifdef ENV_UNIX   memo_sig_int = signal(SIGINT,HandlerRoutine); // CTRL-C   if (memo_sig_int == SIG_ERR)    throw "SetConsoleCtrlHandler fails (SIGINT)";   memo_sig_term = signal(SIGTERM,HandlerRoutine); // for kill -15 (before "kill -9")   if (memo_sig_term == SIG_ERR)    throw "SetConsoleCtrlHandler fails (SIGTERM)";#else  if(!SetConsoleCtrlHandler(HandlerRoutine, TRUE))    throw "SetConsoleCtrlHandler fails";#endif}CCtrlHandlerSetter::~CCtrlHandlerSetter(){#ifdef ENV_UNIX   signal(SIGINT,memo_sig_int); // CTRL-C   signal(SIGTERM,memo_sig_term); // kill {pid}#else  if(!SetConsoleCtrlHandler(HandlerRoutine, FALSE))    throw "SetConsoleCtrlHandler fails";#endif}}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?