web-dev-qa-db-ja.com

「TERM」を使用したシグナル処理

スタンドアロンアプリケーションがあり、ユーザーがstart-->shutdownでシステムをシャットダウンしようとしたときに、ユーザーが行った変更を保存するための確認ダイアログボックスを表示する必要があります。

signalhandlersを使用することでそれができることを知りました。
シグナルハンドラーの使い方を教えてもらえますか

16
chaithu

2012年5月の更新(2年半後)

Trejkaz コメント:

Javaの現在のバージョンでは、「INT」シグナルが「VMまたはOSによって予約されている」ため、このシグナル処理コードは失敗します。
さらに、他の有効なシグナル名は、何かがアプリケーションを閉じるように要求したときに実際に起動することはありません(私は、見つけたすべてのシグナルを入念にテストしました...)
シャットダウンフックはほとんど機能しますが、この場合は起動していないことがわかったため、次のステップは明らかに、JVMの背後にあるハンドラーの登録に頼ることです。

" HotSpot VMのトラブルシューティングガイド "の「 シグナルと例外処理の統合 "」の章では、シグナル" SIGTERMSIGINTSIGHUP "は、SolarisOSおよびLinuxの場合のみ。
Windowsでの例外処理についてのみ説明します。


元の回答(2009年9月)

a ShutdownHook そのケースを処理できるはずです

Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
    public void run() {
        // what you want to do
    }
}));

警告
参照:

単純な信号処理の例として:

public class Aaarggh {
  public static void main(String[] args) throws Exception {
    Signal.handle(new Signal("INT"), new SignalHandler () {
      public void handle(Signal sig) {
        System.out.println(
          "Aaarggh, a user is trying to interrupt me!!");
        System.out.println(
          "(throw garlic at user, say `shoo, go away')");
      }
    });
    for(int i=0; i<100; i++) {
      Thread.sleep(1000);
      System.out.print('.');
    }
  }
}
37
VonC