86

CLI (コマンド ライン インターフェイス) Java アプリケーションで+ (通常はプロセスを強制終了する) をインターセプト するにはどうすればよいですか?CtrlC

マルチプラットフォーム ソリューションは存在しますか (Linux、Solaris、Windows)?

を使用していますが、必要に応じて、他の方法を使用して標準入力から文字を読み取ることができますConsolereadLine()

4

4 に答える 4

125
Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() { /*
       my shutdown code here
    */ }
 });

これはシグナルをインターセプトできるはずですが、JVM が完全にシャットダウンする前の中間ステップとしてのみであるため、あなたが気にかけているものではないかもしれません。

SignalHandler( ) を使用して、 +によってトリガーされるシグナルsun.misc.SignalHandlerをインターセプトする必要があります(Unix と Windows の両方で)。この記事 を参照してください(pdf、ページ 8 および 9)。SIGINTCtrlC

于 2009-08-01T08:40:08.743 に答える
16

正常にシャットダウンし、シャットダウン プロセスを短絡させないことを前提としています。私の仮定が正しければ、Shutdown Hooksを見てください。

于 2009-08-01T08:35:30.063 に答える
8

何らかの理由でシャットダウンせずにCtrl+を処理できるようにするには、何らかの形式のシグナル処理を使用する必要があります ( +入力は実際にはアプリケーションに直接渡されるのではなく、生成する OS によって処理されるため)。 Java に渡される SIGINT。CCtrlC

シグナル処理の詳細については、http://www.oracle.com/technetwork/java/javase/signals-139944.htmlを参照してください。

(正常にシャットダウンしたいだけの場合は、akf の回答で十分です。)

于 2009-08-01T08:39:21.243 に答える
4

SIGTERM の処理方法に関するいくつかのリンク - これは、プログラムが OS 側で取得しているシグナルです。

http://blog.webinf.info/2008/08/intercepting-sigterm.html

http://java.sun.com/javase/6/webnotes/trouble/TSG-VM/html/signals.html

http://www.ibm.com/developerworks/java/library/i-signalhandling/

これは POSIX オペレーティング システムで動作するはずです。つまり、Mac と Unix は動作するはずです。Windows でもある程度は POSIX と互換性があると聞いたのを覚えていますが、バージョンによって大きく異なる可能性があります。

于 2009-08-01T08:42:33.810 に答える