»POSIX Timerはてなブックマークに追加はてなブックマークを見る

»POSIX Timer

»使用例

// gcc -lrt

#include <stdio.h>
#include <signal.h>
#include <time.h>
#include <unistd.h>

//
// シグナルハンドラ
//
void handler( int signo )
{
  // printfは非同期シグナルセーフな関数ではないため、
  // 本当ならシグナルハンドラで使用すべきではない
  printf( "!signal %d received\n", signo );
}


int main( void )
{
  timer_t timer_id;
  struct sigaction sigact;
  struct itimerspec itval;

  // シグナルハンドラを設定する
  sigact.sa_handler = handler;

  // シグナルハンドラの動作を変更する為のフラグ(特に指定しない)
  sigact.sa_flags = 0;

  // シグナル集合を空にする
  // (シグナルハンドラを設定する対象のシグナルをクリアする)
  sigemptyset( &sigact.sa_mask );

  // SIGALRMに対してシグナルハンドラを設定
  sigaction( SIGALRM, &sigact, NULL );

  // タイマーを作成
  timer_create( CLOCK_REALTIME, NULL, &timer_id );

  // タイマーが満了するまでの時間
  // (タイマーを設定してから3秒後に満了し、その後0.25秒おきに
  // 満了させる)
  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;

  // タイマーを設定
  timer_settime( timer_id, 0, &itval, NULL );

  int count;

  for ( count = 0; count < 10; count++ )
  {
    // シグナルの受信を待機する
    pause();

    printf( "count: %d\n", count );
  }

  // タイマーを削除
  timer_delete( timer_id );
}

Sponsored Link