当多个信号到达一个进程时,处理这些信号的进程之间的顺序是什么?
使用什么数据结构来存储已到达进程但尚未传递的信号?
例如,来自 APUE
由于当父进程终止时进程组将成为孤立进程,因此 POSIX.1 要求向新孤立进程组中停止的每个进程(就像我们的子进程一样)发送挂起信号 (SIGHUP)其次是继续信号(SIGCONT)
这使得孩子能够继续,after处理挂断信号。这
挂断信号的默认操作是终止进程,所以我们必须
提供一个信号处理程序来捕获信号。因此我们期望 printf 在
sig_hup 函数出现在 pr_ids 函数中的 printf 之前。
As SIGCONT 和 SIGHUP 的顺序发送到孤立的 linux 进程组 https://stackoverflow.com/a/17769300/156458 says:
在子进程恢复执行之前,无法传递 SIGHUP。
当进程停止时,除了
SIGCONT 和 SIGKILL。
所以,SIGHUP 确实到来了first,但无法处理until这
SIGCONT 唤醒进程执行。
SIGHUP
之前到达SIGCONT
在停止的过程中。SIGHUP
无法交付SIGCONT
can be.
Is SIGCONT
之前或之后处理SIGHUP
?第一个引用似乎说“之后”,而第二个引用似乎说“之前”和“直到”。
如果“之前”:
上面是不是基于一些数据结构如FIFO队列或者FILO栈来实现的?
Thanks.
这种情况可能会因不同的实现和 POSIX 实时信号的引入而变得混乱。信号(7) http://man7.org/linux/man-pages/man7/signal.7.html说实时信号与旧式信号的区别在于
实时信号以有保证的顺序传送。多种的
同一类型的实时信号按顺序下发
他们被派去。如果不同的实时信号发送到
过程中,它们从编号最小的开始交付
信号。 (即,编号低的信号具有最高优先级。)
相反,如果一个进程有多个标准信号待处理,
它们的交付顺序未指定。
正如 Bach 的《Unix 操作系统的设计》中描述的旧式信号(在引入 POSIX 实时信号之前)。
为了向进程发送信号,内核会在进程表条目的信号字段中设置一个位,该位与收到的信号类型相对应。 ...当进程从内核模式返回到用户模式时以及当它以适当低的信号优先级离开睡眠状态时,内核检查是否收到信号。
您可以在以下位置查看一些当前的 Linux 数据结构:sched.h https://github.com/torvalds/linux/blob/master/include/linux/sched.h。看着这个,我怀疑旧式位图已经消失,位图和链表的组合用于处理旧式和 POSIX 实时信号,但我还没有浏览足够的代码来确定这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)