sigprocmask函數

功能描述:設定對信號屏蔽集內的信號的處理方式(阻塞或不阻塞)。
用法:
#include <signal.h>
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
參數:
how:用於指定信號修改的方式,可能選擇有三種

SIG_BLOCK //加入信號到進程屏蔽。
SIG_UNBLOCK //從進程屏蔽裏將信號刪除。
SIG_SETMASK //將set的值設定爲新的進程屏蔽。

set:爲指向信號集的指針,在此專指新設的信號集,如果僅想讀取現在的屏蔽值,可將其置爲NULL。
oldset:也是指向信號集的指針,在此存放原來的信號集。
返回說明:
成功執行時,返回0。失敗返回-1,errno被設爲EINVAL。
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
//#include <>

static void sig_quit(int signo)
{
printf("caught SIGQUIT\n");
signal(SIGQUIT, SIG_DFL);//將SIGQUIT的動作設爲缺省值
}
int main()
{
sigset_t newmask;
sigset_t oldmask;
sigset_t pendmask;

signal(SIGQUIT, sig_quit);//信號量捕捉函數,捕捉到SIGQUIT,跳轉到函數指針sig_quit處執行

sigemptyset(&newmask);//初始化信號量集
sigaddset(&newmask, SIGQUIT);//將SIGQUIT添加到信號量集中

sigprocmask(SIG_BLOCK, &newmask, &oldmask);//將newmask中的SIGQUIT阻塞掉,並保存當前信號屏蔽字到Oldmask

sleep (5);//休眠5秒鐘,這裏做說明:在5s休眠期間,任何SIGQUIT信號都會被阻塞,如果在5s內收到任何鍵盤的quit信號,則此時會把這些信息存在內核的隊列中,等待5s結束後,可能要處理此信號。
sigpending(&pendmask);//檢查信號是懸而未決的,if (sigismember(&pendmask, SIGQUIT))//SIGQUIT是懸而未決的。所謂懸而未決,是指SIGQUIT被阻塞還沒有被處理
{
printf("\nSIGQUIT pending\n");
}
sigprocmask(SIG_SETMASK, &oldmask, NULL);//恢復被屏蔽的信號SIGQUIT

/**開始處理信號,調用信號處理函數*/
printf("SIGQUIT unblocked\n");

sleep(5);//再次休眠5秒鐘

return (0);

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章