admin管理员组文章数量:1642444
本文由我司收集整编,推荐下载,如有疑问,请与我司联系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]之间的实时信号,优先级
版权声明:本文标题:deliver用法linux,【IT专家】Linux signal 那些事儿(4)信号的deliver顺序 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dongtai/1729331275a1196423.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论