java动作监听退出程序_监听获取程序退出事件(Linux、Windows、Java、C++)

监听程序退出事件,主要是用于程序的优雅退出。

下面针对Java、C++在Windows、Linux下的处理分别进行介绍.

1.Java监听程序退出事件

Java本身是跨平台的,不必关系Windows还是Linux。具体做法如下:

通过Runtime.getRuntime().addShutdownHook(Thread t);添加一个监控线程,在该程序退出时会调用Thread的run方法。不得不说Java真的很方便。

我实现的一个例子。 public class RTMServer extends Thread{

private MessageServer msg_server = null;

private ThriftServer thrift_server = null;

public RTMServer()

{

this.setName("RTMServer");

}

public void start_server()

{

// 添加程序关闭监听线程

Runtime.getRuntime().addShutdownHook(this);

msg_server = new MessageServer();

msg_server.start();

thrift_server = new ThriftServer("ThriftServer");

thrift_server.start();//该方法会阻塞

}

/*

* 继承Thread

* 用于在程序关闭时释放资源。

* @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下监听程序退出事件

主要通过Linux的signal进行判断,程序启动时通过 sigaction(SIGHUP,&act,NULL)设置要捕获的信号,则发生相应的信号时就会被 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:

// 程序退出时的函数操作

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; /** 设置SA_SIGINFO 表示传递附加信息到触发函数 **/

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)

{

//程序退出,进行退出处理操作

exit(0);

}

}

在主程序启动时创建Handler(),则程序退出时会捕获到相应的信号g_exit_handler = new SignalHandler();

3.C++ Windows下监听程序退出事件 windows下捕获程序退出事件主要通过 SetConsoleCtrlHandler( (PHANDLER_ROUTINE) ctrlhandler, true )

其中ctrHandler是一个回调函数,在退出时会触发该函数。

具体的实现如下: #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.总结

其实原理都差不多,就是在程序启动时需要设置一个“程序退出监听器”,只不过在windows、linux下C++、Java的监听器不同而已。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/502903.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python创建access表_Access创建表

有了数据库管理系统&#xff0c;在输入数据之前&#xff0c;您需要创建表。 Microsoft Access创建表非常容易。 事实上&#xff0c;当你创建一个数据库&#xff0c;Access创建你的第一个表(称为Table1)。通常情况下&#xff0c;当你需要创建一个新的表&#xff0c;选择CREATE &…

java观察者模式本质_6.[研磨设计模式笔记]观察者模式

1.定义定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并自动更新。2.解决问题——订阅报纸看起来订阅者是直接根有据打交道&#xff0c;但实际上&#xff0c;订阅者的订阅数据是被邮寄传递到报社&#xff0…

python r语言 作图_生物医学绘图,Python 并不比R语言差

做过基因测序和生物信息学分析&#xff0c;尤其是做过RNAseq分析的同学都知道&#xff0c;R语言中有一款数据可视化神器ggplot2&#xff0c;其绘图功能强大&#xff0c;但它的缺陷是不能直接绘制3D图形&#xff0c;需要加载扩展包&#xff0c;很麻烦。如果用Python语言&#xf…

粒子群算法tsp java_粒子群算法解决TSP问题

