deliver用法linux,【IT专家】Linux signal 那些事儿(4)信号的deliver顺序

本文由我司收集整编,推荐下载,如有疑问,请与我司联系Linux signal 那些事儿(4)信号的deliver顺序2014/10/24 0 Linux signal 那些事儿(4)信号的deliver顺序2014-01-18 14:12:18分类:LINUX

上一篇博文提到了,如果同时有多个不同的信号处于挂起状态,kernel如何选择deliver那个信号。next_signal 负责从挂起信号中选择deliver的signo:当然,有线程显存私有的penging,有线程组共有的pending,对于线程而言,先从自己私有的pending中选,处理完毕私有的才会去处理线程组共有的pending,这个逻辑的代码在:intdequeue_signal(struct

task_struct*tsk,sigset_t*mask,siginfo_t*info){intsignr;/*We only dequeueprivatesignals from ourselves,we don’tlet*signalfd steal them*/signr=__dequeue_signal( tsk- pending,mask,info); //线程私有的penging优先if(!signr){signr=__dequeue_signal( tsk- signal- shared_pending,mask,info);。。。。} 换句话说,如果存在挂起队列中,我们用tkill/tgkill发送的信号会先于用kill发送的信号被deliver,这个我们按下不提,我们看在同一个penging队列中如何挑选下个deliver的signal:intnext_signal(struct sigpending*pending,sigset_t*mask){unsigned long i,*s,*m,x;intsig=0;s=pending- signal.sig;m=mask- sig;/**Handle the first word specially:it contains the*synchronous signals that needtobe dequeued first.*/x=*s ~*m;if(x){if(x SYNCHRONOUS_MASK)x =SYNCHRONOUS_MASK;sig=ffz(~x) 1;return sig;}switch(_NSIG_WORDS){default:for(i=1;i _NSIG_WORDS; i){x=* s ~* m;if(!x)continue;sig=ffz(~x) i*_NSIG_BPW 1;break;}break;case2:x=s[1] ~m[1];if(!x)break;sig=ffz(~x) _NSIG_BPW 1;break;case1:/*Nothingtodo*/break;}return sig;}#define

SYNCHRONOUS_MASK\(sigmask(SIGSEGV)|sigmask(SIGBUS)|sigmask(SIGILL)|\ sigmask(SIGTRAP)|sigmask(SIGFPE)|sigmask(SIGSYS)) 上一篇博客讲了处于SYNCHRONOUS_MASK里面的信号是优先处理的信号,他们都是一些硬件相关的信号,多是由于异常出错引起。其次是传统信号,[32,64]之间的实时信号,优先级

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值