有時候不希望在接到訊號時就立即停止當前執行,去處理訊號,同時也不希望忽略該訊號,而是延時一段時間去呼叫訊號處理函式
1. 訊號阻塞和忽略訊號的區別
作業系統在訊號被程序解除阻塞之前不會將訊號傳遞出去,被阻塞的訊號也不會影響程序的行為,訊號只是暫時被阻止傳遞。當程序忽略乙個訊號時,訊號會被傳遞出去但程序會將訊號丟棄
2. sigprocmask
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
改變程序的當前阻塞訊號集,也可以用來檢測當前程序的訊號掩碼
how:
oldset:不是null指標,那麼目前的訊號遮蔽字會由此指標返回
注:sigprocmask()函式只為單執行緒的程序定義的,在多執行緒中要使用pthread_sigmask變數,在使用之前需要宣告和初始化
3. 設定方法
sig_block,sig_unblock成對實現。可以不用關心oldset
4. 示例
sigemptyset(&set); //初始化訊號量集
sigaddset(&set,sigtstp); //將sigtstp新增到訊號量集中
sigaddset(&set,sigint);//將sigint新增到訊號量集中
sigprocmask(sig_setmask,&set,&oldset); //將set中的sigint,sigtstp阻塞掉,並儲存當前訊號遮蔽字
關於訊號sigprocmask
sigemptyset new mask sigaddset new mask,sigquit 將訊號sigquit,新增到空訊號集new mask中 if sigprocmask sig block,new mask,old mask 把訊號sigquit給阻塞 sigemptyset zero ...
訊號sigprocmask函式
include int sigprocmask int how,const sigset t restrict set,sigset t restrict oset 返回值 若成功則返回0,若出錯則返回 1首先,若oset是非空指標,那麼程序的當前訊號遮蔽字通過oset返回。其次,若set是乙個非空...
sigprocmask 阻塞程序
1 有時候不希望在接到訊號時就立即停止當前執行,去處理訊號,同時也不希望忽略該訊號,而是延時一段時間去呼叫訊號處理函式。這種情況是通過阻塞訊號實現的。2 訊號阻塞和忽略訊號的區別。阻塞的概念和忽略訊號是不同的。作業系統在訊號被程序解除阻塞之前不會講訊號傳遞出去,被阻塞的訊號也不會影響程序的行為,訊號...