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下的实现相关推荐

  1. java list 去重 相同的相加_Java 中的数据流和函数式编程 | Linux 中国

    学习如何使用 Java 8 中的流 API 和函数式编程结构.-- Marty Kalin 当 Java SE 8(又名核心 Java 8)在 2014 年被推出时,它引入了一些更改,从根本上影响了用 ...

  2. java 添加等待时间_Java中线程等待特定时间的最有效方法 - java

    我知道这个问题here,但是我有一个稍微不同的问题.如果我希望自己通过各种Thread方法(而不是通过实用程序类或Quartz)手动编码某个线程在特定时间的运行,那么最有效(就开销而言)进行编码. 我 ...

  3. java有道_java中的各种流(老师的有道云笔记)

    内存操作流-字节 之前的文件操作流是以文件的输入输出为主的,当输出的位置变成了内存,那么就称为内存操作流.此时得使用内存流完成内存的输入和输出操作. 如果程序运行过程中要产生一些临时文件,可采用虚拟文 ...

  4. java mod %区别_Java中 % 与Math.floorMod() 区别详解

    %为取余(rem),Math.floorMod()为取模(mod) 取余取模有什么区别呢? 对于整型数a,b来说,取模运算或者取余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余 ...

  5. java 静态分派_Java中的静态分派与动态分派

    本文是<深入理解Java虚拟机>8.3.2节的读书笔记,理解有误的地方,欢迎指正 首先是两个概念: 静态类型,即是变量声明时的类型. 实际类型,变量实例化时采用的类型. 比如我们有这样一段 ...

  6. java show过时_Java中show() 方法被那个方法代替了? java编程 显示类中信

    你说的show是swing里的吧,在老版本中Component这个超类确实有show这个方法,而且这个方法也相当有用,使一个窗口可见,并放到最前面.在jdk5.0中阻止了这个方法,普遍用setVisi ...

  7. java判断类型_Java中类型判断的几种方式 - 码农小胖哥 - 博客园

    1. 前言 在Java这种强类型语言中类型转换.类型判断是经常遇到的.今天就细数一下Java中类型判断的方法方式. 2. instanceof instanceof是Java的一个运算符,用来判断一个 ...

  8. java this用法_java中this用法小结

    Java关键字this只能用于方法方法体内.当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是this.因此,this只能在类中的非静态方法中使用,静态 ...

  9. java 序列化实例_Java中的序列化与反序列化实例

    创建的字节流与平台无关.因此,在一个平台上序列化的对象可以在另一个平台上反序列化. 为了使Java对象可序列化,我们实现java.io.Serializable可序列化接口. ObjectOutput ...

最新文章

  1. 48个Python练手项目(附详细教程)
  2. docker mysql 容器无故停止的原因
  3. 获取jar包内部的资源文件
  4. python csv使用_python CSV模块的使用
  5. 机器学习笔记(了解)
  6. JavaCard概述
  7. 同步监视器之同步代码块、同步方法
  8. 关于AttachCurrentThread和DetachCurrentThread的故事
  9. 删除误添加的本地github检查库文件
  10. 线材下料优化python算法_深度学习中的优化算法(Optimizer)理解与python实现
  11. Swift翻译之-关于Swift
  12. mac安装adb工具
  13. 篡改计算机网络,基于TCP协议的网络数据实时篡改.doc
  14. struct所占的内存
  15. wpscan扫描的简单介绍(对WordPress的扫描CMS)
  16. A - Multiplication Dilemma (思维)( 2018 ACM ICPC Arabella Collegiate Programming Contest)
  17. Github 摸鱼神器面世!
  18. 三输入,八输出译码器门级实现
  19. TDH sql及plsql的调优
  20. 中国联通3G网络覆盖全国200余城市

热门文章

  1. linux 添加samba账户
  2. Linux环境下查看CPU资源的命令
  3. Mac terminal终端或iterm2【 ?~?】~两边出现问号、字体有背景色的问题
  4. 蓝桥杯 ADV-105 算法提高 不同单词个数统计
  5. 蓝桥杯 ALGO-68 算法训练 判定数字
  6. 使用System Center Essentials 2007进行软件部署
  7. 大数据怎样帮助运维工程师实现无死角监控?
  8. HDU 1255 覆盖的面积(线段树+扫描线)
  9. visualstudio学习
  10. 【转载】cocos2d-x类型转换(CCstring int string char UTF-8互转)以及字符串详解