1.Java 程序
通过Runtime.getRuntime.addShutdownHook(Thread t), 添加一个线程监控程序的退出,在线程中做一些清理操作
2.Win C程序
通过SetConsoleCtrlHandler(PHANDLER_ROUTINE handler, true), 添加一个信号监听,handler 是一个回调函数,定义如下:
BOOLhandler( DWORD fdwctrltype );
可以处理一下信号:
CTRL_C_EVENT - 当用户按下了CTRL+C,或者由GenerateConsoleCtrlEvent API发出.
CTRL_BREAK_EVENT - 用户按下CTRL+BREAK, 或者由GenerateConsoleCtrlEvent API发出.
CTRL_CLOSE_EVENT - 当试图关闭控制台程序,系统发送关闭消息。 超时5s,5s后,弹框,提示确认关闭,如果选择是,不做任何清理
// 3 is reserved!
// 4 is reserved!
CTRL_LOGOFF_EVENT - 用户退出时,但是不能决定是哪个用户. 20s超时
CTRL_SHUTDOWN_EVENT - 当系统被关闭时. 20s超时
如果对这种需要忽略,需要返回FALSE, 让程序继续执行下一个回调,如果处理完成,返回TRUE
3.Linux C程序
通过sigaction(SIGHUP,&act, NULL) 来捕获退出信号,主要捕获SIGHUP, SIGINT, SIGQUIT,SIGKILL, SIGTERM(1,2,3,9,15)
信号捕捉后,调用act中设置的回调处理
struct sigaction act;
sigemptyset(&act.sa_mask);//清空信号
act.sa_fla=SA_SIGINFO;
act.sa_sigaction=handle_signal;(信号处理函数)
sigaction(SIGHUP,&act,NULL);
sigaction(SIGQUIT,&act,NULL);
...
void handle_signal(int n, struct siginfo* siginfo, void* myact)
{
if (siginfo->si_signo == SIGHUP) //1
switch(siginfo->si_signo)
{
case SIGHUP:
case SIGQUIT:
...
//执行的函数
exit(0);
break;
}
}