2012-08-08 41 views
3

我有一個庫,它爲SIGSEGV安裝一個信號處理程序用於調試目的。 SIGSEGV處理程序只是輸出一些信息,然後退出程序。檢查已安裝的信號處理程序

最近,我需要從Java調用這個庫(使用JNI),而我遇到的問題是JVM還爲SIGSEGV安裝了一個信號處理程序,以實現比我更有用的目的。

所以我想要選擇的行動是,如果我的圖書館發現信號處理程序已經安裝了一個信號,它根本不會安裝任何信號。

爲了清楚起見,我使用了sigaction調用。

現在要實現我的功能我要做的是:

a。阻止所有信號。

b。調用sigaction並檢查oact是否返回有效的處理程序。

c。如果確實如此,請將新操作重新調用sigaction。 d)。 UNBLOCK信號。

乙和丙似乎對我來說很麻煩。我想要的是能夠確定一個特定的信號是否已經擁有一個處理程序,而不必先替換該處理程序,然後用原始處理程序重新替換它(不實現任何內容)。

有什麼比sigaction更細粒度的嗎?

+1

不,沒有。你有什麼問題?你的用例真的非常重要,你不能花4個系統調用來明確地做某些事情,而且需要**一個特殊的目的原子測試和替換信號處理器系統調用添加到內核? – 2012-08-08 20:50:20

回答

2

您可以撥打sigaction(SIGSEGV, NULL, &sa)來查詢信號配置而不更改它。

請注意,阻塞信號不會「鎖定」其他線程,因爲信號掩碼是每個線程,而信號處置對於進程中的所有線程都是通用的。

+0

幸運的是,我只處理單線程應用程序 – Saurabh 2012-08-11 19:51:49

+0

@Saurabh:如果您在您的流程中處理Java,那麼它不可能是單線程流程。 – 2017-09-23 11:32:45