【问题标题】:sigtimedwait and detecting signalssigtimedwait 和检测信号
【发布时间】:2012-04-24 17:30:02
【问题描述】:

我应该实现一个信号处理程序,它在第一次调用某个信号时停止程序中的所有线程,如果它们已经停止,则恢复它们。我使用以下代码实现了一个后台运行的恶魔线程:

void *handle_sig(void *arg)
{
    sigset_t set;
    //set set...

    struct timespec to;
    to.tv_sec = 1;
    to.tv_nsec = 0;

    while (_keepListening) {

        int ret = sigtimedwait(&set, NULL, &to);

        if (ret < 0)
            if (errno == EAGAIN) {
                continue; /* no signal sent*/
            } else {
                fprintf(stderr, "Failed...\n");
                exit(1);
            }

        if (_state == PAUSE_STATE) { /* was blocked*/
            //do something
        } else {
`                       //do something else
        }

    }
    return NULL;
}

问题在于,如果发送并检测到一个信号,然后在再次进入 while 循环之前发送另一个信号 - 第二个信号将被忽略,这会使程序永远暂停。有没有一种方法可以检测自上次调用 sigtimedwait 以来是否发送了信号?

谢谢

【问题讨论】:

  • 信号是一种布尔特征。一个信号要么处于活动状态,要么不处于活动状态,如果相同的信号在第一个被处理之前发生两次,则没有计数器或队列。

标签: c pthreads signals


【解决方案1】:

您可能会考虑使您的处理异步。

例如,通过为“做某事”或“做其他事情”启动一个线程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多