sigprocmask系統調用

【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>
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);ui

}
以上示例是Linux redhat,
執行結果是
$./a.out
^/                        /**此處使用"CTRL+/" 產生SIGQUIT */ 
SIGQUIT pending
caught SIGQUIT 在sigprocmask返回以前處理阻塞信號SIGQUIT,輸出它
SIGQUIT unblocked
^/Quit (coredump)//由於已經被設置爲缺省值,因此再次產生SIGQUIT 信號,直接退出spa

相關文章
相關標籤/搜索