#include <sys/time.h> int getitimer(int which, struct itimerval *value); int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue); struct itimerval { struct timeval it_interval; /* next value */ struct timeval it_value; /* current value */ }; struct timeval { long tv_sec; /* seconds */ long tv_usec; /* microseconds */ }; setitimer 比 alarm 強大很多,依照 which 值的不同,可同時產生三種不同類型的計時器。
  1. ITIMER_REAL
    依據系統真實的時間來計算,送出 SIGALRM(14) 信號。
  2. ITIMER_VIRTUAL
    依據該行程 (process) 在使用者空間 (user space) 下花費的時間來計算,送出 SIGVTALRM(26) 信號。
  3. ITIMER_PROF
    依據該行程 (process) 在使用者空間 (user space) 下和核心空間 (kernel space) 下所花費的時間來計算,送出 SIGPROF(27) 信號。
另外有下列幾個重點要注意:
  1. setitimer 會把新值 value 載入系統,而把之前的舊值放入 ovalue。
  2. 系統會遞減 it_value 的值,直到 it_value=0 就觸發信號,並把 it_interval 載入 it_value,如此循環不斷。
  3. 如果把 it_value 設定成 0,就會把計時器停止。
  4. 同上,當 it_interval=0 時,第一次觸發完後,再把 it_interval 載入 it_value,造成 it_value=0,也就會把計時器停止。
下面演示 setitimer 的使用範例,每二秒顯示系統時間一次。 #include <stdio.h> #include <signal.h> #include <sys/time.h> int main(int argc, char *argv[]) { sigset_t block; struct itimerval itv; sigemptyset(&block); sigaddset(&block, SIGALRM); sigprocmask(SIG_BLOCK, &block, NULL); itv.it_interval.tv_sec = 2; itv.it_interval.tv_usec = 0; itv.it_value = itv.it_interval; setitimer(ITIMER_REAL, &itv, NULL); while (1) { printf("%d\n", time(NULL)); sigwaitinfo(&block, NULL); } return 0; } 下一篇待續:http://jyhshin.pixnet.net/blog/post/27781505
創作者介紹

邱小新の工作筆記

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()