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 )。否则,它将信号号设置为0。我的理解正确吗?
我会尝试一下,但目前无法访问编译器。
编辑:进一步澄清
好吧,我发送上述信号之一:
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
这正确吗?
答案 0 :(得分:1)
正如您所说,在您的示例中,sigwait
将等待SIGHUP,SIGINT和SIGTERM中的一个。
否则,它将信号编号设置为0。
没有其他情况。唯一定义的错误是
EINVAL set参数包含无效或不受支持的信号编号。
修改
为了明确说明这一点,此函数唯一定义的错误是set
参数的无效输入。由于在示例中构造的集合不是无效的,因此该函数不会返回错误,它将等待直到其中一个信号到达。