我正在使用 sigwait 为某些信号阻塞我的线程。这些信号已添加到信号集中。根据 doc sigwait 应该只等待作为参数中的一组传递给它的信号,并且不应该更改该线程的信号掩码。但是出于某种我不知道的原因,它正在更改信号掩码的线程。它会阻止除 sigs 中的信号之外的所有信号。我不希望这发生。 有人可以帮助我吗?提前致谢
代码片段:
sigset_t sigs;
int sig_recvd;
sigset_t old_mask;
sigemptyset(&sigs);
sigaddset(&sigs, SIGUSR1);
sigaddset(&sigs, SIGTERM);
sigaddset(&sigs, SIGHUP);
sigaddset(&sigs, SIGINT);
sigaddset(&sigs, SIGPIPE);
sigaddset(&sigs, SIGCHLD);
sigprocmask(SIG_BLOCK, &sigs, &old_mask);
do
{
sigwait(&sigs, &sig_recvd);
//Switch for some signal handling
} while(1);
sigwait 之前的 Sigblk:0000000080014203
sigwait 期间的 Sigblk:ffffffffeffabcfc
我不知道 sigwait 函数有什么问题,但是当我对 sigwaitinfo 做同样的事情时,一切都对我有用。无法弄清楚是什么让后来的工作成功,但现在我的问题已经解决了。但是我想知道两者在实现上有什么不同
最佳答案
我不太确定你的问题是什么,如果你的问题是“为什么 sigwait 在执行期间 而不是 之后 更改 sigmast”,那么它就是case,sigwait在执行的时候会解锁signal,不然怎么会指望signal来呢?这是 APUE 的摘录:
如果在调用 sigwait 时集合中指定的信号之一处于挂起状态,则 sigwait 将无阻塞地返回。在返回之前,sigwait 从进程的未决信号集中删除该信号。为避免错误行为,线程必须在调用 sigwait 之前阻塞它正在等待的信号。 sigwait 函数将自动解除对信号的阻塞并等待一个信号被传送。在返回之前,sigwait 将恢复线程的信号掩码。如果在调用 sigwait 时信号未被阻塞,则会打开一个计时窗口,其中一个信号可以在线程完成对 sigwait 的调用之前传递给线程。
。
关于c - sigwait 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7750248/