日期:2014-05-16  浏览次数:20582 次

信号可靠还是不可靠,取决与信号本身还是signal()/sigaction()的区别?
1-31号信号,不支持排队,会丢失,所以是不可靠信号,即使用sigaction函数系列来处理也不行?

是不是说,"可靠"和"不可靠"是按照信号的数字来划分的,34-64是可靠信号。
可靠信号不论用signal函数来处理还是用sigaction来处理,都是"可靠的",不会丢失不会有什么问题?

但是为什么有很多人又说,可靠和不可靠的区分,不是在于信号本身,而是在于signal/sigaction的区别呢?

我很疑惑了,请指点指点我哈!

------解决方案--------------------
The SVR4 sigaction(2) manual page in AT&T [1990e] claims that the SA_SIGINFO flag (Figure 10.16) causes signals to be reliably queued. This is wrong. Apparently, this feature was partially implemented within the kernel, but it is not enabled in SVR4. Curiously, the SVID doesn't make the same claims of reliable queuing.
--摘自APUE
------解决方案--------------------
一般情况下信号都不会queue,这个和信号本身无关,和系统有关(是否支持 实时信号扩展)。
信号可靠与否应该是和处理方式有关的, 用 signal()处理的话, signal handler 返回后,这个信号的处理就被重置到默认状态,所以需要重新调用 signal()设置信号处理函数(signal handler);如果恰好信号在这个时间段发生,就会按照默认的方式处理,比如终止程序。 sigaction()则没有这个问题,用这个函数设置的信号处理函数会一直有效。
APUE对此有详细的描述。