ここでは、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