sigwaitinfo
可以通过如何结合信号处理器和 sigsuspend()来挂起一个进程的执行,直至传来一个
信号。但是更方面的做法是可以利用 sigwaitinfo()系统调用来同步接收信号
SYNOPSIS
#include <signal.h>
int sigwaitinfo(const sigset_t *set, siginfo_t *info);
sigwaitinfo()系统挂起进程的执行,直到set指向信号集中的某一信号抵达。如果调用sigwaitinfo()时,set中的某一信号已经处于等待状态,那么sigwaitinfo()将立即返回。传递来的信号就此从进程的等待信号队列中移除,并且将信号编号返回作为函数结果。info参数如果不为null,则会指向经过初始化处理的 siginfo_t 结构,其中所含信息与提供给信号处理器函数的 siginfo_t 参数相同
sigwaitinfo()所接收信号的传递顺序和排队特性与信号处理器所捕获的信号相同,就是说,不对标准信号进行排队处理,对实时信号进行排队处理,并且对实时信号的传递遵循低编号优先的原则。
除了卸去编写信号处理器的负担之外,使用 sigwaitinfo()来等待信号也要比信号处理器外加sigsuspend()的组合要稍快一些
将对 set 中信号集的阻塞与调用 sigwaitinfo()结合起来,这当属明智之举。(即便某一信号
遭到阻塞,仍然可以使用 sigwaitinfo()来获取等待信号。)如果没有这么做,而信号在首次调用 sigwaitinfo()之前,或者两次连续调用 sigwaitinfo()之间到达,那么对信号的处理将只能依照其当前处置。
SUSv3 规定,调用 sigwaitinfo()而不阻塞 set 中的信号将导致不可预知的行为(其行为未定义
sigtimedwait
sigtimedwait()系统调用是 sigwaitinfo()调用的变体。唯一的区别是 sigtimedwait()允许指定
等待时限。
SYNOPSIS
#include <signal.h>
int sigtimedwait(const sigset_t *set, siginfo_t *info,
const struct timespec *timeout);
timeout 参数指定了允许 sigtimedwait()等待一个信号的最大时长,是指向如下类型结构的一枚指针:
struct timespec {
long tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
}
填写 timespec 结构的所属字段,也就指定了允许 sigtimedwait()等待的最大秒数和纳秒数。如果将这两个字段均指定为 0,那么函数将立刻超时
如果将 timeout 参数指定为 NULL,那么 sigtimedwait()将完全等同于 sigwaitinfo()。SUSv3对于 timeout 的 NULL 值含义也语焉不详,而某些 UNIX 实现则将该值视为轮询请求并立即将其返回