C sigtimedwait和检测信号

C sigtimedwait和检测信号,c,pthreads,signals,C,Pthreads,Signals,我应该实现一个信号处理程序,它在第一次调用某个信号时停止程序中的所有线程,如果它们已经停止,则恢复它们。我使用以下代码实现了一个后台运行的demon线程: void *handle_sig(void *arg) { sigset_t set; //set set... struct timespec to; to.tv_sec = 1; to.tv_nsec = 0; while (_keepListening) { int

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

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;
}
void*handle\u sig(void*arg)
{
sigset\u t集;
//设置设置。。。
结构timespec到;
to.tv_sec=1;
to.tv_nsec=0;
同时(_keepListening){
int-ret=sigtimedwait(&set,NULL,&to);
如果(ret<0)
if(errno==EAGAIN){
继续;/*未发送信号*/
}否则{
fprintf(stderr,“失败…\n”);
出口(1);
}
如果(_state==PAUSE_state){/*被阻止*/
//做点什么
}否则{
`//做点别的
}
}
返回NULL;
}
问题是,如果发送并检测到一个信号,然后在再次进入while循环之前发送另一个信号,那么第二个信号将被忽略,这会使程序永远暂停。是否有方法检测自上次调用sigtimedwait后是否发送了信号


谢谢

您可能会考虑使处理异步化


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

信号是一种布尔特性。无论信号是否处于活动状态,如果同一信号在处理第一个信号之前发生两次,则不存在计数器或队列。