天天看點

Linux下的定時器

以下摘自linux下的man檔案:(man  getitimer)

  #include  <sys/time.h>

  int  getitimer(int which,  struct itimerval * curr_value);

  int  setitimer(int which,  const struct itimerval  * new_value, struct itimerval  * old_value);

描述:

  Linux系統中提供為每個程序提供了三個間隔定時器,在不同的時間域的每一個遞減。 

       當任何定時器逾時,則發送一個信号到該過程,并在定時器(可能)重新啟動。

  ITIMER_REAL: 實時遞減,時間到發送SIGALRM信号;

  ITIMER_VIRTUAL:遞減隻有當程序正在執行,并且期滿後可提供SIGVTALRM

  ITIMER_PROF: 當程序執行或者是系統為程序排程的時候,減少計數,時間到了,發出SIGPROF信号,這個和ITIMER_VIRTUAL聯合,常用來計算系統核心時間和使用者時間。

以下結果體中定義了定時器的值:

  struct itimerval

  {

    struct timerval it_interval;  //next value;

    struct timerval it_value;   //current value;

  };

  struct timeval

    long tv_sec;   //seconds; 

    long tv_usec;  //microseconds;

  }

it_interval用來指定每隔多長時間執行任務, it_value用來儲存目前時間離執行任務還有多長時間。比如說, 你指定it_interval為2秒(微秒為0),開始的時候我們把it_value的時間也設定為2秒(微秒為0),當過了一秒, it_value就減少一個為1, 再過1秒,則it_value又減少1,變為0,這個時候發出信号(告訴使用者時間到了,可以執行任務了),并且系統自動把it_value的時間重置為 it_interval的值,即2秒,再重新計數。

使用ITMER_REAL定時器,每隔2秒鐘都會發送一個SIGALRM信号,當主函數接收到了這個信号之後,調用信号處理函數 prompt_info在輸出time is running out這個字元串。

對于ITIMER_VIRTUAL和ITIMER_PROF的使用方法類似,在setitimer裡面設定的定時器為 ITIMER_VIRTUAL的時候,并把sigaction裡面的SIGALRM改為SIGVTALARM,

而ITIMER_PROF對應SIGPROF。

繼續閱讀