监听程序退出的方法

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;

          }


}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值