[ C言語 ] タイマ処理を実装する ( timer_create / sigaction )

Pocket

ここでは、Unix や Linux の C 言語で timer_createsigaction システムコールを使用したタイマ処理を実装するサンプルコードを掲載しています。

スポンサーリンク

タイマ処理を作成するサンプルコード

タイマ処理を実装するサンプルコードになります。詳細はサンプル内のコメントを参照ください。

#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
参考
スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *