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
这是正确的吗?
发布于 2018-08-02 03:21:00
正如您所说,在您的示例中,sigwait
将等待SIGHUP、SIGINT、SIGTERM中的一个。
否则,它会将信号编号设置为0。
没有别的办法。唯一定义的错误是
EINVAL set参数包含无效或不受支持的信号号。
编辑要明确说明这一点,此函数唯一定义的错误是set
参数的无效输入。由于您在示例中构造的集合不是无效的,因此该函数不会返回错误,它将等待其中一个信号到达。
https://stackoverflow.com/questions/51640723
复制相似问题