2012-04-12 86 views
0

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

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以来是否发送了一个信号?

谢谢

+0

信号是一种布尔功能。信号处于活动状态或不处于活动状态,如果在处理第一个信号之前发生两次相同的信号,则不存在计数器或队列。 – 2012-04-12 11:19:06

回答

0

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

例如通过启动“执行某项操作”或“执行其他操作”的线程。