linux kill发送信号量,linux kill常见信号量 在 Java中的应用

标签:

linux kill常见信号量 在 Java中的应用

kill 常见的信号量

kill -l

f5c1f7db552492e97a57c88840c45184.png

里面只有 9) SIGKILL 信号特别 可以无条件终止进程

Java 中的钩子函数

Java 中可以使用

注册钩子函数

public class Main {

public static void main(String[] args) throws InterruptedException {

long i = 0l;

Runtime.getRuntime().addShutdownHook(new Thread( ()->{

out.println(Thread.currentThread().getName()+": shutdown");

}));

for(;;){

i++;

out.println(i);

TimeUnit.MILLISECONDS.sleep(1000);

}

}

}

使用 kill pid (默认是SIGTERM信号量)的方式结束进程

1eaa3381bd2523edc2dcf3cb6ef74fd6.png

很明显触发了 钩子函数

我们在使用 kill -9 pid 的信号量试试

c64a1723dbf3293d357456e2f3bea1c8.png

使用 9的信号量很明显 没有触发钩子函数(所以线网应用为了平滑关闭最好不要使用 9 的信号量)

使用kill -3 试试

94e0a9b4b76b2f61695e2ad8c9956038.png

可以看到输出了JVM 线程栈的信息 还有整个堆的情况 但是钩子函数没有调用,而且进程也没有退出.

我们在试试 kill -(1|2) pid 的效果

3f1cb6f6355bf06328e0477958f2a9c5.png

看来跟 -15 信号量是一样的效果

更多的信号量 大家可以自己试试

## Java 实现监听信号量

>Q: 如果我们自己要监听kill 的信号量 要怎么办呢。

> A: 实现 SignalHandler 接口的handle 方法

public class CatchSign implements SignalHandler {

@Override

public void handle(Signal signal) {

out.println(signal.getName()+":handle");

}

public static void main(String[] args) throws Exception {

CatchSign cs = new CatchSign();

Signal.handle(new Signal("IO"),cs);

System.in.read();

}

使用 kill -23 pid 试试

a3b25abca1fe42ffc981e91820fd0710.png

触发了handle方法了

使用中的意外

如果注册了JVM中已存在的信号量 就会出现下面的异常了.

0e7d75cd1725679f5f1c17e8ad1b7901.png

这里随便说下 上文中 kill -3 信号量的输出就是JVM中已经注册了的

标签:

来源: https://blog.csdn.net/java_magicsun/article/details/83047667

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值