4

Linux では、プロセスを一時停止するために使用できる 2 つの異なるシグナルSIGSTOPSIGTSTPがあります。どちらもHotSpot 仮想マシンでは処理されません。SIGSTOPはキャッチできないため、SIGTSTPは HotSpotで処理されないためです。これら 2 つのシグナルを送信しても安全かどうか、安全でない場合は、JVM のどの部分が影響を受けるか (ガベージ コレクターなど) を知りたいです。JVMで実行されているプログラムが持つ可能性のある問題については気にしないことに注意してください。特にJVMの内部に関心があります。にSTOP/TSTPを送信しても安全ですか?JVM ?

4

1 に答える 1

4

SIGSTOPおよびSIGTSTPHotSpot JVM のシグナル処理に含まれていないからといって、HotSpot JVMがそれらをサポートしていないわけではありません。

これは、これら 2 つのシグナルに特別な処理がないことを意味するだけです。一部のシグナル ( SIGSEGV、など) は、特定の機能(暗黙的な null チェック、シャットダウン フックなど)SIGTERMを実装するために、HotSpot JVM によって特別に処理されます。

特別に扱わないものは、デフォルトの方法で動作します。したがって、HotSpot が と を受け取るSIGSTOPSIGTSTP、デフォルトの方法、つまりPauseTerminal Pauseで動作します。

実際、SIGSTOP無視することはできません。signal(7) のman ページから:

シグナルSIGKILLとシグナルSIGSTOPは、キャッチ、ブロック、または無視できません。

これは、単純な C プログラムで実証できます。

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

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

  return 0;
}

SIGSTOPまたはのシグナル処理はありませんSIGTSTPが、この単純なプログラムにそれらを送信すると、正しく動作します。

Ctrl+Z を押すとシグナルが送信SIGTSTPされ、実行kill -19 pidするとシグナルが送信されますSIGSTOP。デモ プログラムが一時停止します。

どちらの場合も、実行するとシグナルkill -18 pidが送信され、デモ プログラムが実行状態に戻ります。SIGCONT

于 2013-10-09T13:36:48.250 に答える