2012-04-19 35 views
4

我正在寫一個Java應用程序,該應用程序使用命名管道與C++應用程序通信。當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 - 如何設置關機掛鉤。 – 2012-10-06 17:22:12

+0

這**是可能的**例如http://stackoverflow.com/questions/1083154/how-can-i-catch-sigsegv-segmentation-fault-and-get-a-stack-trace-under-jni -on – 2014-03-17 16:34:14

+0

@ChrisStratton看起來很有趣。謝謝! – elcuco 2014-03-18 09:15:02

回答

1

看來這是不可能的。可用的最好的解決辦法是添加一個關閉掛鉤和「優雅」重新啓動應用程序,如下所述:

編輯:

我需要這個,因爲(當時)我有JNI代碼上我打開了一個FD和r/w。 FD打開到一個命名的套接字(一個Unix管道),當管道的遠端(在我的情況下是一個守護進程或Android C /服務)關閉連接(或死亡)時,你的一方會得到一個信號。這並不總是很好。恕我直言,最好的處理方式應該是使用良好的舊的普通C代碼的信號處理程序,然後吞下它(否則 - 你應該通知你的應用程序的Java方面)。

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

這個答案引用了基於jvm的解釋,它不一定適用於Android,因爲Android使用從Java編譯和翻譯的代碼,但它實際上並不運行Java虛擬機,而是它自己的Dalvik(或最近的Android運行時)機器,它有不同的行爲。此外,很有可能 - 至少在NDK中 - 可以取代自己DVM過程中的任何信號處理程序。 – 2014-03-17 16:25:44

+0

我沒有說它不起作用,而是這個鏈接並不完全適用,並且似乎有辦法在其中起作用。 – 2014-03-18 12:48:45