int sigprocmask(int how, const sigset_t *restrict set, sigset_t *restrict oldset);
乙個程序的訊號遮蔽字規定了當前阻塞而不能遞送給該程序的訊號集。sigprocmask()可以用來檢測或改變目前的訊號遮蔽字,其操作依引數how來決定,如果引數oldset不是null
指標,那麼目前的訊號遮蔽字會由此指標返回。如果set是乙個非空指標,則引數how指示如何修改當前訊號遮蔽字。每個程序都有乙個用來描述哪些訊號遞送到程序時將被阻塞的訊號集,該訊號集中的所有訊號在遞送到程序後都將被阻塞。
引數how:
sig_block
該程序新的訊號遮蔽字是其當前訊號遮蔽字和set指向訊號集的並集。set包含了我
們希望阻塞的附加訊號。
sig_unblock
該程序新的訊號遮蔽字是其當前訊號遮蔽字和set所指向訊號集的補集的交集。set包含了
我們希望解除阻塞的訊號.
sig_setmask
該程序新的訊號遮蔽是set指向的值
除sig_setmask外,如果set是個空指標,則不改變該程序的訊號遮蔽字,how的值也無意義。
sig_setmask與set空指標結合使用,即清空所有遮蔽的訊號。
執行成功返回0,失敗返回-1。
efault
引數set,oldset指標位址無法訪問
eintr
此呼叫被中斷
對程序訊號掩碼進行處理。
sigfillset()用來將引數set訊號集初始化,然後把所有的訊號加入到此訊號集裡即將所有的訊號標誌位置為1,遮蔽所有的訊號。它是乙個巨集實現,如下所示:
#define sigfillset(ptr) ( *(ptr) = ~(sigset_t)0, 0)
因為函式sigfillset必須返回0,所以使用c語言裡面的逗號運算子,它將逗號運算子後的值做為
表示式的值返回。函式在執行成功時則返回0;如果有錯誤則返回-1,並設定errno的值,如果errno的值為efault,則表示引數set
指標位址無法訪問。
Linux程序訊號 訊號處理
一 訊號相關概念 1.實際執行訊號的處理動作稱為訊號遞達 delivery 2.訊號從產生到遞達之間的狀態稱為訊號未決 pending 不一定會立即delivery 3.程序可以選擇阻塞 block 某個訊號。不會遞達 4.被阻塞的訊號產生時將保持在未決狀態,知道程序解除對此訊號 的阻塞,才會執行遞...
linux訊號掩碼
1.linux內部用乙個128個位元組 多個unsigned long 的結構 sigset t 表示訊號的掩碼,在i386平台上就是128 4 32個long,每位對應乙個訊號的掩碼,最大支援128 8 1024 個訊號。現在只有64個訊號,所以只要考慮最前面的兩個long就可以了。sigset ...
程序對訊號的處理
朱老師物聯網大講堂 學習筆記 signal函式,處理訊號,include typedef void sighandler t int sighandler t signal int signum,sighandler t handler include include include typedef...