sigprocmask, sigpending, sigsuspend的用法
sigset_t set
sigemptyset(&set) :清空阻塞信號集合變量
sigfillset(&set)?:添加所有的信號到阻塞集合變量里
sigaddset(&set,SIGINT):添加單一信號到阻塞信號集合變量
sigdelset(&set,SIGINT):從阻塞信號集合變量中刪除單一信號
?
void handler(int sig)????//信號處理函數(shù)的實(shí)現(xiàn)
{
???printf("SIGINT sig");
}
?
?
功能:返回在阻塞期間接收到阻塞信號的集合。
?{
??????? sigset_t set;???????????? //定義阻塞信號集的變量
??????? sigemptyset(&set);??????? //清空變量set的阻塞信號
??????? sigaddset(&set,SIGINT);?? //添加將要阻塞的信號"SIGINT"到阻塞信號集變量
??????? sigdelset(&set,SIGINT);?? //從已有的阻塞信號集變量中刪除阻塞信號"SIGINT"
??????? sigaddset(&set,SIGQUIT);? //添加將要阻塞的信號"SIGQUIT"到阻塞信號集變量
??????? sigprocmask(SIG_SETMASK,&set,NULL);// 將當(dāng)前的阻塞信號集合變量set設(shè)置為該進(jìn)程信號阻塞列表
??????? while(1);???????????????? //
??????? return 0;
}
?
?
sigpending 函數(shù):
?
printf( "set is %8.8ld.\n", set );
??? sigpending( &pset );
??? printf( "Pending set is %8.8ld.\n", pset );
??? kill( getpid(), SIGINT );
??? sigpending( &pset );
??? printf( "Pending set is %8.8ld.\n", pset );
??? kill( getpid(), SIGQUIT );
??? sigpending( &pset );
??? printf( "Pending set is %8.8ld.\n", pset );
?
sigsuspend函數(shù)(感覺場景不太普遍)
功能:它有一套屬于自己的屏蔽信號mask,能夠選擇性接收某些信號。在接收到可行信號(也即是沒有被屏蔽的信號)之前,運(yùn)行到它時,它會一直懸掛著,有點(diǎn)類似pause()函數(shù)。接受到可行信號后,它會退出懸掛并執(zhí)行相應(yīng)的信號函數(shù)。接收到的信號源:1.之前運(yùn)行sigprocmask()函數(shù)中阻塞的信號;2.懸掛后接受到的信號。
?
sigsuspend的整個原子操作過程為:
(1) 設(shè)置新的mask阻塞當(dāng)前進(jìn)程;
(2) 收到信號,恢復(fù)原先mask;
(3) 調(diào)用該進(jìn)程設(shè)置的信號處理函數(shù);
(4) 待信號處理函數(shù)返回后,sigsuspend返回。
?
sleep也是用sigsuspend實(shí)現(xiàn)的。
?
http://blog.csdn.net/elbort/article/details/7594772
?
?
http://blog.csdn.net/todd911/article/details/17319591
?
總結(jié)
以上是生活随笔為你收集整理的sigprocmask, sigpending, sigsuspend的用法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL 强制指定索引加快查询速度
- 下一篇: fragment和Activity同时操