1. 程式人生 > >Nginx 中對 setitimer系統呼叫 的使用

Nginx 中對 setitimer系統呼叫 的使用

Nginx 中使用 setitimer系統呼叫 來告訴核心每隔timer_resolution 毫秒呼叫一次  ngx_timer_signal_handler 方法,

而 ngx_timer_signal_handler 方法則會將 ngx_event_timer_alarm 標誌位設為 1,這樣一來,一旦呼叫ngx_epoll_process_events 方法,

如果間隔的時間超過 timer_resolution 毫秒,肯定會更新時間。

下面是對 setitimer系統呼叫 的簡單介紹:

          1,setitimer函式功能介紹

               在linux下如果對定時要求不太精確的話,使用 alarm()和 signal()就行了,

               但是如果想要實現精度較高的定時功能的話,就要使用setitimer函式。

          2,setitimer函式引數介紹

int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);
         which為定時器型別,setitimer支援3種類型的定時器:          ITIMER_REAL: 以系統真實的時間來計算,它送出SIGALRM訊號。          ITIMER_VIRTUAL: -以該程序在使用者態下花費的時間來計算,它送出SIGVTALRM訊號。          ITIMER_PROF
: 以該程序在使用者態下和核心態下所費的時間來計算,它送出SIGPROF訊號。

setitimer()第一個引數which指定定時器型別(上面三種之一);第二個引數是結構itimerval的一個例項;第三個引數可不做處理。

setitimer()呼叫成功返回0,否則返回-1。

struct itimerval {        struct timeval it_interval;        struct timeval it_value; }; struct timeval {        long tv_sec;        long tv_usec; };

it_interval指定間隔時間,it_value指定初始定時時間。
如果只指定it_value,就是實現一次定時;
如果同時指定 it_interval,則超時後,系統會重新初始化it_value為it_interval,實現重複定時;
兩者都清零,則會清除定時器。 tv_sec提供秒級精度,tv_usec提供微秒級精度,以值大的為先,注意1s = 1000000us。 ovalue用來儲存先前的值,常設為NULL。

如果是以setitimer提供的定時器來休眠,只需阻塞等待定時器訊號就可以了。