1. 引入原因
由於在信號處理期間自動屏蔽了正在被處理的信號,而使用setjmp/longjmp跳出信號處理程序時又不會自動將
信號屏蔽碼修改會原來的屏蔽碼,從而引起該信號被永久屏蔽。
可以使用sigsetjmp/siglongjmp來解決這一問題。
2. 語法
#include<setjmp.h> void siglongjmp(sigjmp_buf env,int val); int sigsetjmp(sigjmp_buf env,int savemask);
POSIX標準沒有爲siglongjmp定義錯誤。sigsetjmp被直接激活是返回0,通過siglongjmp被激活是返回參數val的值。
3. 與setjmp和longjmp之間區別
這兩個函數與setjmp和longjmp之間的唯一區別是sigsetjmp增加了一個參數。如果savemask非0,則sigsetjmp在env中保存進程的當前信號屏蔽字。調用siglongjmp時,如果帶 非0 savemask的sigsetjmp調用已經保存了env,則siglongjmp從其中恢復保存的信號屏蔽字。