C言語システムコール-getitimer

getitimerシステムコール

概要

getitimerはインターバルタイマの値を取得します。


インターバルタイマは、一定時間毎にシグナルハンドラで用意した処理を実行するプログラムの作成に用います。

インターバルタイマを用いて一定時間感覚でシグナルを発生させるには「setitimer」システムコールを使用します。


サンプルプログラム


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

/*!
 * @brief     インターバルタイマの値を表示する
 * @return    0:success/-1:failure
 */
static int
show_itimer_val(void)
{
    int rc = 0;
    struct itimerval val;

    rc = getitimer(ITIMER_REAL, &val);
    if(rc < 0){
        printf("Error: getitimer() %s\n", strerror(errno));
        return(-1);
    }

    fprintf(stdout,
            "interval = %ld.%ld\n"
            "value    = %ld.%ld\n",
            (long)val.it_interval.tv_sec,
            (long)val.it_interval.tv_usec,
            (long)val.it_value.tv_sec,
            (long)val.it_value.tv_usec);

    return(0);
}

/*!
 * @brief     ドットを出力する
 */
static void
print_dot()
{
    write(2, ".", 1);
}

/*!
 * @brief     一定間隔で出力する
 * @return    0:success/-1:failure
 */
static int
interval_print(void)
{
    int rc = 0;
    struct itimerval val;
    struct sigaction act;
    sigset_t set;

    /* シグナルハンドラを設定する */
    memset(&act, 0, sizeof(act));
    act.sa_handler = print_dot;
    rc = sigaction(SIGALRM, &act, NULL);
    if(rc < 0){
        printf("Error: sigaction() %s\n", strerror(errno));
        return(-1);
    }

    /* インターバルタイマを設定する */
    val.it_interval.tv_sec  = 1;
    val.it_interval.tv_usec = 0;
    val.it_value = val.it_interval; /* タイマ現在値を変更する */
    rc = setitimer(ITIMER_REAL, &val, NULL);
    if(rc < 0){
        printf("Error: setitimer() %s\n", strerror(errno));
        return(-1);
    }

    /* タイマの待ち合わせ */
    sigemptyset(&set);
    while(1){
        sigsuspend(&set);
    }

    return(0);
}

int
main(int argc, char *argv[])
{
    int rc = 0;

    if(argc != 1){
        fprintf(stderr, "Usage: %s\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    rc = interval_print();
    if(rc != 0) exit(EXIT_FAILURE);

    exit(EXIT_SUCCESS);
}

関連ページ