关于标准信号的传递

Je *_*Rog 5 c linux signals

相反,如果在该信号当前被阻止的情况下传送标准信号的多个实例,则只有一个实例排队.

我认为上面的描述并不那么明确,并且对我造成了歧义:

如果特定信号没有被阻止,那么同一信号的多个实例会排队吗?

排队的信号在哪里,特定于流程的位置或全球位置?

如何处理排队的信号,是否有可能同时处理两个信号,或者保证信号将被逐个处理?

所以这里实际上是3个问题..

Jas*_*son 8

如果特定信号没有被阻止,那么同一信号的多个实例会排队吗?

这取决于SA_SIGINFO标志是否已经被设置为使用该信号sigaction的结构和sigaction()功能,并且您的系统是否具有_POSIX_REALTIME_SIGNALS一个有效的定义(现代Linux内核做).如果这两种情况下都为真,则该适合这两个条件中的任意到达的信号将在每个进程队列中排队,直到它们被递送或接受最多由操作系统用于在给定的信号的队列项的数量所施加的限制.在那之后,到达该信号类型的任何其他信号都被丢弃.

如果这些情况中的任何一个不成立,则仅处理当前到达的信号,并且丢弃当前信号处理器正在运行时到达的相同信号类型的任何其他信号.此外,如果您阻止信号,并且两个或更多信号到达过程并且未被传递,则它们被合并为单个信号事件.但同样,只有在不满足上述两个条件的情况下才会这样做......否则会将相同类型的多个信号事件排队.

还有一点需要注意......所述的两个条件是针对POSIX规范,但是Linux将排队任何实时信号,即使没有为该信号设置SA_SIGINFO.这意味着任何对应于SIGRTMIN和SIGRTMAX范围的信号.

排队的信号在哪里,特定于流程的位置或全球位置?

它存储在每个进程队列中.

如何处理排队的信号,是否有可能同时处理两个信号,或者保证信号将被逐个处理?

这取决于您如何使用sigaction结构和sigaction()功能设置信号处理程序.在信号处理程序运行时,无法保证阻止任何其他信号.有一个信号掩码可以在sigaction结构内设置,确定信号处理程序运行时阻塞的信号.信号本身被阻塞,直到信号处理程序完成,但如果没有被为结构中设置的信号处理程序设置的信号掩码阻止,则不同的信号可以中断当前的信号处理程序sigaction.因此,您在信号处理程序中执行的任何操作都应该是异步安全的,并且您不应该在信号处理程序中调用任何非异步安全函数,例如fprintf(),等等.因此可以保证信号本身按FIFO顺序处理(即,信号不会自动中断),但如果您没有故意阻止它们,其他信号可能会中断您当前的信号处理程序.请记住,在信号处理程序中设置信号掩码以试图阻止其他信号中断处理程序是一个非常糟糕的主意,并且不是原子操作,所以不要这样做.如果您希望在信号处理程序运行时阻止其他信号,请在sigaction传递给的结构中提供信号掩码sigaction().