CLIアプリケーションでCtrl + Cを「インターセプト」するにはどうすればよいですか?


85

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

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

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

回答:


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

これはシグナルを傍受できるはずですが、JVMが完全にシャットダウンする前の中間ステップとしてのみであるため、あなたが探しているものではない可能性があります。

+によってトリガーされる信号をインターセプトするにはSignalHandlersun.misc.SignalHandler)を使用する必要があります(UnixおよびWindowsの場合)。 参照この記事(PDFファイル、ページ8および9を)。SIGINTCtrlC


5
@MartijnCourteauxそれは5年後に起こります;)私はそのトピックに関する同様の情報源を見つけ、それに応じてリンクを変更しました。
vonC 2014

@ VonC-再び死んだ
Gurwinder Singh 2017

@GurVどのリンク?私は2014年4月に作られた編集(stackoverflow.com/revisions/...)まだ有効である:あなたはまだpdfファイルをダウンロードすることができます。..
VonC

16

正常にシャットダウンし、シャットダウンプロセスを短絡させたくないと想定しています。私の仮定が正しければ、シャットダウンフックを見る必要があります。


これまでシャットダウンフックについて聞いたことがありません。ありがとうございました!
ivan_ivanovich_ivanoff 2009

8

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

見る http://www.oracle.com/technetwork/java/javase/signals-139944.htmlをシグナル処理の詳細については。

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


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と互換性があると聞いたのを覚えていますが、バージョンによって大きく異なる可能性があります。


1
2番目のリンクは失敗します。oracle.com/technetwork/java/javase/tsg-vm-149989.pdfでOracleに変更されています か?
チャンス

3番目のリンクも失敗します
Hugo Zaragoza
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.