我在代码中做错了,其他进程向其发送SIGUSR2信号:
sigset_t sigset;
sigemptyset(&sigset);
sigaddset(&sigset, SIGILL);
sigaddset(&sigset, SIGUSR2);
sigwait(&sigset, &received);
XCode注意到接收到SIGUSER2(31)信号,但收到= SIGILL(4)(或集合中的最小信号)。
为什么会这样?哪里错了?
现在,它看起来像这样:
sigset_t sigset;
sigemptyset(&sigset);
sigaddset(&sigset, SIGILL);
sigaddset(&sigset, SIGUSR2);
sigprocmask(SIG_BLOCK, &sigset, 0);
sigwait(&sigset, &received);
if(received == SIGUSR2) {
//...
} else if(received == SIGILL) {
//...
}
仍然无法正常工作。
答案 0 :(得分:1)
如相关问题sigwait in Linux (Fedora 13) vs OS X中所述,您需要使用sigprocmask()
(对于单线程应用程序)或pthread_sigmask()
(对于多线程应用程序)来阻止信号。
检查sigwait
的错误返回值也不错。
答案 1 :(得分:1)
有时调试器可能会妨碍。我之前看到调试器干扰了信号处理。尝试运行代码而不涉及调试器。
以下代码在OS X上完美运行:
#include <signal.h>
#include <stdio.h>
int main()
{
sigset_t set;
int sig;
sigemptyset(&set);
sigaddset(&set, SIGUSR1);
sigaddset(&set, SIGUSR2);
sigprocmask(SIG_BLOCK, &set, NULL);
sigwait(&set, &sig);
printf("Got signal %d\n", sig);
return 0;
}