頭檔案
#include函式原型
int sigprocmask(int how, const sigset_t *restrict set, sigset_t *restrict oldset);函式說明
一個進程的信號禁止字規定了當前阻塞而不能遞送給該進程的信號集。sigprocmask()可以用來檢測或改變目前的信號禁止字,其操作依參數how來決定,如果參數oldset不是NULL 指針,那么目前的信號禁止字會由此指針返回。如果set是一個非空指針,則參數how指示如何修改當前信號禁止字。每個進程都有一個用來描述哪些信號遞送到進程時將被阻塞的信號集,該信號集中的所有信號在遞送到進程後都將被阻塞。參數how:
如果set是個空指針,則不改變該進程的信號禁止字,how的值也無意義。
返回值
執行成功返回0,失敗返回-1。錯誤代碼
EFAULT | 參數set,oldset指針地址無法存取 |
EINTR | 此調用被中斷 |
範例
實例一:#include
#include
#include
main()
{
sigset_t *set;
set=(sigset_t*)malloc(sizeof(set));
sigemptyset(set);
sigaddset(set,SIGINT);
sigprocmask(SIG_SETMASK,set,NULL);
while(1);
return 0;
}
實例二:
#include
#include
#include
void sig_int(int signo) /* 信號處理函式 */
{
printf("\nreceived SIGINT!\n");
exit(0);
}
int main()
{
sigset_t newmask, oldmask;
if (signal(SIGINT, sig_int) == SIG_ERR) /* 綁定信號 */
perror("signal(SIGINT) error!");
sigemptyset(≠wmask);
sigaddset(≠wmask, SIGINT);
if (sigprocmask(SIG_BLOCK, ≠wmask, &oldmask) < 0) /* 禁止newmask,將當前的保存到oldmask */
perror("sigprocmask(SIG_BLOCK) error!");
sleep(3); /* 休眠3秒 */
if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0) /*恢復成oldmask */
perror("sigprocmask(SIG_SETMASK) error!");
return 0;
}