Posted on 2009-11-17 19:55
Prayer 閱讀(1897)
評論(0) 編輯 收藏 引用 所屬分類:
LINUX/UNIX/AIX
功能描述:
設定對信號屏蔽集內的信號的處理方式(阻塞或不阻塞)。
用法:
#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阻塞掉,并保存當前信號屏蔽字
sleep (5);//休眠5秒鐘
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);
以上示例是APUE P260,
執行結果是
$./a.out
^\
SIGQUIT pending
caught SIGQUIT 在sigprocmask返回之前處理阻塞信號SIGQUIT,輸出它
SIGQUIT unblocked
^\Quit (coredump)//因為已經被設置為缺省值,所以再次產生SIGQUIT信號,直接退出