Linux 的定時器主要是用來解決需要定時執行某項工作時的應用。一般來說有三種方法可以使用:
  1. unsigned int alarm(unsigned int seconds);
    useconds_t ualarm(useconds_t usecs, useconds_t interval);

  2. int getitimer(int which, struct itimerval *value);
    int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);

  3. int timer_create(clockid_t clockid, struct sigevent *restrict evp, timer_t *restrict timerid);
    int timer_getoverrun(timer_t timerid);
    int timer_gettime(timer_t timerid, struct itimerspec *value);
    int timer_settime(timer_t timerid, int flags, const struct itimerspec *restrict value, struct itimerspec *restrict ovalue);

一、alarm

alarm,ualarm 用法很簡單,也是早期 unix 使用的定時器,時間到了會觸發 SIGALRM signal。不過有幾點需要注意,如下所示:
  1. alarm 只會觸發一次,如果需要連續觸發,需重覆 alarm 指令。
  2. ualarm 在 usecs 會先觸發一次,之後每經過 interval 時間會再觸發一次,如果 interval=0 就不再觸發。
  3. 使用 ualarm 時,需先定義 #define _XOPEN_SOURCE 500 才能再 include 喔,不然會出問題的。
  4. ualarm 中的 usecs 及 inerval 不可以超過 1000000,也就是不能超過一秒,會產生 EINVAL 的錯誤。
  5. uClibc 0.9.26 沒有實作 ualarm,所以也不用找了,請改用 setitimer or timer_settime。
下面演示 alarm 的使用範例,每二秒顯示系統時間一次。 #include <unistd.h> #include <stdio.h> #include <signal.h> int main(int argc, char *argv[]) { sigset_t block; sigemptyset(&block); sigaddset(&block, SIGALRM); sigprocmask(SIG_BLOCK, &block, NULL); while (1) { alarm(2); printf("%d\n", time(NULL)); sigwaitinfo(&block, NULL); } return 0; } 下面演示 ualarm 的使用範例,每 0.5 秒顯示系統時間一次。 #define _XOPEN_SOURCE 500 /* Or: #define _BSD_SOURCE */ #include <unistd.h> #include <stdio.h> #include <signal.h> int main(int argc, char *argv[]) { sigset_t block; sigemptyset(&block); sigaddset(&block, SIGALRM); sigprocmask(SIG_BLOCK, &block, NULL); ualarm(500000, 500000); while (1) { printf("%d\n", time(NULL)); sigwaitinfo(&block, NULL); } return 0; } 第二篇待續:http://jyhshin.pixnet.net/blog/post/27749433
創作者介紹

邱小新の工作筆記

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