sigprocmask()

in t t

頭檔案

#include

函式原型

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指向的值
 如果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;
}

相關詞條

熱門詞條

聯絡我們