Java 处理系统信号

Java 处理系统信号

Linux信号量是一种比较原始的进程通信手段。有很多缺陷,可却是理解操作系统的基础概念。使用 kill -l 查询机器上所有信号量,不同操作系统上显示的不一样。java 开放的api中涉及信号量的只有退出信号,即使用runtime.addShutdownHook()实现jvm退出钩子。但是我们可以通过 sun.misc 包来实现支持其他信号的处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import sun.misc.Signal;
public class SignalHandler {

public static class Handler implements sun.misc.SignalHandler {

private final sun.misc.SignalHandler prevHandler;

Handler(String name) {
// 注册对指定信号的处理
prevHandler = Signal.handle(new Signal(name), this);
}
@Override
public void handle(Signal signal) {
// 信号量名称
String name = signal.getName();
// 信号量数值
int number = signal.getNumber();

// 当前进程名
String currentThreadName = Thread.currentThread().getName();

System.out.println("[Thread:"+currentThreadName + "] receved signal: " + name + " == kill -" + number);
// 将signal 传递给 jvm 底层
prevHandler.handle(signal);
}
}

public static void main(String[] args) throws InterruptedException {
final String[] SIGNALS = new String[]{ "TERM", "HUP", "INT" };
for (String signalName : SIGNALS) {
new Handler(signalName);
}
while(true) {
Thread.sleep(1000);
}
}
}

启动该进程后,通过jps命令查看SignalHandler的pid,使用kill -n pid向进程发送信号量。

-------------本文结束感谢您的阅读-------------
坚持分享,您的支持将鼓励我继续创作!
0%