c - sigwait 的奇怪行为

标签 c linux signals

我正在使用 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/

相关文章:

regex - 返回具有 grep 匹配的制表符分隔的 csv 文件的整列

linux - 较新版本的 Linux 是否使用与 libata-core.h 不同的包含?

php - 通过 shell_exec 使用 PHP 发送 SIGHUP 信号

python - django post_migrate 信号问题

c++ - 抓还是不抓

c - 释放重新分配导致错误

c++ - Linux,静态库引用可执行文件中的其他静态库

fflush - fflush 和 fsync 的区别

c - 为什么malloc在达到一定阈值之前不分配内存?

c - Learn C the Hard Way 的 ex17 数据库设计问题