linux c setitimer用法說明

在linux c編程中,setitimer是一個比較常用的函數,可用來實現延時和定時的功能,網上有各種零零散散的用法說明,都只提到了個別用法,今天抽空實踐整理了一份比較詳細的:

使用時需要引入的頭文件:

#include <sys/time.h>
setitimer函數原型:
int setitimer(int which, const struct itimerval *new_value,
            struct itimerval *old_value);
其中which參數表示類型,可選的值有:
ITIMER_REAL:以系統真實的時間來計算,它送出SIGALRM信號。
ITIMER_VIRTUAL:以該進程在用戶態下花費的時間來計算,它送出SIGVTALRM信號。
ITIMER_PROF:以該進程在用戶態下和內核態下所費的時間來計算,它送出SIGPROF信號。
緊接着的new_value和old_value均爲itimerval結構體,先看一下itimerval結構體定義:
struct itimerval {
    struct timeval it_interval; /* next value */
    struct timeval it_value;    /* current value */
};
 
struct timeval {
    time_t      tv_sec;         /* seconds */
    suseconds_t tv_usec;        /* microseconds */
};
itimeval又是由兩個timeval結構體組成,timeval包含tv_sec和tv_usec兩部分,其中tv_se爲秒,tv_usec爲微秒(即1/1000000秒)
其中的new_value參數用來對計時器進行設置,it_interval爲計時間隔,it_value爲延時時長,下面例子中表示的是在setitimer方法調用成功後,延時1微秒便觸發一次SIGALRM信號,以後每隔200毫秒觸發一次SIGALRM信號。

settimer工作機制是,先對it_value倒計時,當it_value爲零時觸發信號,然後重置爲it_interval,繼續對it_value倒計時,一直這樣循環下去。

基於此機制,setitimer既可以用來延時執行,也可定時執行。

假如it_value爲0是不會觸發信號的,所以要能觸發信號,it_value得大於0;如果it_interval爲零,只會延時,不會定時(也就是說只會觸發一次信號)。

old_value參數,通常用不上,設置爲NULL,它是用來存儲上一次setitimer調用時設置的new_value值。

以下是一個簡單的使用例子:

#include <stdio.h>
#include <signal.h>
#include <sys/time.h>
 
void signalHandler(int signo)
{
    switch (signo){
        case SIGALRM:
            printf("Caught the SIGALRM signal!\n");
            break;
   }
}
 
int main(int argc, char *argv[])
{
    signal(SIGALRM, signalHandler);
 
    struct itimerval new_value, old_value;
    new_value.it_value.tv_sec = 0;
    new_value.it_value.tv_usec = 1;
    new_value.it_interval.tv_sec = 0;
    new_value.it_interval.tv_usec = 200000;
    setitimer(ITIMER_REAL, &new_value, &old_value);
    
    for(;;);
     
    return 0;
}
參考鏈接:

http://man7.org/linux/man-pages/man2/setitimer.2.html
--------------------- 
作者:LiXianlin 
來源:CSDN 
原文:https://blog.csdn.net/lixianlin/article/details/25604779 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章