1. 程式人生 > >linux C之setitimer函式簡單使用

linux C之setitimer函式簡單使用

在說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.

歡迎補充指正.