了解sigwait()及其设置参数的方式

时间:2018-08-01 19:11:39

标签: c++ c linux multiprocessing signals

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

这正确吗?

1 个答案:

答案 0 :(得分:1)

正如您所说,在您的示例中,sigwait将等待SIGHUP,SIGINT和SIGTERM中的一个。

  

否则,它将信号编号设置为0。

没有其他情况。唯一定义的错误是

  

EINVAL set参数包含无效或不受支持的信号编号。

修改 为了明确说明这一点,此函数唯一定义的错误是set参数的无效输入。由于在示例中构造的集合不是无效的,因此该函数不会返回错误,它将等待直到其中一个信号到达。