gpt4 book ai didi

linux - 屏蔽信号是否丢失或放入队列?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:03:14 26 4
gpt4 key购买 nike

如果我设置一个信号处理程序(对于 SIGCHLD)带有 sigaction 而没有 SA_NODEFER 并且进程在处理程序内部再次接收到相同的信号,第二个信号会丢失还是会在处理程序返回时传递?

最佳答案

从历史上看,信号可能会丢失。最初,这只是一个缺少的编程接口(interface),因为 sigactionsigprocmask 不存在,所以为了暂时停止传递信号,您必须使用 signal 函数与 SIG_IGN,当然在 SIG_IGN 激活期间,如果信号在此期间到达,那么任何信号都会消失。

使用 sigprocmask(以及通过 sigaction 安装的信号处理程序的明确语义),信号可以变为未决状态,内核会记录信号可用的事实,而无需实际上交付它。只有信号被解除阻塞(或显式解除阻塞)后,它才会被消耗。

但是,挂起信号不仅仅是简单的计数器(针对每个信号),而且还携带其他信息,例如发送 PID 和信号值(如果信号是使用 sigqueue 生成的) .这意味着如果要对任意数量的信号进行排队,内核实际上必须分配内存。 Linux 仅对实时信号执行此操作。对于可以排队的信号数量,每个用户都有一个限制,RLIMIT_SIGPENDING:

$ ulimit -a | grep sign
pending signals (-i) 47913

参见 signal(7)了解详情。

非实时信号不会以这种方式排队。一个进程将只观察第一个变为挂起的信号。从某种意义上说,后续信号可能看起来丢失,但至少有一个信号传递,因此这与原始的SIG_IGN竞争条件不同。

对于某些非实时信号,例如SIGCHLDSIGIO,它们可能看起来像是在排队,但这是因为它们针对特定的对象生成一次事件(绑定(bind)到一些现有的内核资源,例如进程),并且在信号被阻塞时可能会发生多个此类事件。

另见 this earlier answer .

关于linux - 屏蔽信号是否丢失或放入队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54195032/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com