1.在POSIX标准中,当进程收到信号时,如果是多线程的情况,我们是无法确定是哪一个线程处理这个信号。而sigwait是从进程中pending的信号中,取走指定的信号。这样的话,如果要确保sigwait这个线程收到该信号,那么所有线程含主线程以及这个sigwait线程则必须block住这个信号。否则如果在两次sigwait之间,收到了指定信号,该信号很有可能被任意一个线程处理掉。
2.sigwait的名字以及在man中的介绍容易引起人的误解。
1)sigwait,从名字上看只等待指定信号集。这样很容易让人感觉除指定信号外,其他信号不会促使sigwait的返回;
2)来看看man中的说明The sigwait() function suspends execution of the calling thread until the delivery of one of the signals specified in the signal set set.这里也说了,sigwait会一直suspend直到指定信号发生。另外,man中的errors说明也容易引起误解。man中只有一个错误,就是EINVAL,给人感觉sigwait不会被信号中断。
ERRORS
EINVAL set contains an invalid signal number.
(我的系统是FC12)
但是按照我一直以来的经验,基本上所有的阻塞操作都会被信号中断,除非设置了RESTART标志。所有我建议同事加了以上的代码。
后来看到man中还有这么一句,
NOTES
sigwait() is implemented using sigtimedwait(2).
于是又查看了sigtimedwait。发现sigtimedwait的手册还是比较完整的。
ERRORS
EAGAIN No signal in set was delivered within the timeout period specified to sigtimedwait().
EINTR The wait was interrupted by a signal handler; see signal(7). (This handler was for a signal other than one of those in set.)