简体   繁体   中英

Is there any method to wait until task catch SIGALRM signal in intel arch?

I'm programming iwth gcc version 4.4.3 on Ubuntu 10.04 I don't know how to catch SIGALRM with sigtimedwait(),sigwait().

If timer handler is set , sigtimedwait(),sigwait() always returns EINTR(4). If timer handler is not set, SIGALRM never received.

Is there any method to wait until task catch SIGALRM signal in 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  
            );
 .....
   }

Is this helpful?

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

Similar question .

Some of the 'wait until a signal is received' functions are:

The sigpause() function is actually part of a deprecated set of functions; it is best not to use it in new code.

There is also:

which may do what you want more directly.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM