在Linux中有两个不同的信号可以用来暂停进程, SIGSTOP和SIGTSTP 。 两者都不由HotSpot虚拟机处理,因为SIGSTOP不能被捕获,而SIGTSTP 因为不被HotSpot处理 。 我想知道发送这两个信号是否安全,或者在不安全的情况下, JVM的哪个部分会受到影响(比如垃圾收集器)。 请注意,我并不关心在JVM上运行的程序可能存在的问题,我特别关心JVM的内部。 将STOP / TSTP发送到JVM是否安全?
捕捉信号:使用成员函数作为信号处理程序
C ++,linux,fork,execvp,waitpid和SIGTSP
试图在Linux上closures睡眠
Boost.asio和UNIX信号处理
什么是Unix的信号?
SIGSTOP和SIGTSTP不包含在HotSpot JVM的信号处理中并不意味着HotSpot JVM不支持它们。
这只意味着这两个信号没有特殊的处理。 一些信号( SIGSEGV , SIGTERM等)由HotSpot JVM专门处理,以实现某些功能 (隐式空检查,关闭挂钩等)。
那些没有特别处理的,他们将表现默认的方式 。 因此,当HotSpot收到SIGSTOP和SIGTSTP ,它将表现为默认的方式,这意味着暂停和终端暂停 。
事实上, SIGSTOP不能被忽略。 从信号(7)的手册页 :
信号SIGKILL和SIGSTOP不能被捕获,阻塞或忽略。
我们可以通过一个简单的C程序来演示:
#include<stdio.h> #include<unistd.h> int main() { while(1) { printf("Hello Worldn"); usleep(900000); } return 0; }
没有信号处理SIGSTOP或SIGTSTP ,但是仍然可以将它们发送到这个简单的程序,它们的行为是正确的。
按Ctrl + Z将发送一个SIGTSTP信号,并通过运行kill -19 pid将发送一个SIGSTOP信号。 演示程序将暂停。
在这两种情况下,运行kill -18 pid将发送SIGCONT信号,并将演示程序恢复执行。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。