C言語でsettimer関数の使用方法を教えてください。
C言語では、setitimer関数はタイマーを設定するために使用されます。特定の時間間隔でシグナルをトリガーするために使用できます。
関数プロトタイプは次のとおりです。
int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
パラメーターの説明:
- タイマーの種類を指定し、ITIMER_REAL、ITIMER_VIRTUAL、ITIMER_PROF のいずれかの値を取ることができます。それぞれ、リアルタイムタイマー、仮想タイムタイマー、CPU 時間タイマーを表します。
- new_value: 定時間を設定する itimerval 構造体へのポインター
- old_value:構造体itimerval型へのポインタ、古いタイマー値を取得
itimerval構造体は次のように定義されています。
struct itimerval {
struct timeval it_interval; // 定时器的间隔时间
struct timeval it_value; // 第一次定时器触发的时间
};
struct timeval構造体は時間の値を表すために使われます。
struct timeval {
time_t tv_sec; // 秒
suseconds_t tv_usec; // 微秒
};
関数が0を返せば成功、-1を返せば失敗
setitimer関数を用いることで、指定された時間が経過した際に指定されたシグナルが送信されるタイマーを設定できます。new_value構造体のit_valueとit_intervalフィールドを設定することで、タイマーの初回発火時刻と周期的な発火間隔を指定できます。
次に、1 秒ごとに SIGALRM シグナルを発生させるタイマーを設定するサンプルコードを示します。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/time.h>
#include <signal.h>
void handler(int signum) {
printf("Timer expired!\n");
}
int main() {
struct itimerval timer;
// 设置定时器初次触发时间为1秒,间隔时间也为1秒
timer.it_value.tv_sec = 1;
timer.it_value.tv_usec = 0;
timer.it_interval.tv_sec = 1;
timer.it_interval.tv_usec = 0;
// 注册信号处理函数
signal(SIGALRM, handler);
// 设置定时器
if (setitimer(ITIMER_REAL, &timer, NULL) == -1) {
perror("setitimer");
exit(1);
}
// 无限循环等待信号
while (1) {
pause();
}
return 0;
}
上述のコードでは、最初に SIGALRM シグナルのトリガを処理するシグナルハンドラ関数 handler を定義しています。main 関数で、タイマーの初回トリガ時間を 1 秒、インターバルも 1 秒に設定し、signal 関数でシグナルハンドラ関数を登録しました。さらに、setitimer 関数を呼び出してタイマーを設定し、無限ループに入ってシグナルの状態を待ちます。
タイマーの時間が到来すると SIGALRM シグナルが発生し、そのシグナルハンドラ関数が呼び出されて、「Timer expired!」と出力される。