タイマー割り込みの作り方(setitimerを使う)


次はsetitimer()を使ったサンプルです。
ソースは以下のとおりです。

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <time.h>
#include <sys/time.h>
#include <signal.h>

void handler(int sig) {
    return;
}

int main(void)
{
    int i;
    time_t now;
    struct tm *pnow;
    struct itimerval timer;
    struct sigaction act = {
        .sa_handler = handler,
        .sa_flags = SA_RESTART,
    };
    sigemptyset(&act.sa_mask);

    if (sigaction(SIGALRM, &act, NULL) < 0)
        return 1;

    /* set intarval timer (10ms) */
    timer.it_value.tv_sec = 1;
    timer.it_value.tv_usec = 0;
    timer.it_interval.tv_sec = 1;
    timer.it_interval.tv_usec = 0;
    if(setitimer(ITIMER_REAL, &timer, NULL) < 0){
        perror("setitimer error");
        exit(1);
    }

    for(i=0;i<60;i++) {
        sleep(10);
        now = time(NULL);
        pnow = localtime(&now);
        printf("%d:%d:%d\n",pnow->tm_hour,pnow->tm_min,pnow->tm_sec);
    }
    exit(0);

}

実行結果は前回と同じになります。
こちらもメイン処理の中でsleep()しちゃうんで他のことが何もできないです。

続く