java linux 信号_Java 中关于信号的处理在Linux下的实现
Java里信号处理的函数
在linux里可以设置进程级别的信号的处理函数,在内核中信号值及进程针对该信号的处理函数建立了映射关系,主要有2个函数来设置信号处理函数:signal(),sigaction()。
在java 里,下面的2个函数是用于设置信号处理的函数
void os::Linux::set_signal_handler(int sig, bool set_installed)
void* os:signal(int signal_number, void* handler)
函数set_signal_handler设置了信号的处理函数signalHandler
函数os:signal是允许外部直接设置信号处理函数
以下程序片段可以看到当每个java 线程起来的时候,对信号SIGSEGV ,SIGPIPE,SIGBUS,SIGILL,SIGFPE,SIGXGSZ,使用了专门的处理函数signalHandler
...
set_signal_handler(SIGSEGV,true);
set_signal_handler(SIGPIPE,true);
set_signal_handler(SIGBUS,true);
set_signal_handler(SIGILL,true);
set_signal_handler(SIGFPE,true);
set_signal_handler(SIGXFSZ,true);
......在signalhandler 调用了JVM_handler_linux_signal 而该函数在不同的架构下是不一样的,x86架构下的定义在os_linux_x86.cpp中。
对信号SIGQUIT源码中并没有看到处理函数,实际上当java虚拟机启动Signal Dispatcher 线程的时候,程序里调用了os::signal(SIGNBREAK,os::user_handler()) (os.cpp os::signal_init())(该线程在打开 -Xrs的时候是不启动的)
下面的源码是java里面定义的os:user_handler
staticvoid
erHandler(intsig,void*siginfo,void*context) {
// 4511530 - sem_post is serialized and handled by the manager thread. When
// the program is interrupted by Ctrl-C, SIGINT is sent to every thread. We
// don't want to flood the manager thread with sem_post requests.
if(sig == SIGINT && Atomic::add(1, &sigint_count) > 1)
return;
// Ctrl-C is pressed during error reporting, likely because the error
// handler fails to abort. Let VM die immediately.
if(sig == SIGINT && is_error_reported()) {
os::die();
}
os::signal_notify(sig);
在函数的末尾调用了os:signal_notify,从而和os::signal_wait 对应起来,关于signal dispatcher 的具体实现可以参考笔者的另一篇(http://www.linuxidc.com/Linux/2012-01/51213.htm)。
signal dispatcher 线程通过sem_wait会在等待,当进程接到信号SIGQUIT的时候,只有vm thread会被中断(见上面分析),而进入UserHandler 函数,通过调用 os::signal_notify 去通告signal dispatcher 线程,让 signal dispatch 线程去处理信号。
在信号设计里,因为信号中断是在内核态调用的,内核调用了线程注入了自己的信号函数,一般只允许在该函数里处理简单的事物,所以在java里面专门设计了处理信号后续的线程(signal dispatcher),接受到信号的线程通过信号函数notify到处理信号的线程(signal dispatcher ),最后由该线程做后续的事情。比如线程dump
java linux 信号_Java 中关于信号的处理在Linux下的实现相关推荐
- java list 去重 相同的相加_Java 中的数据流和函数式编程 | Linux 中国
学习如何使用 Java 8 中的流 API 和函数式编程结构.-- Marty Kalin 当 Java SE 8(又名核心 Java 8)在 2014 年被推出时,它引入了一些更改,从根本上影响了用 ...
- java 添加等待时间_Java中线程等待特定时间的最有效方法 - java
我知道这个问题here,但是我有一个稍微不同的问题.如果我希望自己通过各种Thread方法(而不是通过实用程序类或Quartz)手动编码某个线程在特定时间的运行,那么最有效(就开销而言)进行编码. 我 ...
- java有道_java中的各种流(老师的有道云笔记)
内存操作流-字节 之前的文件操作流是以文件的输入输出为主的,当输出的位置变成了内存,那么就称为内存操作流.此时得使用内存流完成内存的输入和输出操作. 如果程序运行过程中要产生一些临时文件,可采用虚拟文 ...
- java mod %区别_Java中 % 与Math.floorMod() 区别详解
%为取余(rem),Math.floorMod()为取模(mod) 取余取模有什么区别呢? 对于整型数a,b来说,取模运算或者取余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余 ...
- java 静态分派_Java中的静态分派与动态分派
本文是<深入理解Java虚拟机>8.3.2节的读书笔记,理解有误的地方,欢迎指正 首先是两个概念: 静态类型,即是变量声明时的类型. 实际类型,变量实例化时采用的类型. 比如我们有这样一段 ...
- java show过时_Java中show() 方法被那个方法代替了? java编程 显示类中信
你说的show是swing里的吧,在老版本中Component这个超类确实有show这个方法,而且这个方法也相当有用,使一个窗口可见,并放到最前面.在jdk5.0中阻止了这个方法,普遍用setVisi ...
- java判断类型_Java中类型判断的几种方式 - 码农小胖哥 - 博客园
1. 前言 在Java这种强类型语言中类型转换.类型判断是经常遇到的.今天就细数一下Java中类型判断的方法方式. 2. instanceof instanceof是Java的一个运算符,用来判断一个 ...
- java this用法_java中this用法小结
Java关键字this只能用于方法方法体内.当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是this.因此,this只能在类中的非静态方法中使用,静态 ...
- java 序列化实例_Java中的序列化与反序列化实例
创建的字节流与平台无关.因此,在一个平台上序列化的对象可以在另一个平台上反序列化. 为了使Java对象可序列化,我们实现java.io.Serializable可序列化接口. ObjectOutput ...
最新文章
- 48个Python练手项目(附详细教程)
- docker mysql 容器无故停止的原因
- 获取jar包内部的资源文件
- python csv使用_python CSV模块的使用
- 机器学习笔记(了解)
- JavaCard概述
- 同步监视器之同步代码块、同步方法
- 关于AttachCurrentThread和DetachCurrentThread的故事
- 删除误添加的本地github检查库文件
- 线材下料优化python算法_深度学习中的优化算法(Optimizer)理解与python实现
- Swift翻译之-关于Swift
- mac安装adb工具
- 篡改计算机网络,基于TCP协议的网络数据实时篡改.doc
- struct所占的内存
- wpscan扫描的简单介绍(对WordPress的扫描CMS)
- A - Multiplication Dilemma (思维)( 2018 ACM ICPC Arabella Collegiate Programming Contest)
- Github 摸鱼神器面世!
- 三输入,八输出译码器门级实现
- TDH sql及plsql的调优
- 中国联通3G网络覆盖全国200余城市