sigwaitinfo(2) - Linux man page
名称
sigwaitinfo, sigtimedwait - 同步等待排队的信号
概要
#include <signal.h> int sigwaitinfo(const sigset_t *set, siginfo_t *info); int sigtimedwait(const sigset_t *set, siginfo_t *info, const struct timespec *timeout);glibc 的功能测试宏要求(参见 feature_test_macros(7))
- sigwaitinfo(), sigtimedwait(): _POSIX_C_SOURCE >= 199309L
描述
sigwaitinfo() 暂停调用线程的执行,直到 set 中的一个信号变为挂起状态。(如果 set 中的一个信号已经为调用线程挂起,sigwaitinfo() 将立即返回。)
sigwaitinfo() 从挂起信号集中移除该信号,并将其信号编号作为函数结果返回。如果 info 参数不为 NULL,则它指向的缓冲区将用于返回一个类型为 siginfo_t 的结构体(参见 sigaction(2)),其中包含关于该信号的信息。
如果 set 中有多个信号为调用者挂起,则 sigwaitinfo() 检索到的信号将根据通常的排序规则确定;有关更多详细信息,请参见 signal(7)。
sigtimedwait() 的操作方式与 sigwaitinfo() 完全相同,除了它有一个额外的参数 timeout,它指定线程在等待信号时暂停的最小时间间隔。(此间隔将被向上舍入到系统时钟粒度,并且内核调度延迟可能导致该间隔超出一点。)此参数的类型如下
-
struct timespec { long tv_sec; /* seconds */ long tv_nsec; /* nanoseconds */ } - 如果此结构的两个字段都指定为 0,则执行轮询:sigtimedwait() 立即返回,要么提供有关调用者挂起的信号的信息,要么如果 set 中的任何信号未挂起则返回错误。
返回值
成功时,sigwaitinfo() 和 sigtimedwait() 都返回一个信号编号(即,大于零的值)。 失败时,这两个调用都返回 -1,errno 设置为指示错误。
错误
- EAGAIN
在 sigtimedwait() 指定的 timeout 期间内,set 中的没有信号变为挂起。
EINTR
等待被信号处理程序中断;参见 signal(7)。 (此处理程序是针对 set 中未包含的信号。)
EINVAL
timeout 无效。
符合
POSIX.1-2001。
说明
在正常使用情况下,调用程序通过先前调用 sigprocmask(2) 阻塞 set 中的信号(以便在它们在连续调用 sigwaitinfo() 或 sigtimedwait() 之间变为挂起时,不会发生这些信号的默认处理),并且不为这些信号建立处理程序。 在多线程程序中,信号应在所有线程中阻塞,以防止信号在其他于调用 sigwaitinfo() 或 sigtimedwait() 的线程中根据其默认处理方式处理。
给定线程挂起的信号集是专门为此线程挂起的信号集与整个进程挂起的信号集的并集(参见 signal(7))。
尝试等待 SIGKILL 和 SIGSTOP 会被静默忽略。
如果进程的多个线程被阻塞,等待相同的 signal(s) 在 sigwaitinfo() 或 sigtimedwait() 中,那么只有其中一个线程会在信号对整个进程挂起时实际接收到该信号;哪个线程接收到该信号是不确定的。
POSIX 没有指定 sigtimedwait() 的 timeout 参数的 NULL 值的含义,允许这种可能性与调用 sigwaitinfo() 具有相同的含义,实际上在 Linux 上也是这样。
在 Linux 上,sigwaitinfo() 是一个库函数,它是在 sigtimedwait() 之上实现的。
参见
kill(2), sigaction(2), signal(2), signalfd(2), sigpending(2), sigprocmask(2), sigqueue(3), sigsetops(3), sigwait(3), signal(7), time(7)