sigprocmask函數:
功能描述:
設定對信号屏蔽集内的信号的處理方式(阻塞或不阻塞)。
用法:
#include <signal.h>
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
NOTE: If oldset is non-null, the previous value of the signal mask is stored in oldset.
參數:
how:用于指定信号修改的方式,可能選擇有三種
SIG_BLOCK //加入信号到程序屏蔽。
SIG_UNBLOCK //從程序屏蔽裡将信号删除。
SIG_SETMASK //将set的值設定為新的程序屏蔽。
相應函數指令:
sigset_t set
sigemptyset(&set) :清空阻塞信号集合變量
sigfillset(&set) :添加所有的信号到阻塞集合變量裡
sigaddset(&set,SIGINT):添加單一信号到阻塞信号集合變量
sigdelset(&set,SIGINT):從阻塞信号集合變量中删除單一信号
sigismember(&set,int signum):這個函數測試信号signum是否包含在信号集合set中,如果包含傳回1,不包含傳回0,出錯傳回-1。錯誤代碼也隻有一個EINVAL,表示signum不是有效的信号代碼。
sigpending 函數:
功能:傳回在阻塞期間接收到阻塞信号的集合。
#include"apue.h"
static void sig_quit(int);
int main(void)
{
sigset_t newmask,oldmask,pendmask;
if(signal(SIGQUIT,sig_quit)==SIG_ERR)
err_sys("cant catch SIGQUIT");//對SIGQUIT阻塞,儲存目前信号屏蔽字
sigemptyset(&newmask);
sigaddset(&newmask,SIGQUIT);
if(sigprocmask(SIG_BLOCK,&newmask,&oldmask)<0)
err_sys("SIG_BLOCK error");
sleep(5);//SIGQUIT目前還是未決狀态
if(sigpending(&pendmask)<0)
err_sys("sigpending error");
if(sigismember(&pendmask,SIGQUIT))
printf("\nSIGQUIT pending\n");
if(sigprocmask(SIG_SETMASK,&oldmask,NULL)<0)
err_sys("SIG_SETMASK error");
printf("SIGQUIT unblocked\n");
sleep(5);//SIGQUIT will terminate with core file
exit(0);
}
static void sig_quit(int signo)
{
printf("caught SIGQUIT\n");
if(signal(SIGQUIT,SIG_DFL)==SIG_ERR)
{
err_sys("cant reset SIGQUIT");
}
}
在休眠期間如果産生了退出信号,此時該信号是未決的,但是不再阻塞。
然後該程序再休眠五秒,此期間在産生退出信号,此時信号處理方式為預設動作,這一次會是程序終止。
