sigprocmask()

用於改變進程的當前阻塞信號集,也可以用來檢測當前進程的信號掩碼。

基本介紹

  • 名稱:sigprocmask()
  • 性質:用於改變進程的當前阻塞信號集
  • 頭檔案:#include<signal.h>
  • 用途:檢測或改變目前的信號禁止字
  • 返回值:執行成功返回0,失敗返回-1
  • 錯誤代碼:EFAULT EINTR
頭檔案,函式原型,函式說明,返回值,錯誤代碼,範例,

頭檔案

#include<signal.h>

函式原型

int sigprocmask(int how, const sigset_t *restrict set, sigset_t *restrict oldset);

函式說明

一個進程的信號禁止字規定了當前阻塞而不能遞送給該進程的信號集。sigprocmask()可以用來檢測或改變目前的信號禁止字,其操作依參數how來決定,如果參數oldset不是NULL指針,那么目前的信號禁止字會由此指針返回。如果set是一個非空指針,則參數how指示如何修改當前信號禁止字。每個進程都有一個用來描述哪些信號遞送到進程時將被阻塞的信號集,該信號集中的所有信號在遞送到進程後都將被阻塞。
參數how的取值不同,帶來的操作行為也不同,該參數可選值如下:
1.SIG_BLOCK: 該值代表的功能是將newset所指向的信號集中所包含的信號加到當前的信號掩碼中,作為新的信號禁止字。
2.SIG_UNBLOCK:將參數newset所指向的信號集中的信號從當前的信號掩碼中移除。
3.SIG_SETMASK:設定當前信號掩碼為參數newset所指向的信號集中所包含的信號。
注意事項:sigprocmask()函式只為單執行緒的進程定義的,在多執行緒中要使用pthread_sigmask變數,在使用之前需要聲明和初始化。

返回值

執行成功返回0,失敗返回-1。

錯誤代碼

EFAULT
參數set,oldset指針地址無法存取
此調用被中斷

範例

實例一:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
main()
{
sigset_t *set;
set=(sigset_t*)malloc(sizeof(set));
sigaddset(set,SIGINT);
sigprocmask(SIG_SETMASK,set,NULL);
while(1);
return 0;
}
實例二:
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
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(&newmask);
sigaddset(&newmask, SIGINT-1);
if (sigprocmask(SIG_BLOCK, &newmask, &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;
}

相關詞條

熱門詞條

聯絡我們