【问题标题】:Stuck with sigwait卡住 sigwait
【发布时间】:2011-05-10 20:07:04
【问题描述】:

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

还是不行。

【问题讨论】:

    标签: c macos signals


    【解决方案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;
    }
    

    【讨论】:

    • @user408141:我的代码对你有用吗?如果构建、运行并杀死 -USR2 会得到什么输出?
    • @user408141:另外,不要在调试器中运行程序。过去我见过调试器和信号不能很好地协同工作。调试器可能是问题所在。
    • 是的,调试模式是错误的 :) 谢谢。 [我的菜鸟:P]
    【解决方案2】:

    如相关问题sigwait in Linux (Fedora 13) vs OS X 中所述,您需要使用sigprocmask()(对于单线程应用程序)或pthread_sigmask()(对于多线程应用程序)来阻止信号。

    检查sigwait的错误返回值也不错。

    【讨论】:

    • 我试过了,但没有成功。我添加了一个新行:sigset_t sigset; sigemptyset(&sigset); sigaddset(&sigset, SIGILL); sigaddset(&sigset, SIGUSR2); sigprocmask(SIG_BLOCK, &sigset, 0); sigwait(&sigset, &received);仍然磨损。
    • 我检查过了,它返回0。
    猜你喜欢
    • 2013-02-26
    • 2017-12-29
    • 2011-08-04
    • 2011-11-17
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多