4

在 Linux 中,有两种不同的信号可用于暂停进程,SIGSTOPSIGTSTP。两者都不由HotSpot 虚拟机处理,SIGSTOP因为无法被捕获,而SIGTSTP 因为不由HotSpot处理。我想知道发送这两个信号是否安全,或者如果不安全,JVM的哪个部分会受到影响(例如垃圾收集器)。请注意,我不关心在JVM上运行的程序可能遇到的问题,我对JVM的内部特别感兴趣。发送STOP/TSTP虚拟机

4

1 回答 1

4

SIGSTOP并且SIGTSTP不包含在 HotSpot JVM 的信号处理中并不意味着 HotSpot JVM 不支持它们。

这仅意味着对这两个信号没有特殊处理。HotSpot JVM 专门处理一些信号(SIGSEGV、、SIGTERM等)以实现某些功能(隐式空值检查、关闭挂钩等)。

那些没有特别处理的,他们会以默认方式行事。因此,当 HotSpot 接收SIGSTOP到 and时SIGTSTP,它将按照默认方式运行,即PauseTerminal Pause

事实上,SIGSTOP不容忽视。从信号(7)的手册页

信号SIGKILLSIGSTOP不能被捕获、阻止或忽略。

我们可以通过一个简单的 C 程序来证明这一点:

#include<stdio.h>
#include<unistd.h>

int main()
{
  while(1)
  {
    printf("Hello World\n");
    usleep(900000);
  }

  return 0;
}

没有任何信号可以处理SIGSTOPor SIGTSTP,但您仍然可以将它们发送到这个简单的程序,它们会正常运行。

按 Ctrl+Z 将发送一个SIGTSTP信号,按 runkill -19 pid将发送一个SIGSTOP信号。演示程序将暂停。

在这两种情况下,运行 akill -18 pid都会发送SIGCONT信号并使我们的演示程序重新执行。

于 2013-10-09T13:36:48.250 回答