被sigwait困住了

时间:2011-05-10 20:07:04

标签: c macos signals

我在代码中做错了,其他进程向其发送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) {
        //...
    }

仍然无法正常工作。

2 个答案:

答案 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;
}