Red Hat LinuxでJavaの問題(IBM JVM 1.4.2 64ビットを使用)を調べています。 誰もがこのエラーメッセージを以前に見たことがあり、この問題の回避策があるかどうか知っていますか?Javaエラー:java.lang.IllegalArgumentException:既にVMで使用されているシグナル:INT
出典:
import sun.misc.Signal;
import sun.misc.SignalHandler;
public class SignalTest extends Thread
{
private static Signal signal = new Signal("INT");
private static ShutdownHandler handler = new ShutdownHandler();
private static class ShutdownHandler implements SignalHandler
{
public void handle(Signal sig)
{
}
}
public static void main(String[] args)
{
try
{
Signal.handle(signal, handler);
}
catch(Throwable e)
{
e.printStackTrace();
}
try { Thread.sleep(5000); } catch(Exception e) { e.printStackTrace(); }
System.exit(0);
}
}
出力:
java.lang.IllegalArgumentException <Signal already used by VM: INT>
java.lang.IllegalArgumentException: Signal already used by VM: INT
at
com.ibm.misc.SignalDispatcher.registerSignal(SignalDispatcher.java:145)
at sun.misc.Signal.handle(Signal.java:199)
at xxx
追加情報:
私は奇妙な何かを見つけました。 それが失敗する理由は、バックグラウンドプロセスとしてシェルスクリプト内でプログラムを実行しているからです。
sigtest.shすなわち:私は、コマンドラインからプログラムを実行するか、または「&」(すなわち、それシェルスクリプト内のフォアグラウンド・プロセス作りを)削除した場合
#!/bin/bash
java -cp . SignalTest >> sigtest.log 2>&1 &
、そうでありません問題があります... これがなぜこのようなのか分かりません。
ジン、私の答えにあなたのコメントを与え、JVMはこのイベントにフックを登録させていません。あなたが達成しようとしていることについてもっと詳しく記述できますか?たぶん、JVMの期待とより多く同期する方法があります。 – Yishai
中断された場合、コードをクリーンアップして正常に終了するようにしたい。 –
問題はJVM固有の問題でした。 私はJitterに賞金を授与しました。回答には「JVM実装固有のもの」が含まれていて、私の問題を診断するためのツールがほとんどでした。 ありがとうございます。 –