Я программирую 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
);
.....
}
sigact.sa_mask
(пустой) в вызовеsigtimedwait
. Вы ждете пустой набор, поэтому будильник не совпадает. Насколько я понимаю, комментарийthe signal mask while suspended
совершенно неуместен. - person   schedule 18.06.2013