1. 粒子群算法简介粒子群算法(particle swarm optimization&#xff0c;PSO)由Kennedy和Eberhart在1995年提出&#xff0c;属于进化算法的一种&#xff0c;是通过对模拟鸟群扑食行为设计的。基本思想&#xff1a;从随机解出发&#xff0c;通过迭代寻找最优解&#xff0c;通过适…

python 3.5.2页面_Python 3.5.2实现websocket服务端

最近由于一个项目需要&#xff0c;写了一个简易的websocket服务端程序&#xff0c;其间也参考了网上的很多资料&#xff0c;我将用接下来的几个篇幅说明是怎么实现的&#xff0c;及遇到的一系列埂。参考 (包括且不限于如下地址)涉及到的模块socket&#xff1a;socket通讯如侦听…

java连接sqlserver 的sqlhelper类_SQLserver数据库操作帮助类SqlHelper

using System;using System.Data;using System.Xml;using System.Data.SqlClient;using System.Collections;namespace SQL.Access{/// /// SqlServer数据访问帮助类/// public sealed class SqlHelper{#region 私有构造函数和方法private SqlHelper() {}/// /// 将SqlParamete…

python编写抢座位软件_程序员硬核Python抢票教程”,帮你抢回家车票

盼望着&#xff0c;盼望着&#xff0c;春节的脚步近了&#xff0c;然而&#xff0c;每年到这个时候&#xff0c;最难的&#xff0c;莫过于一张回家的火车票。据悉&#xff0c;今年春运期间&#xff0c;全国铁路发送旅客人次同比将增长8.0%&#xff0c;达到4.4亿人次&#xff0c…

java io 缓存读取_Java 文件IO写入读取四种方法

第一种&#xff1a;字节流 FileInputStream FileOutputStream1.1 读取操作//先创建一个和硬盘连接的流(打通硬盘和内存的通道)FileInputStream fis new FileInputStream("D:\\Demo.txt");//创建缓存区大小是1kbyte[] bytes new byte[1024];int data 0; //存储有效…

python集合可以修改吗_修改包含Python3中的集合的集合列表-问答-阿里云开发者社区-阿里云...

我试图创建一个以元组为元素的列表。每个元组都有4个整数。前两个整数是对2个range进行压缩的结果&#xff0c;而其他2个则是对2个不同的整数进行压缩的结果。我正在使用此代码创建元组和最终列表&#xff0c;这些列表是从笛卡尔乘积派生的&#xff0c;如下所示&#xff1a;获取…

hive mysql性能_Hive数据库安全审计功能

【Hive数据库安全审计简介】Hive数据库安全审计是一款基于数据库通讯协议准确分析和SQL完全解析技术的数据库安全审计系统。实现了对数据库操作、访问用户及外部应用用户的审计&#xff0c;可以用于安全合规、用户行为分析、运维监控、风控审计、事件追溯等与数据库安全相关的管…

linux安装sz rz_超级好用的文件传输命令rz与sz

做生物信息经常需要在本地客户端与服务器之间进行文件的传输&#xff0c;例如将要分析的数据传到Linux服务器上&#xff0c;进行分析&#xff0c;分析结束之后将结果下载到本地windows系统进行查看。以前我们都推荐大家使用比较稳定&#xff0c;并且支持断点续传的Filezilla或者…

java mongodb gridfs_查询MongoDB GridFS元数据(Java)

我想要做的是通过查询元数据的字段来获取GridFS文件列表.例如,我得到一个GridFS文件文件,如下所示&#xff1a;{ "_id" : { "$oid" : "4f95475f5ef4fb269dbac954"} , "chunkSize" : 262144 , "length" : 3077 , "md5&q…

php 防止跨站脚本攻击,php防止sql注入以及xss跨站脚本攻击

1.post数据封装转义函数 防sql注入 eag&#xff1a;addslashes($username);​addslashes($password);​eag:防止sql注入函数封装function deepslashes($data){#判断$data的表现形式 并且需要处理空的情况if(empty($data)){return($data);}​#高级简写 return is_array($data) …

visual studio 按钮判断管理员和用户_用户管理的设计原则

后台的使用者通常是企业的各类权限的管理员&#xff0c;通过对用户管理的合理设计&#xff0c;让管理员准确、高效地完成既定任务&#xff0c;来实现用户管理的价值。后台产品的使命是为企业提升效率&#xff0c;降低成本&#xff0c;而用户管理是后台的核心部分&#xff0c;用…

php 随机颜色,php生成随机颜色的代码实例

PHP生成随机颜色的代码实例&#xff1a;方法一&#xff1a;function color_txt($str){if ( is_array($str) ){$str $str[1];}$len mb_strlen($str);$colorTxt ;for($i0; $i$colorTxt . .mb_substr($str,$i,1,utf-8).;}return $colorTxt;}function rand_color(){re…

windows。forms.timer设置第一次不等待_面试官:换人!他连 TCP 这几个参数都不懂(一)...

前言TCP 性能的提升不仅考察 TCP 的理论知识&#xff0c;还考察了对于操作系统提供的内核参数的理解与应用。TCP 协议是由操作系统实现&#xff0c;所以操作系统提供了不少调节 TCP 的参数。如何正确有效的使用这些参数&#xff0c;来提高 TCP 性能是一个不那么简单事情。我们需…

php 输出可以设置格式文件,php格式输出文件var_export函数实例

本文实例讲述了php格式输出文件var_export函数的用法。分享给大家供大家参考。具体如下&#xff1a;var_export:php 4 > 4.2.0, php 5var_export -- 输出或返回一个变量的字符串表示.描述:mixed var_export (mixed expression [,bool return])此函数返回关于传递给该函数的变…

python tornado websocket_基于Python Tornado框架的websocket服务

WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。Tornado中定义了tornado.websocket.WebSocketHandler来处理websocket请求。Tornado框架的安装以及入门这里就不说了&#xff0c;想入门tornado的请移步我的另一篇文章奥小飞&#xff1a;基于Python的…

微信网页开发教程 php,PHP实现微信网页授权开发教程,php授权教程_PHP教程

PHP实现微信网页授权开发教程&#xff0c;php授权教程微信网页授权是服务号才有的高级功能&#xff0c;开发者可以通过授权后获取用户的基本信息&#xff1b;在此之前&#xff0c;想要获取消息信息只能在用户和公众号交互时根据openid获取用户信息&#xff1b;而微信网页授权可…

lstm原文_LSTM模型与水文模型在径流模拟中的比较

学术简报题目:Comparison of Long Short Term Memory Networks and the Hydrological Model in Runoff Simulation作者:Hailin You1,Hongxiang Fan2,Ligang Xu2,Yongmi Wu1,*,Lizhen Liu2 and Zhong Yao1作者单位:1 Poyang Lake Research Center, Jiangxi Academy of Sciences,…