间隔定时器
間隔定時(shí)器
每當(dāng)一段時(shí)間到時(shí)后,定時(shí)器將向進(jìn)程發(fā)送超時(shí)通知,于是進(jìn)程可以執(zhí)行預(yù)定的動(dòng)作,例如刷新屏幕或者內(nèi)存回收,因此定時(shí)器具有非常廣泛的應(yīng)用,是典型的基礎(chǔ)組件。
linux系統(tǒng)提供了和間隔定時(shí)器(interval timer)相關(guān)的兩個(gè)系統(tǒng)調(diào)用,通過(guò)他們可以在一個(gè)進(jìn)程內(nèi)部實(shí)現(xiàn)多個(gè)間隔定時(shí)器。需要注意的是,linux為應(yīng)用進(jìn)程只提供了
一個(gè)定時(shí)器(間隔定時(shí)器),因此如果一個(gè)應(yīng)用要使用多個(gè)定時(shí)器,則需要自己實(shí)現(xiàn)并進(jìn)行管理。
//interval.c
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/time.h> #include<signal.h> /* 倒計(jì)時(shí)設(shè)置,重復(fù)到時(shí),超時(shí)值設(shè)為1秒*/ struct itimerval val_alarm={.it_interval.tv_sec=1, .it_interval.tv_usec=0, .it_value.tv_sec=1, .it_value.tv_usec=0 }; /*SIGALRM信號(hào)處理函數(shù)*/ void sig_handler(int sig) {printf("time has expired,elapsed %d second.\n",val_alarm.it_value.tv_sec); } int main() {struct sigaction sa;memset(&sa,0,sizeof(sa));sa.sa_handler=&sig_handler;if((sigaction(SIGALRM,&sa,NULL))==1)perror("failed to call sigaction");/*使用初始化val_alarm的值啟動(dòng)定時(shí)器*/if((setitimer(ITIMER_REAL,&val_alarm,NULL))==-1)perror("failed to call sigaction");while(1);
//getchar();用這個(gè)也可以的,和while同樣的后果的!return 0; }
運(yùn)行結(jié)果如圖:每隔一秒打印出一條信息。
程序第8~11行將間隔定時(shí)器的超時(shí)值設(shè)為1秒,并且設(shè)置為反復(fù)啟動(dòng)模式。程序第15~18行定義超時(shí)處理程序,并且在第24~27行進(jìn)行注冊(cè)。程序第30行啟動(dòng)該定時(shí)器,隨后
定時(shí)器每隔1秒超時(shí),定時(shí)器的超時(shí)處理程序打印出相關(guān)的信息。
每當(dāng)一段時(shí)間到時(shí)后,定時(shí)器將向進(jìn)程發(fā)送超時(shí)通知,于是進(jìn)程可以執(zhí)行預(yù)定的動(dòng)作,例如刷新屏幕或者內(nèi)存回收,因此定時(shí)器具有非常廣泛的應(yīng)用,是典型的基礎(chǔ)組件。
linux系統(tǒng)提供了和間隔定時(shí)器(interval timer)相關(guān)的兩個(gè)系統(tǒng)調(diào)用,通過(guò)他們可以在一個(gè)進(jìn)程內(nèi)部實(shí)現(xiàn)多個(gè)間隔定時(shí)器。需要注意的是,linux為應(yīng)用進(jìn)程只提供了
一個(gè)定時(shí)器(間隔定時(shí)器),因此如果一個(gè)應(yīng)用要使用多個(gè)定時(shí)器,則需要自己實(shí)現(xiàn)并進(jìn)行管理。
//interval.c
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/time.h> #include<signal.h> /* 倒計(jì)時(shí)設(shè)置,重復(fù)到時(shí),超時(shí)值設(shè)為1秒*/ struct itimerval val_alarm={.it_interval.tv_sec=1, .it_interval.tv_usec=0, .it_value.tv_sec=1, .it_value.tv_usec=0 }; /*SIGALRM信號(hào)處理函數(shù)*/ void sig_handler(int sig) {printf("time has expired,elapsed %d second.\n",val_alarm.it_value.tv_sec); } int main() {struct sigaction sa;memset(&sa,0,sizeof(sa));sa.sa_handler=&sig_handler;if((sigaction(SIGALRM,&sa,NULL))==1)perror("failed to call sigaction");/*使用初始化val_alarm的值啟動(dòng)定時(shí)器*/if((setitimer(ITIMER_REAL,&val_alarm,NULL))==-1)perror("failed to call sigaction");while(1);
//getchar();用這個(gè)也可以的,和while同樣的后果的!return 0; }
運(yùn)行結(jié)果如圖:每隔一秒打印出一條信息。
程序第8~11行將間隔定時(shí)器的超時(shí)值設(shè)為1秒,并且設(shè)置為反復(fù)啟動(dòng)模式。程序第15~18行定義超時(shí)處理程序,并且在第24~27行進(jìn)行注冊(cè)。程序第30行啟動(dòng)該定時(shí)器,隨后
定時(shí)器每隔1秒超時(shí),定時(shí)器的超時(shí)處理程序打印出相關(guān)的信息。
?
總結(jié)
- 上一篇: 【转载】struts应用在断网情况下启动
- 下一篇: ORCFILE,ParquetFile,