在 Linux 中,有两种不同的信号可用于暂停进程,SIGSTOP和SIGTSTP。两者都不由HotSpot 虚拟机处理,SIGSTOP因为无法被捕获,而SIGTSTP 因为不由HotSpot处理。我想知道发送这两个信号是否安全,或者如果不安全,JVM的哪个部分会受到影响(例如垃圾收集器)。请注意,我不关心在JVM上运行的程序可能遇到的问题,我对JVM的内部特别感兴趣。发送STOP/TSTP到虚拟机?
问问题
2200 次
1 回答
4
SIGSTOP
并且SIGTSTP
不包含在 HotSpot JVM 的信号处理中并不意味着 HotSpot JVM 不支持它们。
这仅意味着对这两个信号没有特殊处理。HotSpot JVM 专门处理一些信号(SIGSEGV
、、SIGTERM
等)以实现某些功能(隐式空值检查、关闭挂钩等)。
那些没有特别处理的,他们会以默认方式行事。因此,当 HotSpot 接收SIGSTOP
到 and时SIGTSTP
,它将按照默认方式运行,即Pause和Terminal Pause。
事实上,SIGSTOP
不容忽视。从信号(7)的手册页:
信号
SIGKILL
和SIGSTOP
不能被捕获、阻止或忽略。
我们可以通过一个简单的 C 程序来证明这一点:
#include<stdio.h>
#include<unistd.h>
int main()
{
while(1)
{
printf("Hello World\n");
usleep(900000);
}
return 0;
}
没有任何信号可以处理SIGSTOP
or SIGTSTP
,但您仍然可以将它们发送到这个简单的程序,它们会正常运行。
按 Ctrl+Z 将发送一个SIGTSTP
信号,按 runkill -19 pid
将发送一个SIGSTOP
信号。演示程序将暂停。
在这两种情况下,运行 akill -18 pid
都会发送SIGCONT
信号并使我们的演示程序重新执行。
于 2013-10-09T13:36:48.250 回答