sigwait((的手册页让我很困惑。sigwait的签名是
int sigwait(const sigset_t *set, int *sig);
假设我有类似于以下的代码
sigset_t wset;
sigemptyset(&wset);
sigaddset(&wset,SIGHUP);
sigaddset(&wget,SIGINT);
sigaddset(&wget,SIGTERM);
int sig;
sigwait(&wset,&sig);
如果我理解正确,这将等待发送信号。如果在信号集中找到信号(即sigset_t-wset(,它将设置信号编号(即
int sig,如在该集中找到的那样(即本例中的
SIGHUP、SIGINT、SIGTERM
我会尝试一下,但目前我无法使用编译器。
编辑:为了进一步澄清
好的,所以,我发送上面的一个信号:
int res = sigwait(&wset,&sig);
// res = 0, sig = SIGHUP, SIGINT, or SIGTERM
我发送了一个不包含在集合中的信号:
int res = sigwait(&wset,&sig);
// res = EINVAL (i.e. non-zero) and don't worry about sig
这是正确的吗?
正如您所说,在您的示例中,sigwait
将等待SIGHUP、SIGINT和SIGTERM中的一个。
否则,它将把信号号设置为0。
没有其他情况。唯一定义的错误是
EINVAL集合参数包含无效或不受支持的信号号。
编辑若要明确说明这一点,此函数唯一定义的错误是set
参数的无效输入。由于您在示例中构建的集合不是无效的,因此函数不会返回错误,它将等待其中一个信号到达。