linux C之setitimer函式簡單使用
阿新 • • 發佈:2019-01-10
在說setitimer函式之前, 先來說說alarm函式:
unsigned int alarm(unsigned int seconds);
alarm函式會建立一個定時器, 在seconds秒後, 給當前程序傳送SIGALRM訊號.
setitimer也用來建立定時器, 不過它比alarm功能多, 最顯著的區別就是它可以指定到微秒, 而且可以迴圈傳送.
setitimer manpage: man 2 setitimer
想象一個生活中的場景, 現在想每天早上7點起床, 但是太貪睡, 7點後還不想起, 就每隔10分鐘再提醒自己.
這種類似的場景就可以用setitimer函式來實現.
寫了一個小的demo來體會下用法:
// setitimer.c
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <signal.h>
#include <string.h>
// 註冊訊號處理函式, 列印當前時間戳,訊號編號及對應的說明
void sigHandler(int sig) {
printf("[%d] caught signal: #%d: %s\n", time(NULL), sig, strsignal(sig) );
}
int main(int argc, const char *argv[]) {
// 列印開始時間戳
printf("[%d] start\n", time(NULL));
// 註冊SIGALRM訊號處理函式, setitimer函式會不停地發SIGALRM訊號
signal(SIGALRM, sigHandler);
struct itimerval it, oldit;
// 第3秒時發一次SIGALRM訊號
it.it_interval.tv_sec = 3;
it.it_interval.tv_usec = 0;
// 以後每隔1秒發一次SIGALRM訊號
it.it_value.tv_sec = 1;
it.it_value.tv_usec = 0;
setitimer(ITIMER_REAL, &it, NULL);
while(1);
return 0;
}
編譯, 執行, 結果類似這樣:
[[email protected] signal]# ./setitimer.out
[1545494598] start
[1545494599] caught signal: #14: Alarm clock
[1545494602] caught signal: #14: Alarm clock
[1545494605] caught signal: #14: Alarm clock
^C
[[email protected] signal]#
可以看到效果是:
第3秒時發一次SIGALRM訊號, 以後每隔1秒發一次SIGALRM訊號
這裡只說下setitimer基本的用法, 更多高階用法請參見相應的manpage.
歡迎補充指正.