生活随笔
收集整理的這篇文章主要介紹了
sigprocmask 阻塞进程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本系列文章由muge0913編寫,轉載請注明出處:http://blog.csdn.net/muge0913/article/details/7334771
1、有時候不希望在接到信號時就立即停止當前執行,去處理信號,同時也不希望忽略該信號,而是延時一段時間去調用信號處理函數。這種情況是通過阻塞信號實現的。
?
2、信號阻塞和忽略信號的區別。
阻塞的概念和忽略信號是不同的。操作系統在信號被進程解除阻塞之前不會講信號傳遞出去,被阻塞的信號也不會影響進程的行為,信號只是暫時被阻止傳遞。當進程忽略一個信號時,信號會被傳遞出去但進程會將信號丟棄。
?
3、信號阻塞系統調用,它們的都起到阻塞的作用,它們不是協作使用的。
[cpp]?view plaincopyprint?
#include?<signal.h>?? ?? int?sigprocmask(ubt?how,const?sigset_t*set,sigset_t?*oldset);?? ?? int?sigsuspend(const?sigset_t*sigmask);??
sigprocmask設定對信號屏蔽集內的信號的處理方式(阻塞或不阻塞)。
參數:
how:用于指定信號修改的方式,可能選擇有三種
SIG_BLOCK//將set所指向的信號集中包含的信號加到當前的信號掩碼中。即信號掩碼和set信號集進行或操作。
SIG_UNBLOCK//將set所指向的信號集中包含的信號從當前的信號掩碼中刪除。即信號掩碼和set進行與操作。
SIG_SETMASK?//將set的值設定為新的進程信號掩碼。即set對信號掩碼進行了賦值操作。
?
set:為指向信號集的指針,在此專指新設的信號集,如果僅想讀取現在的屏蔽值,可將其置為NULL。
oldset:也是指向信號集的指針,在此存放原來的信號集。可用來檢測信號掩碼中存在什么信號。
返回說明:
成功執行時,返回0。失敗返回-1,errno被設為EINVAL。
?
sigprocmask示例(演示添加信號掩碼):
[cpp]?view plaincopyprint?
#include?<stdio.h>?? #include?<signal.h>?? void?checkset();?? ?? void?main()?? {?? ?????sigset_tblockset;?? ?????sigemptyset(&blockset);?? ?????sigaddset(&blockset,SIGINT);?? ?????sigaddset(&blockset,SIGTSTP);?? ?? ?????checkset();?? ?? ?????sigprocmask(SIG_SETMASK,&blockset,NULL);?? ?????checkset();?? ?? ?????sigaddset(&blockset,SIGTERM);?? ?????sigprocmask(SIG_BLOCK,&blockset,NULL);?? ?????checkset();?? ?? ?????sigdelset(&blockset,SIGTERM);?? ?????sigprocmask(SIG_UNBLOCK,&blockset,NULL);?? ?????checkset();?? }?? ?? void?checkset()?? {?? ?? ?????sigset_tset?set;?? ?????printf("checksetstart:\n");?? ?? ?????if(sigprocmask(0,NULL,&set)<0)?? ?????{?? ?????printf("checksetsigprocmask?error!!\n");?? ?????exit(0);?? ?????}?? ?? ?????if(sigismember(&set,SIGINT))?? ?????printf("sigint\n");?? ?????if(sigismember(&set,SIGTSTP))?? ?????printf("sigtstp\n");?? ?? ?????if(sigismember(&set,SIGTERM))?? ?????printf("sigterm\n");?? ??????printf("checksetend\n");?? }??
sigprocmask示例(演示添某部分代碼不被信號打攪):
?
[cpp]?view plaincopyprint?
#include?<stdio.h>?? #include?<signal.h>?? void?checkset();?? ?? void?func();?? void?main()?? {?? ?????sigset_tblockset,oldblockset,pendmask;?? ?????printf("pid:%ld\n",(long)getpid());?? ?? ?????signal(SIGINT,func);??? ?? ????sigemptyset(&blockset);??? ????sigaddset(&blockset,SIGTSTP);??? ????sigaddset(&blockset,SIGINT);?? ?? ???sigprocmask(SIG_SETMASK,&blockset,&oldblockset);??? ?? ??????? ????checkset();?? ????sleep(5);?? ?????sigpending(&pendmask);??? ?????if(sigismember(&pendmask,SIGINT))??? ?????????printf("SIGINTpending\n");?? ?? ??????? ?? ?????sigprocmask(SIG_SETMASK,&oldblockset,NULL);??? ?????printf("SIGINTunblocked\n");?? ?????sleep(6);?? }?? ?? void?checkset()?? {?? ?????sigset_tset;?? ?????printf("checksetstart:\n");?? ?????if(sigprocmask(0,NULL,&set)<0)?? ?????{?? ?????printf("checksetsigprocmask?error!!\n");?? ?????exit(0);?? ?????}?? ?????if(sigismember(&set,SIGINT))?? ?????printf("sigint\n");?? ?? ?????if(sigismember(&set,SIGTSTP))?? ?????printf("sigtstp\n");?? ?? ?????if(sigismember(&set,SIGTERM))?? ?????printf("sigterm\n");?? ?? ?????printf("checksetend\n");?? ?? }?? void?func()?? {?? ?????printf("hellofunc\n");?? }??
?
總結
以上是生活随笔為你收集整理的sigprocmask 阻塞进程的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。