訊號sigprocmask函式

2021-10-06 16:51:00 字數 2251 閱讀 4796

#include int sigprocmask( int how, const sigset_t *restrict set, sigset_t *restrict oset );

返回值:若成功則返回0,若出錯則返回-1

首先,若oset是非空指標,那麼程序的當前訊號遮蔽字通過oset返回。

其次,若set是乙個非空指標,則引數how指示如何修改當前訊號遮蔽字。

how說明

sig_block

該程序新的訊號遮蔽字是其當前訊號遮蔽字和set指向訊號集的並集。set包含了我們希望阻塞的附加訊號

sig_unblock

該程序新的訊號遮蔽字是其當前訊號遮蔽字和set所指向訊號集補集的交集。set包含了我希望解除阻塞的訊號

sig_setmask

該程序新的訊號遮蔽字將被set指向的訊號集的值代替

如果set是空指標,則不改變該程序的訊號遮蔽字,how的值也無意義。

直接通過**

#include #include //malloc 

#include #include //訊號處理函式

void sig_quit(int signo)

else

//在設定回預設

if(signal(sigquit,sig_dfl) == sig_err)

}int main(int argc, char *const *ar**)

sigemptyset(&newmask); //newmask訊號集中所有訊號都清0(表示這些訊號都沒有來)

sigaddset(&newmask,sigquit); //設定newmask訊號集中的sigquit訊號位為1,也就是說,再來sigquit訊號時,程序就收不到,設定為1就是該訊號被阻塞掉

printf("我要開始休息10秒了--------begin--\n");

sleep(10); //測試沒有遮蔽的時候處理訊號

printf("我已經休息了10秒了--------end----!\n");

//再次註冊

if(signal(sigquit,sig_quit) == sig_err) //註冊訊號對應的訊號處理函式,"ctrl+\"

if(sigprocmask(sig_block,&newmask,&oldmask) < 0) //第乙個引數用了sig_block表明設定 程序 新的訊號遮蔽字 為 「當前訊號遮蔽字 和 第二個引數指向的訊號集的並集

if(sigismember(&oldmask,sigquit)) //測試乙個指定的訊號位是否被置位(為1),測試的是newmask

else

printf("我再次要開始休息10秒了--------begin--,此時我無法接收sigquit訊號!\n");

sleep(10); //設定阻塞sigquit,無法收到sigquit訊號;

printf("我再次已經休息了10秒了--------end----!\n");

if(sigismember(&newmask,sigquit)) //測試乙個指定的訊號位是否被置位(為1),測試的是newmask

else

if(sigismember(&newmask,sighup)) //測試另外乙個指定的訊號位是否被置位,測試的是newmask

else

sigpending(&pendmask); //檢查訊號是懸而未決的

if(sigismember(&pendmask,sigquit)) //sigquit 是懸而未決的。所謂懸而未決,是指sigquit被阻塞還沒有被處理

printf("sigquit pending\n");

//把訊號集還原回去,之前被阻塞住的訊號會再次得到處理,但是就算之前捕獲了多次也只會觸發一次訊號處理函式

if(sigprocmask(sig_setmask,&oldmask,null) < 0) //第乙個引數用了sigsetmask表明設定程序新的訊號遮蔽字為第二個引數指向的訊號集,第三個引數沒用

printf("sigprocmask(sig_setmask)成功!\n");

if(sigismember(&oldmask,sigquit)) //測試乙個指定的訊號位是否被置位,這裡測試的當然是oldmask

else

}printf("end main!\n");

return 0;

}

訊號之sigprocmask函式

乙個程序的訊號遮蔽字規定了當前阻塞而不能遞送給該程序的訊號集。呼叫函式sigprocmask可以檢測或更改其訊號遮蔽字,或者在乙個步驟中同時執行這兩個操作。include int sigprocmask int how,const sigset t restrict set,sigset t res...

關於訊號sigprocmask

sigemptyset new mask sigaddset new mask,sigquit 將訊號sigquit,新增到空訊號集new mask中 if sigprocmask sig block,new mask,old mask 把訊號sigquit給阻塞 sigemptyset zero ...

sigprocmask阻塞訊號

有時候不希望在接到訊號時就立即停止當前執行,去處理訊號,同時也不希望忽略該訊號,而是延時一段時間去呼叫訊號處理函式 1.訊號阻塞和忽略訊號的區別 作業系統在訊號被程序解除阻塞之前不會將訊號傳遞出去,被阻塞的訊號也不會影響程序的行為,訊號只是暫時被阻止傳遞。當程序忽略乙個訊號時,訊號會被傳遞出去但程序...