一個進程的信號屏蔽字規定了當前阻塞而不能遞送給該進程的信號集。調用函數sigprocmask可以檢測或更改其信號屏蔽字,或者在一個步驟中同時執行這兩個操作。
#include <signal.h> int sigprocmask( int how, const sigset_t *restrict set, sigset_t *restrict oset ); 返回值:若成功則返回0,若出錯則返回-1
首先,若oset是非空指針,那么進程的當前信號屏蔽字通過oset返回。
其次,若set是一個非空指針,則參數how指示如何修改當前信號屏蔽字。
表10-4說明了how可選用的值。注意,不能阻塞SIGKILL和SIGSTOP信號。
表10-4 用sigprocmask更改當前信號屏蔽字的方法
| how |
說明 |
| SIG_BLOCK | 該進程新的信號屏蔽字是其當前信號屏蔽字和set指向信號集的並集。set包含了我們希望阻塞的附加信號 |
| SIG_UNBLOCK | 該進程新的信號屏蔽字是其當前信號屏蔽字和set所指向信號集補集的交集。set包含了我希望解除阻塞的信號 |
| SIG_SETMASK | 該進程新的信號屏蔽字將被set指向的信號集的值代替 |
如果set是空指針,則不改變該進程的信號屏蔽字,how的值也無意義。
在調用sigprocmask后如果有任何未決的、不再阻塞的信號,則在sigprocmask返回前,至少會將其中一個信號遞送給該進程。
sigprocmask是僅為單線程的進程定義的。
程序清單10-10 為進程打印信號屏蔽字中信號的名稱
#include "apue.h" #include <errno.h> void pr_mask(const char *str) { sigset_t sigset; int errno_save; errno_save = errno; /* we can be called by signal handlers */ if (sigprocmask(0, NULL, &sigset) < 0) err_sys("sigprocmask error"); printf("%s", str); if (sigismember(&sigset, SIGINT)) printf("SIGINT "); if (sigismember(&sigset, SIGQUIT)) printf("SIGQUIT "); if (sigismember(&sigset, SIGUSR1)) printf("SIGUSR1 "); if (sigismember(&sigset, SIGALRM)) pritnf("SIGALRM "); /* remaining signals can go here */ printf("\n"); errno = errno_save; }
本篇博文內容摘自《UNIX環境高級編程》(第二版),僅作個人學習記錄所用。關於本書可參考:http://www.apuebook.com/。
