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...