本節主要介紹使用sigprocmask函數來人工設定訊號阻塞。首先介紹函數原型:
/* Get and/or change the set of blocked signals. */extern int sigprocmask (int __how, __const sigset_t *__restrict __set, sigset_t *__restrict __oset) __THROW;
1)函數參數說明:
__how: 輸入參數,設定訊號阻塞掩碼的方式。可以包括3中掩碼設定,分別是阻塞訊號的SIG_BLOCK,接觸阻塞的SIG_UNBLOCK, 設定阻塞掩碼的SIG_SETMASK。
__set: 輸入參數,阻塞訊號集。當參數__how為SIG_BLOCK時,該參數標明要阻塞的訊號集。當__how參數為SIG_UNBLOCK時,該參數解除阻塞的訊號集。當__how參數為SIG_SETMASK時,該參數標明要阻塞的訊號集。
__oset: 輸出參數,原阻塞訊號集。調用成功後,將返回該進程原阻塞訊號集。
2)傳回值說明:
0: 調用成功;
-1: 調用失敗,可以通過errno擷取詳細資料。
樣本:
#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <signal.h>voidhandle_sigint(int signo){ printf("receive signal %d\n", signo);}intmain(void){ sigset_t mask; sigset_t omask; signal(SIGINT, handle_sigint); sigemptyset(&mask); sigaddset(&mask, SIGINT); sigprocmask(SIG_BLOCK, &mask, &omask); sleep(10); sigprocmask(SIG_SETMASK, &omask, NULL); exit(0);}
運行結果:
[root@localhost linuxc]# ./mysigprocmask <-按下<CTRL>+<C> 進程無返回,說明訊號被阻塞。receive signal 2 10秒休眠結束後,進程收到訊號 (訊號被重新發送)