為什麼中斷訊號SIGINT處理函式不生效?

2021-08-21 02:35:33 字數 888 閱讀 6046

乙個測試可**編的可執行程式中,執行開始之後,然後按下ctrl-c,中斷程式執行,看core檔案,程式是跑到了乙個第三方的庫裡面coredump了。

正常的懷疑,就是自己沒有安裝中斷處理函式,導致出問題。那麼步驟1:嘗試自己安裝中斷處理函式。

自己的**是乙個zmq的poll阻塞式呼叫。在zmq系統開始初始化之前,安裝了乙個中斷處理函式。

函式**大致如下:

中斷訊號處理函式

expand source

在初始化的時候,執行了s_catch_signals

()對函式在系統中註冊。

再進行問題的重試。結果還是一樣,core的結果還是一樣。

嘗試在gdb中進行除錯,結果還是一樣,中斷處理的過程,直接跑到了乙個第三方的庫裡面導致coredump,有點蒙了。

遇到這類問題,首先要做的就是:不要急!
先看看這個第三方的庫,看目錄和名稱,應該是oracle的。我的程式中確實使用了oracle的資料庫連線的功能。

然後再看看它的堆疊函式的名稱:sslsshandler,怎麼也是個handler,難道是它安裝了中斷處理函式?跑到它裡面去了?見鬼了。這得怎麼弄。

第一反應就是找到它是**安裝的,我的**裡面並沒有顯式安裝第三方庫的中斷函式,那肯定就是呼叫db操作的時候安裝了。

得出嘗試方法:試著把s_catch_signals()這個操作放到db連線之後進行,是不是後安裝的直接覆蓋了前面安裝的原因導致。

與問題分析中猜想的一致。在db連線之後再安裝中斷訊號函式,則可以生效,coredump問題解決

結論:如果第三方庫中搶了中斷訊號處理許可權,則我們在第三方庫安裝之後再安裝方可生效我們自定義的中斷訊號處理操作。

訊號處理中為什麼用復訊號

有關復訊號,不清楚的可以學習一下!中國通訊網 通訊資訊號是資訊的載體,實際的訊號總是實的,但在實際應用中採用復訊號卻可以帶來很大好處,由於實訊號具有共軛對稱的頻譜,從資訊的角度來看,其負頻譜部分是冗餘的,將實訊號的負頻譜部分去掉,只保留正頻譜部分的訊號,其頻譜不存在共軛對稱性,所對應的時域訊號應為復...

為什麼需要中斷

為什麼需要中斷?如果讓核心定期對裝置進行輪詢,以便處理裝置,那會做很多無用功,因為外設的處理速度一般慢於cpu,而cpu不能一直等待外部事件。所以能讓裝置在需要核心時主動通知核心,會是乙個聰明的方式,這便是中斷。1.中斷處理程式 在響應乙個特定中斷時,核心會執行乙個函式 中斷處理程式。中斷處理程式與...

為什麼中斷不能休眠

1.中斷處理的時候,不應該發生程序切換,因為在中斷context中,唯一能打斷當前中斷handler的只有更高優先順序的中斷,它不會被程序打斷 這點對 於softirq,tasklet也一樣,因此這些bottom half也不能休眠 如果在中斷context中休眠,則沒有辦法喚醒它,因為所有的 wa...