Linux两种定时器
Linux下的定時(shí)器有兩種,以下分別介紹:
1、alarm
如果不要求很精確的話,用alarm()和signal()就夠了
unsigned int alarm(unsigned int seconds)
函數(shù)說明: alarm()用來設(shè)置信號SIGALRM在經(jīng)過參數(shù)seconds指定的秒數(shù)后傳送給目前的進(jìn)程。如果參數(shù)seconds為0,則之前設(shè)置的鬧鐘會被取消,并將剩下的時(shí)間返回。
返回值: 返回之前鬧鐘的剩余秒數(shù),如果之前未設(shè)鬧鐘則返回0.
alarm()執(zhí)行后,進(jìn)程將繼續(xù)執(zhí)行,在后期(alarm以后)的執(zhí)行過程中將會在seconds秒后收到信號SIGALRM并執(zhí)行其處理函數(shù)。
| #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功能強(qiáng)大,支持3種類型的定時(shí)器:
ITIMER_REAL : 以系統(tǒng)真實(shí)的時(shí)間來計(jì)算,它送出SIGALRM信號。
ITIMER_VIRTUAL : -以該進(jìn)程在用戶態(tài)下花費(fèi)的時(shí)間來計(jì)算,它送出SIGVTALRM信號。
ITIMER_PROF : 以該進(jìn)程在用戶態(tài)下和內(nèi)核態(tài)下所費(fèi)的時(shí)間來計(jì)算,它送出SIGPROF信號。
setitimer()第一個(gè)參數(shù)which指定定時(shí)器類型(上面三種之一);第二個(gè)參數(shù)是結(jié)構(gòu)itimerval的一個(gè)實(shí)例;第三個(gè)參數(shù)可不做處理。
setitimer()調(diào)用成功返回0,否則返回-1.
下面是關(guān)于setitimer調(diào)用的一個(gè)簡單示范,在該例子中,每隔一秒發(fā)出一個(gè)SIGALRM,每隔0.5秒發(fā)出一個(gè)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(;;) ? ; ? } |
總結(jié)
以上是生活随笔為你收集整理的Linux两种定时器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新安银行是什么银行?心安存180天产品介
- 下一篇: Linux编程make命令