2009-08-01 3 views
75

どのようにすることができますI(通常はプロセスを殺す)インターセプトはCtrl +C CLI(コマンドラインインタフェース)、Javaアプリケーションで ?CLIアプリケーションでCtrl + Cを「インターセプト」するにはどうすればよいですか?

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

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

答えて

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

これは、信号を傍受することができるはずですが、JVM前の中間ステップは、完全に自分自身をシャットダウンだけとして、それはあなたが後に探しているものではないかもしれません。

あなたははCtrl +C(Unix上だけでなく、Windowsの場合)によってトリガSIGINT信号を傍受するSignalHandlersun.misc.SignalHandler)を使用する必要があります。
this article(pdf、8および9ページ)を参照してください。

+0

リンクが死んでいます... –

+5

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

+0

@VonC - それはまた死んだ – GurV

15

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

+0

以前はシャットダウンフックについて聞いたことがありません。ありがとうございました! –

7

CCtrlキーを+ を扱うことができるようにするためにCtrlキー + C入力ではないので、何らかの理由でシャットダウンすることなく、あなたが扱う信号(のいくつかのフォームを使用する必要があります実際にあなたのアプリケーションに直接渡され、その代わりに、その後のJavaに渡されるSIGINTを生成し、OSによって処理されます。

は、信号処理の詳細については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がうまくいくはずです、わかりませんが、私はPOSIXとの互換性もあると聞いて覚えていますが、バージョン。

+1

2番目のリンクが失敗します。 (http://www.oracle.com/technetwork/java/javase/tsg-vm-149989.pdf)からOracleに変更されましたか? – chance

+0

第3リンクも失敗する –

関連する問題