| 模式 | 計時依據 | 產生信號 |
|---|---|---|
| ITIMER_REAL | 真實時間 (牆鐘時間) | SIGALRM |
| ITIMER_VIRTUAL | 進程使用者態 CPU 時間 | SIGVTALRM |
| ITIMER_PROF | 進程使用者態+核心態 CPU 時間 | SIGPROF |
struct itimerval {
struct timeval it_interval; // 間隔週期
struct timeval it_value; // 當前倒數值
};
struct timeval {
time_t tv_sec; // 秒
suseconds_t tv_usec; // 微秒
};
運作機制:it_value 遞減至 0 → 發送信號 → 重載 it_interval 到 it_value → 繼續週期性觸發。
#include <stdio.h>
#include <sys/time.h>
#include <signal.h>
#include <unistd.h>
void handler(int sig) {
if (sig == SIGALRM)
puts("Get SIGALRM");
signal(SIGALRM, handler); // 重新安裝 (不可靠信號需求)
}
int main(void) {
struct itimerval val = {
.it_value = {1, 0},
.it_interval = {1, 0}
};
signal(SIGALRM, handler);
setitimer(ITIMER_REAL, &val, NULL);
while (1) pause(); // 等待信號
return 0;
}
信號值 < SIGRTMIN (32) 為不可靠信號:處理後自動重置為預設動作。須在處理函數尾端重新 signal(),或改用 sigaction() 設定 SA_RESETHAND 旗標。sigaction 提供更精確控制(信號遮罩、旗標、擴充資訊)。