java动作监听退出程序_监听获取程序退出事件(Linux、Windows、Java、C++)
監(jiān)聽程序退出事件,主要是用于程序的優(yōu)雅退出。
下面針對Java、C++在Windows、Linux下的處理分別進(jìn)行介紹.
1.Java監(jiān)聽程序退出事件
Java本身是跨平臺的,不必關(guān)系Windows還是Linux。具體做法如下:
通過Runtime.getRuntime().addShutdownHook(Thread t);添加一個監(jiān)控線程,在該程序退出時會調(diào)用Thread的run方法。不得不說Java真的很方便。
我實(shí)現(xiàn)的一個例子。 public class RTMServer extends Thread{
private MessageServer msg_server = null;
private ThriftServer thrift_server = null;
public RTMServer()
{
this.setName("RTMServer");
}
public void start_server()
{
// 添加程序關(guān)閉監(jiān)聽線程
Runtime.getRuntime().addShutdownHook(this);
msg_server = new MessageServer();
msg_server.start();
thrift_server = new ThriftServer("ThriftServer");
thrift_server.start();//該方法會阻塞
}
/*
* 繼承Thread
* 用于在程序關(guān)閉時釋放資源。
* @see java.lang.Thread#run()
*/
public void run()
{
if(thrift_server != null)
{
thrift_server.close();
}
if(msg_server != null)
{
msg_server.close();
}
VMManager.instance.destroyPool();
}
public static void main(String[] args) {
// 初始化日志
LogUtil.init();
RTMServer server = new RTMServer();
server.start_server();
}
}是不是很簡單呢?
2.C++ Linux下監(jiān)聽程序退出事件
主要通過Linux的signal進(jìn)行判斷,程序啟動時通過 sigaction(SIGHUP,&act,NULL)設(shè)置要捕獲的信號,則發(fā)生相應(yīng)的信號時就會被 handle_signal(int n,struct siginfo *siginfo,void *myact)捕獲。
linux退出信號主要有SIGHUP,SIGINT,SIGQUIT,SIGTERM,即1,2,3,15
下面是我的一個封裝。 #include
#include
#include
#include
#include
#include
#include
#include
class SignalHandler{
public:
SignalHandler();
public:
// 程序退出時的函數(shù)操作
static void handle_signal(int n,struct siginfo *siginfo,void *myact);
};
SignalHandler * g_exit_handler = NULL;
SignalHandler::SignalHandler()
{
/** install signal use sigaction **/
struct sigaction act;
sigemptyset(&act.sa_mask); /** 清空阻塞信號 **/
act.sa_flags=SA_SIGINFO; /** 設(shè)置SA_SIGINFO 表示傳遞附加信息到觸發(fā)函數(shù) **/
act.sa_sigaction=handle_signal;
if(sigaction(SIGHUP,&act,NULL) < 0 // 1
|| sigaction(SIGINT,&act,NULL) < 0 // 2
|| sigaction(SIGQUIT,&act,NULL) < 0 // 3
//|| sigaction(SIGKILL,&act,NULL) < 0 // 9
|| sigaction(SIGTERM,&act,NULL) < 0 // 15
)
{
LOG4CPP(LOG_LEVEL_ERROR,"install signal handler error");
}
}
void SignalHandler::handle_signal(int n,struct siginfo *siginfo,void *myact)
{
LOG4CPP(LOG_LEVEL_WARN,"SIGNAL received: signo=%d errno=%d code=%d ",siginfo->si_signo,siginfo->si_errno,siginfo->si_code);
if(siginfo->si_signo == 1
|| siginfo->si_signo == 2
|| siginfo->si_signo == 3
|| siginfo->si_signo == 9
|| siginfo->si_signo == 15)
{
//程序退出,進(jìn)行退出處理操作
exit(0);
}
}
在主程序啟動時創(chuàng)建Handler(),則程序退出時會捕獲到相應(yīng)的信號g_exit_handler = new SignalHandler();
3.C++ Windows下監(jiān)聽程序退出事件 windows下捕獲程序退出事件主要通過 SetConsoleCtrlHandler( (PHANDLER_ROUTINE) ctrlhandler, true )
其中ctrHandler是一個回調(diào)函數(shù),在退出時會觸發(fā)該函數(shù)。
具體的實(shí)現(xiàn)如下: #include
#include
#include
#include
#include
#include
#include
#include
bool ctrlhandler( DWORD fdwctrltype );
if(SetConsoleCtrlHandler( (PHANDLER_ROUTINE) ctrlhandler, true ) )
{
}
else
{
LOG4CPP(LOG_LEVEL_ERROR,"install signal handler error");
}
bool ctrlhandler( DWORD fdwctrltype )
{
switch( fdwctrltype )
{
// handle the ctrl-c signal.
case CTRL_C_EVENT:
//printf( "ctrl-c event\n\n" );
//return( true );
// ctrl-close: confirm that the user wants to exit.
case CTRL_CLOSE_EVENT:
//printf( "ctrl-close event\n\n" );
//return( true );
// pass other signals to the next handler.
case CTRL_BREAK_EVENT:
//printf( "ctrl-break event\n\n" );
//return false;
case CTRL_LOGOFF_EVENT:
//printf( "ctrl-logoff event\n\n" );
//return false;
case CTRL_SHUTDOWN_EVENT:
//printf( "ctrl-shutdown event\n\n" );
//return false;
//清理
return true;
default:
return false;
}
}
4.總結(jié)
其實(shí)原理都差不多,就是在程序啟動時需要設(shè)置一個“程序退出監(jiān)聽器”,只不過在windows、linux下C++、Java的監(jiān)聽器不同而已。
總結(jié)
以上是生活随笔為你收集整理的java动作监听退出程序_监听获取程序退出事件(Linux、Windows、Java、C++)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: git merge 冲突_卧槽!小姐姐用
- 下一篇: lichee linux nfs,SPI