2012-04-19 16 views
4

名前付きパイプを使用してC++アプリケーションと通信するJavaアプリケーションを作成しています。 C++アプリケーションが終了すると、JavaはSIGPIPEを取得し、Javaアプリケーションは終了します。AndroidでのUnixシグナルの処理

C/C++では、私はその信号を捕捉して無視する方法を知っています。 Android/Javaで同様のことをすることは可能ですか?

+1

たぶん、それはのルールで戦うためにではない良いことですゲーム:もしあなたのJavaアプリケーションがC++に縛られていて、それ以上の接続がなければ、あなたのJavaアプリケーションを壊して再起動してください。 このリンクは便利です:http://stackoverflow.com/questions/2541597/how-to-gracefully-handle-the-sigkill-signal-in-java - シャットダウンフックを設定する方法。 –

+0

**これは可能です**例えばhttp://stackoverflow.com/questions/1083154/how-can-i-catch-sigsegv-segmentation-fault-and-get-a-stack-trace-under-jniを参照してください-ON –

+0

@ChrisStrattonは面白そうですね。ありがとう! – elcuco

答えて

1

これは本当に可能ではないようです。利用可能な最善の解決策は、シャットダウンフックを追加することと、ここで説明したように、「優雅」、アプリケーションを再起動します:

EDIT:

私はJNIコードを持っていた(当時)ので、私はこれを必要とします私はそれにFDとr/wを開いた。 FDは名前付きソケット(Unixパイプ)にオープンされ、パイプのリモート側(私の場合はデーモン、またはAndroid C /サービス)が接続を終了すると、あなたの側にシグナルが送られます。これは必ずしも良いことではありません。 IMHOこれを処理する最良の方法は、古い古いplain-Cコードのシグナルハンドラを使用し、それを飲み込むだけです(さもなければ、アプリケーションのJava側に通知する必要があります)。

http://stackoverflow.com/questions/2541597/how-to-gracefully-handle-the-sigkill-signal-in-java
+1

この回答は、Androidに必ずしも適用されるわけではないjvmベースの説明を引用しています。Androidは、コードのコンパイルおよび変換されたフォームJavaを使用しています。実際にJava仮想マシンを実行するのではなく、ランタイム)マシンでは、動作が多少異なります。さらに、少なくともNDKでは、自分自身のDVMプロセスでシグナルハンドラを置き換えることができる可能性が非常に高いです。 –

+0

私はそれがうまくいかないとは言いませんでした。むしろリンクが完全には適用できないし、それがうまくいく方法があるようです。 –

関連する問題