当前位置: 首页 > news >正文

57 mac 中 SIGINFO 信号, jdk8 支持, 但是 jdk9 不支持?

前言

问题来自于文章 shell脚本 后台启动 程序1 + “tail -f log“, ctrl +c 导致程序1中断 中的测试用例 Test07Signal2ParentProcess, 可以看到 我当时标记了一个 "todo, not work in hostpostVM9"

然后 问题是这样的, 我同一台机器, 然后 jdk8 带上 SIGINFO 去执行 Test07Signal2ParentProcess 没有问题, 但是 jdk9 带上 SIGINFO 去执行 Test07Signal2ParentProcess 报错如下 

然后 jdk9 执行报错如下 

Exception in thread "main" java.lang.IllegalArgumentException: Unknown signal: INFO
	at java.base/jdk.internal.misc.Signal.<init>(Signal.java:148)
	at jdk.unsupported/sun.misc.Signal.<init>(Signal.java:139)
	at com.hx.test13.Test07Signal2ParentProcess.main(Test07Signal2ParentProcess.java:50)

这个就很奇怪了,信号支持哪些 不是和操作系统有关系嘛? 为什么 和 jdk 也有关系 

我们这里会大致剖析一些东西, 在 mac 上面造成上面这个问题的原因 

kill -l 所支持的信号列表是怎么来的? 

操作系统支持 的信号列表?

jdk8/jdk9 对于 Signal.findSignal 的处理

首先看一下 jdk9, jdk9 这里几种类unix操作系统是走的统一处理 

是从 g_signal_info 中遍历匹配给定的信号名称, 如果找不到 返回 -1, 否则返回对应的 索引

g_signal_info 是取自于这里, 根据 signal.h 中是否支持给定的信号, 创建的信号映射数组  

mac 上面是支持 SIGINFO 信号, 但是 g_signal_info 中没有 SIGINFO 的处理, 因此 最终 jdk9 中不支持 SIGINFO 

最终没有找到 SIGINFO 的信号, 然后 外层 jdk 抛出异常 

最终由 Signal 的构造方法抛出 "Unknown signal: INFO" 的异常 

再来看一下 jdk8, jdk8 这里不同的操作系统是走的不同的处理 

signaltable 是根据操作系统, 配置死的 

jdk8 支持的 信号列表

HUP
INT
QUIT
ILL
TRAP
ABRT
EMT
FPE
KILL
BUS
SEGV
SYS
PIPE
ALRM
TERM
URG
STOP
TSTP
CONT
CHLD
TTIN
TTOU
IO
XCPU
XFSZ
VTALRM
PROF
WINCH
INFO
USR1
USR2

jdk9 支持的信号列表 

ABRT
ALRM
BUS
CHLD
CONT
EMT
FPE
HUP
ILL
INT
IO
KILL
PIPE
PROF
QUIT
SEGV
STOP
SYS
TERM
TRAP
TSTP
TTIN
TTOU
URG
USR1
USR2
VTALRM
WINCH
XCPU
XFSZ

mac 支持的信号列表

HUP
INT
QUIT
ILL
TRAP
ABRT
POLL
IOT
EMT
FPE
KILL
BUS
SEGV
SYS
PIPE
ALRM
TERM
URG
STOP
TSTP
CONT
CHLD
TTIN
TTOU
IO
XCPU
XFSZ
VTALRM
PROF
WINCH
INFO
USR1
USR2

参照对比一下 jdk8 比 jdk9 多支持一个 SIGINFO 

mac本身 比 jdk8 多支持 POLL, IOT

所以在 jdk8 中支持的 信号是由 jvm 决定的, 在 jdk9 中支持的信号是由 jvm + 操作系统来决定的

kill -l 所支持的信号列表是怎么来的?  

查看一下 coreutils 的 kill 的代码  

将 名称 转换为索引 

名称列表来自于 kill 程序, 信号是否支持 来自于 操作系统的 signal.h 

signal.h 

所以 kill 中支持的信号是由 kill + 操作系统来决定的 

操作系统支持 的信号列表? 

mac 支持如下信号列表 

大部分的 x86 的其他 linux 支持如下的信号列表 

完 

相关文章:

  • 【Linux】在Linux上写一个进度条小程序
  • 【寒假每日一题】DAY.6 有序序列的合并
  • 2022年度总结,迎接2023
  • (二十)正则表达式
  • 多节点Linux环境打造
  • Spring Boot配置文件数据也可以轻松加密?
  • 第十三届蓝桥杯C++B组省赛 J 题——砍竹子(AC)
  • 拓扑排序 (算法思想+图解+模板+练习题)
  • SAP FICO常用报表和事务码大全
  • 2. PyTorch简介:使用PyTorch训练第一个神经网络
  • LeetCode 295. 数据流的中位数(C++)*
  • MySQL表的增删查改
  • 完全二叉树与堆(包含STL堆的用法)
  • 用HTML写一个2023跨年动画代码(烟花+自定义文字+背景音乐+雪花+倒计时)
  • Electron打包图标不显示解决方案
  • Synchronized锁原理及 ConcurrentHashMap
  • OpenCV学习
  • 【位图】面对海量数据,如何压缩空间?定位数据?
  • 【Linux】进程创建、终止、等待、替换、shell派生子进程的理解…
  • 《L1 - 5分合集总结》
  • 两部门发布“五一”假期全国森林草原火险形势预测
  • 长三角铁路今日预计发送旅客420万人次,有望创单日客发量新高
  • 五大光伏龙头一季度亏损超80亿元,行业冬天难言结束
  • 体重管理门诊来了,瘦不下来的我们有救了?|健康有方FM
  • 马上评丨准入壁垒越少,市场活力越足
  • 国有六大行一季度合计净赚超3444亿,不良贷款余额均上升