日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux下定时器使用

發布時間:2023/12/9 linux 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux下定时器使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

From: http://blog.csdn.net/gudulyn/article/details/885334


Linux下的定時器有兩種,以下分別介紹:

???????1、alarm
???????如果不要求很精確的話,用 alarm() 和 signal() 就夠了
???????????unsigned int alarm(unsigned int seconds)
???????專門為SIGALRM信號而設,在指定的時間seconds秒后,將向進程本身發送SIGALRM信號,又稱為鬧鐘時間。進程調用alarm后,任何以前的alarm()調用都將無效。如果參數seconds為零,那么進程內將不再包含任何鬧鐘時間。如果調用alarm()前,進程中已經設置了鬧鐘時間,則返回上一個鬧鐘時間的剩余時間,否則返回0。

???????示例:
???????#include <stdio.h>
???????#include <unistd.h>
???????#include <signal.h>

???????void sigalrm_fn(int sig)
???????{
???????????????/* Do something */
???????????????printf("alarm!/n");

???????????????alarm(2);
???????????????return;
???????}

???????int main(void)
???????{
???????????????signal(SIGALRM, sigalrm_fn);
???????????????alarm(2);

???????????????/* Do someting */
???????????????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 <stdlib.h> #include <unistd.h> #include <signal.h> #include <time.h> #include <sys/time.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;sec = 5;printf("process id is %d ", 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);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);while(1); }
??????  該例子的屏幕拷貝如下:

???????localhost:~$ ./timer_test
???????process id is 579
???????Catch a signal – SIGVTALRM
???????Catch a signal – SIGALRM
???????Catch a signal – SIGVTALRM
???????Catch a signal – SIGVTALRM
???????Catch a signal – SIGALRM
???????Catch a signal –GVTALRM


???????注意:Linux信號機制基本上是從Unix系統中繼承過來的。早期Unix系統中的信號機制比較簡單和原始,后來在實踐中暴露出一些問題,因此,把那些建立在早期機制上的信號叫做"不可靠信號",信號值小于SIGRTMIN(Red hat 7.2中,SIGRTMIN=32,SIGRTMAX=63)的信號都是不可靠信號。這就是"不可靠信號"的來源。它的主要問題是:進程每次處理信號后,就將對信號的響應設置為默認動作。在某些情況下,將導致對信號的錯誤處理;因此,用戶如果不希望這樣的操作,那么就要在信號處理函數結尾再一次調用signal(),重新安裝該信號。?

總結

以上是生活随笔為你收集整理的Linux下定时器使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。