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

news/2024/10/30 15:28:51/

前言

问题来自于文章 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: INFOat 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 支持如下的信号列表 

完 


http://www.ppmy.cn/news/12217.html

相关文章

时间序列模型SCINet(代码解析)

前言 SCINet模型&#xff0c;精度仅次于NLinear的时间序列模型&#xff0c;在ETTh2数据集上单变量预测结果甚至比NLinear模型还要好。在这里还是建议大家去读一读论文&#xff0c;论文写的很规范&#xff0c;很值得学习&#xff0c;论文地址SCINet模型Github项目地址&#xff…

智能售货机系统帝可得

智能售货机 概述项目使用springcloudalibaba中提供的短信服务图形验证码生成多端登录/网关统一鉴权对象存储服务代码的自动填充微服务集成emq&#xff0c;发送emq工单业务流 接收工单 拒绝工单 运维工单补货工单使用xxl-job进行任务调度lkd集成xxl-job自动创建维修工单自动…

线程池(关于变量捕获、线程数、针对ThreadPoolExecutor的构造方法参数的解释、自实现线程池)

目录&#xff1a;一、前言二、关于变量捕获三、针对ThreadPoolExecutor的构造方法参数的解释四、自实现线程池一、前言相比较于进程&#xff0c;创建线程 / 销毁线程 的开销是相对较小的&#xff0c;但是太过频繁的创建线程 / 销毁线程&#xff0c;其开销也很大。这时候我们就需…

JVM-【面试题】-垃圾收集算法+垃圾收集器,以后就不用担心对象那些事了

一、垃圾收集算法在jvm里对可回收的对象在不同的垃圾收集器里&#xff0c;有不同的回收算法&#xff0c;具体的可以分为这四种&#xff1a;分代收集算法、复制算法、标记清除算法、标记整理算法1.1 分代收集算法当前虚拟机的垃圾收集都采用分代收集算法&#xff0c;这种算法没有…

每日一问-ChapGPT-20230114-关于小年

文章目录每日一问-ChapGPT系列起因每日一问-ChapGPT-20230114-关于小年腊月每天都做些什么的歌谣为什么现在的年味淡了很多&#xff0c;感觉不到过年为什么春节放假要调休&#xff0c;不能多放几天吗说说现在世界上极端气候&#xff0c;以及多少年后&#xff0c;地球存在不适宜…

P3654 First Step (ファーストステップ)

P3654 First Step (ファーストステップ) 题目背景 知らないことばかりなにもかもが&#xff08;どうしたらいいの&#xff1f;&#xff09; 一切的一切 尽是充满了未知数&#xff08;该如何是好&#xff09; それでも期待で足が軽いよ&#xff08;ジャンプだ&#xff01;&…

如何避免内存溢出和频繁的垃圾回收

0 OOM和频繁GC预防方案 代码明明简单&#xff0c;日常跑没问题&#xff0c;怎么一大促就卡死甚至进程挂掉&#xff1f;大多因为设计时&#xff0c;就没针对高并发、高吞吐量case考虑过内存管理。 1 自动内存管理机制的实现原理 内存管理主要考虑&#xff1a; 1.1 申请内存 …

十九、命令模式 ( Command Pattern )

命令模式&#xff08;Command Pattern&#xff09;中请求以命令的形式包裹在对象中&#xff0c;并传给调用对象 调用对象寻找可以处理该命令的合适的对象&#xff0c;并把该命令传给相应的对象&#xff0c;该对象执行命令 命令模式是行为型模式&#xff0c;一种数据驱动的设计…