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