ここでは、Unix や Linux の C 言語で timer_create や sigaction システムコールを使用したタイマ処理を実装するサンプルコードを掲載しています。
スポンサーリンク
タイマ処理を作成するサンプルコード
タイマ処理を実装するサンプルコードになります。詳細はサンプル内のコメントを参照ください。
#include <stdio.h>
#include <signal.h>
#include <time.h>
#include <unistd.h>
/*
* タイマハンドラ
*/
void timer_handler(int signum)
{
printf("called timer handler\n");
}
int main(int argc, char** argv)
{
int i;
struct sigaction act, oldact;
timer_t tid;
struct itimerspec itval;
memset(&act, 0, sizeof(struct sigaction));
memset(&oldact, 0, sizeof(struct sigaction));
// シグナルハンドラの登録
act.sa_handler = timer_handler;
act.sa_flags = SA_RESTART;
if(sigaction(SIGALRM, &act, &oldact) < 0) {
perror("sigaction()");
return -1;
}
// タイマ割り込みを発生させる
itval.it_value.tv_sec = 5; // 最初の1回目は5秒後
itval.it_value.tv_nsec = 0;
itval.it_interval.tv_sec = 1; // 2回目以降は1秒間隔
itval.it_interval.tv_nsec = 0;
// タイマの作成
if(timer_create(CLOCK_REALTIME, NULL, &tid) < 0) {
perror("timer_create");
return -1;
}
// タイマのセット
if(timer_settime(tid, 0, &itval, NULL) < 0) {
perror("timer_settime");
return -1;
}
for(i=0; i<10; i++) {
// シグナル(タイマ割り込み)が発生するまでサスペンドする
pause();
}
// タイマの解除
timer_delete(tid);
// シグナルハンドラの解除
sigaction(SIGALRM, &oldact, NULL);
return 0;
}
コンパイル時に rt ライブラリのリンク
timer_create 等を使用してタイマを実装する場合には、コンパイル時に以下のように rt ライブラリをリンクさせる必要があるかもしれません。
gcc timer.c -lrt