使用setjmp的時候,同乙個訊號只能觸發一次

2021-07-06 06:33:29 字數 1243 閱讀 1528

linux的異常處理

基於setjmp和longjmp的執行控制方式是linux平台上c語言處理異常的標準方案,已被廣泛運用到由c語言開發的軟體系統和鏈結庫中,例如jpg解析庫,加密解密庫等等。setjmp和longjmp是以c語言標準庫函式的形式提供的,

setjmp

函式能夠儲存程式當前的執行環境,即程式的狀態,該被儲存的程式狀態可以在隨後程式執行的某一點被longjmp函式恢復,程式的控制流也將跳轉到呼叫setjmp時的執行點,實現非本地區域性跳轉("non-local goto")的機制。

問題描述:

在編寫基於異常的**混淆程式時,signal註冊的異常訊號處理程式只能執行一次,第二次發生異常時異常處理函式沒有被呼叫。

分析:

1. 搞清楚linux的訊號處理流程:

[1] 收到訊號,例如sigfpe

[2] 進入signal註冊的訊號處理函式,此時,sigfpe自動被加入到程序訊號遮蔽字

[3] 執行訊號處理函式

[4] 訊號處理結束,恢復訊號遮蔽字,sigfpe被取消阻塞

[5] 返回到產生訊號地方繼續執行

2. 分析異常處理函式沒有被呼叫的原因:

異常訊號處理函式在結束前沒有取消對sigfpe訊號的阻塞,直接呼叫longjmp()進行控制流轉移。所以在後面的執行過程中再次遇到sigfpe訊號,系統會自動根據 訊號遮蔽字進行遮蔽,異常處理函式也就無法被呼叫。

3. 該問題的解決辦法:

使用sigsetjmp和siglongjmp函式替換setjmp和longjmp函式。siglongjmp功能與longjmp類似,不同的是siglongjmp會自動恢復程序的訊號遮蔽字,因此相同的異常訊號再次發生時就不會被系統遮蔽了。

#include

#include

#include

jmp_buf jmpbuffer;

void fun(int i)

int main(int argc, char** argv) /*

struct sigaction act, oact;

act.sa_handler=fun;

sigemptyset(&act. sa_mask);

act. sa_flags = 0;

sigaction(sigusr2, &act, &oact); */

sleep(5000);

return 0; }

多個請求使用同乙個Servlet

如果jsp中乙個請求對應乙個servlet那要建很多servlet,冗餘較多。我們可以把乙個模組的請求封裝在乙個servlet,實現功能的模組化,從而簡化 其實這種方式有點類似於struts中的action。新建jsp檔案 輸入如下 分別是3個請求,請求同乙個servlet,但是後邊跟的引數meth...

VS同乙個專案屬性表的使用

最近在用vs2013開發kinect程式,使用了很多庫,比如 opencv pcl opengl 在網上找了很多別人寫的程式,根據不同人使用的庫,開啟.sln檔案後,總是要重新配置屬性表 專案 右鍵 屬性 如下 於是網上找了一下,有啥辦法沒有!結果每個專案都可以使用已有的很多屬性表,然後會繼承這個屬...

同乙個Activity的Dialog的重用

有可能同乙個畫面有多次機會要談出datepickerdialog 例如註冊畫面 但是如果每次都new乙個datepickerdialog的話,是不可取的,會消耗記憶體。android為datepickerdialog提供了updatedate方法來解決此問題,也就是共用乙個datepickerdia...