Linux では、プロセスを一時停止するために使用できる 2 つの異なるシグナルSIGSTOPとSIGTSTPがあります。どちらもHotSpot 仮想マシンでは処理されません。SIGSTOPはキャッチできないため、SIGTSTPは HotSpotで処理されないためです。これら 2 つのシグナルを送信しても安全かどうか、安全でない場合は、JVM のどの部分が影響を受けるか (ガベージ コレクターなど) を知りたいです。JVMで実行されているプログラムが持つ可能性のある問題については気にしないことに注意してください。特にJVMの内部に関心があります。にSTOP/TSTPを送信しても安全ですか?JVM ?
1 に答える
SIGSTOP
およびSIGTSTP
HotSpot JVM のシグナル処理に含まれていないからといって、HotSpot JVMがそれらをサポートしていないわけではありません。
これは、これら 2 つのシグナルに特別な処理がないことを意味するだけです。一部のシグナル ( SIGSEGV
、など) は、特定の機能(暗黙的な null チェック、シャットダウン フックなど)SIGTERM
を実装するために、HotSpot JVM によって特別に処理されます。
特別に扱わないものは、デフォルトの方法で動作します。したがって、HotSpot が と を受け取るSIGSTOP
とSIGTSTP
、デフォルトの方法、つまりPauseとTerminal 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