Есть ли способ дождаться, пока задача поймает сигнал SIGALRM в Intel Arch?

Я программирую gcc версии 4.4.3 на Ubuntu 10.04. Я не знаю, как поймать SIGALRM с помощью sigtimedwait(), sigwait().

Если установлен обработчик таймера, sigtimedwait(), sigwait() всегда возвращает EINTR(4). Если обработчик таймера не установлен, SIGALRM никогда не будет получен.

Есть ли способ дождаться, пока задача поймает сигнал SIGALRM в Intel Arch?

void handler( int signo )
{
...
}

int main( void )
{
  timer_t timer_id;
  struct sigaction sigact;
  struct itimerspec itval;
  int ret;
  struct timespec pTimeout;
  siginfo_t pInfo;

  pTimeout.tv_sec = 10;
  pTimeout.tv_nsec = 0;

// set signal handler for SIGALRM
  sigact.sa_handler = handler;
  sigact.sa_flags = 0;
  sigemptyset( &sigact.sa_mask );

  sigaction( SIGALRM, &sigact, NULL );

// create timer
  timer_create( CLOCK_REALTIME, NULL, &timer_id );

  itval.it_value.tv_sec = 3;
  itval.it_value.tv_nsec = 0;

  itval.it_interval.tv_sec = 0;
  itval.it_interval.tv_nsec = 250 * 1000 * 1000;

// set timer
  timer_settime( timer_id, 0, &itval, NULL );

  int count;
  for ( count = 0; count < 10; count++ )
  {
// wait for SIGALRM

    ret = sigtimedwait
            (
                    &sigact.sa_mask,    /* the signal mask while suspended */
                    &pInfo,                    /* return value */
                    &pTimeout  
            );
 .....
   }

person Boblishus    schedule 17.06.2013    source источник
comment
Непонятно, почему вы повторно используете sigact.sa_mask (пустой) в вызове sigtimedwait. Вы ждете пустой набор, поэтому будильник не совпадает. Насколько я понимаю, комментарий the signal mask while suspended совершенно неуместен.   -  person    schedule 18.06.2013
comment
Как вы сказали, я сделал ошибку. После пересмотра первого параметра sigtimedwait я получил сигнал SIGALRM. Спасибо.   -  person Boblishus    schedule 18.06.2013


Ответы (2)


Это полезно?

do {
    ret = sigtimedwait(&sigact.sa_mask, &pInfo, &pTimeout);
} while (ret < 0 && errno == EINTR);

Аналогичный вопрос.

person raj raj    schedule 17.06.2013
comment
sigtimedwait не возвращает EINTR. - person rr-; 17.04.2015

Некоторые из функций «ожидания получения сигнала»:

Функция sigpause() на самом деле является частью устаревшего набора функций; лучше не использовать его в новом коде.

Существует также:

который может делать то, что вы хотите, более непосредственно.

person Jonathan Leffler    schedule 17.06.2013