Linux两种定时器
Linux下的定時器有兩種,以下分別介紹:
1、alarm
如果不要求很精確的話,用alarm()和signal()就夠了
unsigned int alarm(unsigned int seconds)
函數說明: alarm()用來設置信號SIGALRM在經過參數seconds指定的秒數后傳送給目前的進程。如果參數seconds為0,則之前設置的鬧鐘會被取消,并將剩下的時間返回。
返回值: 返回之前鬧鐘的剩余秒數,如果之前未設鬧鐘則返回0.
alarm()執行后,進程將繼續執行,在后期(alarm以后)的執行過程中將會在seconds秒后收到信號SIGALRM并執行其處理函數。
| #include <stdio.h> #include <time.h> #include <sys/time.h> #include <stdlib.h> #include <signal.h> ? void sigalrm_fn(int sig) { printf("alarm!\n"); alarm(2); return; } ? int main(void) { signal(SIGALRM, sigalrm_fn); alarm(1); while(1) pause(); } |
| ? |
2、setitimer()
int setitimer(int which, const struct itimerval *value, struct itimerval*ovalue));
setitimer()比alarm功能強大,支持3種類型的定時器:
ITIMER_REAL : 以系統真實的時間來計算,它送出SIGALRM信號。
ITIMER_VIRTUAL : -以該進程在用戶態下花費的時間來計算,它送出SIGVTALRM信號。
ITIMER_PROF : 以該進程在用戶態下和內核態下所費的時間來計算,它送出SIGPROF信號。
setitimer()第一個參數which指定定時器類型(上面三種之一);第二個參數是結構itimerval的一個實例;第三個參數可不做處理。
setitimer()調用成功返回0,否則返回-1.
下面是關于setitimer調用的一個簡單示范,在該例子中,每隔一秒發出一個SIGALRM,每隔0.5秒發出一個SIGVTALRM信號:
| #include <stdio.h> #include <time.h> #include <sys/time.h> #include <stdlib.h> #include <signal.h> ? int sec; ? void sigroutine(int signo){ ? switch (signo){ ? case SIGALRM: ? printf("Catch a signal -- SIGALRM \n"); ? signal(SIGALRM, sigroutine); ? break; ? case SIGVTALRM: ? printf("Catch a signal -- SIGVTALRM \n"); ? signal(SIGVTALRM, sigroutine); ? break; ? } ? return; ? } ? int main() ? { ? struct itimerval value, ovalue, value2; //(1) ? sec = 5; ? printf("process id is %d\n", getpid()); ? signal(SIGALRM, sigroutine); ? signal(SIGVTALRM, sigroutine); ? value.it_value.tv_sec = 1; ? value.it_value.tv_usec = 0; ? value.it_interval.tv_sec = 1; ? value.it_interval.tv_usec = 0; ? setitimer(ITIMER_REAL, &value, &ovalue); //(2) ? value2.it_value.tv_sec = 0; ? value2.it_value.tv_usec = 500000; ? value2.it_interval.tv_sec = 0; ? value2.it_interval.tv_usec = 500000; ? setitimer(ITIMER_VIRTUAL, &value2, &ovalue); ? for(;;) ? ; ? } |
總結
以上是生活随笔為你收集整理的Linux两种定时器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新安银行是什么银行?心安存180天产品介
- 下一篇: 信用良好办卡失败 看看是不是这些原因