0

Ubuntu 10.04 で iwth gcc バージョン 4.4.3 をプログラミングしています。sigtimedwait()、sigwait() で SIGALRM をキャッチする方法がわかりません。

タイマー ハンドラが設定されている場合、sigtimedwait()、sigwait() は常に EINTR(4) を返します。タイマー ハンドラが設定されていない場合、SIGALRM は受信されません。

intel archでタスクがSIGALRMシグナルをキャッチするまで待つ方法はありますか?

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  
            );
 .....
   }
4

2 に答える 2

3

これは役に立ちましたか?

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

同様の質問

于 2013-06-17T03:51:39.293 に答える
1

「シグナルが受信されるまで待機」機能の一部は次のとおりです。

このsigpause()関数は、実際には非推奨の関数セットの一部です。新しいコードでは使用しないことをお勧めします。

もあります:

あなたが望むことをより直接的に行うかもしれません。

于 2013-06-17T03:59:27.467 に答える