POSIX.1定義了數據類型sigset_t來表示或保存多個信號——信號集(signal set),信號掩碼就存放在這些信號集中。POSIX定義了下列5個處理信號集的函數。
int sigemptyset(sigset_t *set) 初始化由set指向的信號集,清除其中所有信號,即設置所有信號掩碼的阻塞標誌
int sigfillset(sigset_t *set) 初始化由set指向的信號集,使其包括所有信號,即清除所有信號掩碼的阻塞標誌
int sigaddset(sigset_t *set, int signo) 將壹個特定信號signo添加到set指向的信號集中,可用於增加個別信號阻塞
int sigdelset(sigset_t *set, int signo) 從set指向的信號集中刪除壹個特定信號signo,可用於刪除個別信號阻塞
int sigismember(const sigset_t *set, int signo) 檢查某個信號是否在set指向的信號集中,可確定特定的信號是否在掩碼中被標誌為阻塞。
另外,進程也可以調用sigprocmask()來檢測和更改其當前的信號掩碼,以便告訴內核不允許觸發該信號集中的信號。其實現代碼在kernel/signal.c中,原型為:
int sigprocmask(int how, const sigset_t *set, sigset_t *oset)
首先,若oset是非空指針,那麽進程的當前信號掩碼通過oset返回。
其次,若set是壹個指向信號集的非空指針,則參數how指示如何修改當前進程的信號掩碼。參數how的取值及含義如下:
SIG_BLOCK 該進程新的信號掩碼是其當前信號掩碼和set所指向信號集的並集,即set規定了我們希望阻塞的附加信號。
SIG_UNBLOCK 該進程新的信號掩碼是其當前信號掩碼和set所指向信號集的補集的交集,即set包含了我們希望解除阻塞的信號。
SIG_SETMASK 該進程新的信號掩碼將被set指向的信號集代替,即set變成該進程新的信號掩碼。
如果set是空指針,則不改變該進程的信號掩碼,how的值也無意義。用壹段代碼來說明這個邏輯:
switch (how) {
case SIG_BLOCK:
current->blocked |= set;
break;
case SIG_UNBLOCK:
current->blocked &= ~set;
break;
case SIG_SETMASK:
current->blocked = set;
break;
default:
return -EINVAL;
}
其中current表示指向當前進程結構的指針,其中包含當前進程的信號掩碼blocked。