您的位置:首页 > 运维架构 > Linux

SetConsoleCtrlHandler

2016-03-03 15:58 267 查看

linux下

linux下通过
signal(SIG_ID,/*处理函数*/);
来注册

需要root权限时: UlimitResource();

void SignalSkill(int no)
{}
void ProcessSignal()
{
signal(SIGEXIT,SignalKill);
signal(SIGKILL,SignalKill);
signal(SIGPIPE,SIG_IGN); // send, recv 时网络断开,会收到SIGPIPE, 默认处理为进程终止, 所以忽略
signal(SIGHUP,SIG_IGN);//ssh终端退出,GameServer不退出
UlimitResource();
}


windows下

通过函数

BOOL WINAPI SetConsoleCtrlHandler(

_In_opt_  PHANDLER_ROUTINE HandlerRoutine,

_In_      BOOL Add

);


来实现, 例子如下,其中一般主要处理
CTRL_C_EVENT
CTRL_CLOSE_EVENT
两个消息:

#include <windows.h>
#include <stdio.h>
BOOL CtrlHandler( DWORD fdwCtrlType )
{
switch( fdwCtrlType )
{
// Handle the CTRL-C signal.
case CTRL_C_EVENT:
printf( "Ctrl-C event\n\n" );
Beep( 750, 300 );
return( TRUE );
// CTRL-CLOSE: confirm that the user wants to exit.  点击右上角的退出按钮, 最多等待5s时间去处理退出工作, 5s后直接关闭;
case CTRL_CLOSE_EVENT:
Beep( 600, 200 );
printf( "Ctrl-Close event\n\n" );
return( TRUE );
// Pass other signals to the next handler.
case CTRL_BREAK_EVENT:
Beep( 900, 200 );
printf( "Ctrl-Break event\n\n" );
return FALSE;
case CTRL_LOGOFF_EVENT:
Beep( 1000, 200 );
printf( "Ctrl-Logoff event\n\n" );
return FALSE;
case CTRL_SHUTDOWN_EVENT:
Beep( 750, 500 );
printf( "Ctrl-Shutdown event\n\n" );
return FALSE;
default:
return FALSE;
}
}
//main中使用如下:
int main( void )
{
if( SetConsoleCtrlHandler( (PHANDLER_ROUTINE) CtrlHandler, TRUE ) )
{
printf( "\nThe Control Handler is installed.\n" );
printf( "\n -- Now try pressing Ctrl+C or Ctrl+Break, or" );
printf( "\n    try logging off or closing the console...\n" );
printf( "\n(...waiting in a loop for events...)\n\n" );
while( 1 ){ }
}
else
{
printf( "\nERROR: Could not set control handler");
return 1;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux