在C語言中,setitimer
函數是用來設置定時器的。它可以用于在特定的時間間隔內觸發一個信號。
函數原型如下:
int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
參數解釋:
which
:指定定時器的類型,可以取值為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;
}
上述代碼中,首先定義了一個信號處理函數handler
,用于處理SIGALRM信號的觸發。在main
函數中,設置了定時器的初次觸發時間為1秒,間隔時間也為1秒,并通過signal
函數注冊了信號處理函數。然后調用setitimer
函數設置定時器,并進入一個無限循環等待信號的狀態。
當定時器的時間到達時,會觸發SIGALRM信號,從而調用信號處理函數,輸出"Timer expired!"。