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

歡迎訪問 生活随笔!

生活随笔

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

linux

Linux 定时器设置

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

函數alarm設置的定時器只能精確到秒,而以下函數理論上可以精確到微妙:

#include <sys/select.h>

#include <sys/time.h>

int getitimer(int which, struct itimerval*value);

int setitimer(int which, const structitimerval *value, struct itimerval *ovalue);

函數setitimer可以提供三種定時器,它們相互獨立,任意一個定時完成都將發送定時信號到進程,并且自動重新計時。參數which確定了定時器的類型,信號發送ITIMER_REAL 定時真實時間,與alarm類型相同。 SIGALRM ITIMER_VIRT 定時進程在用戶態下的實際執行時間。SIGVTALRMITIMER_PROF 定時進程在用戶態和核心態下的實際執行時間。 SIGPROF 這三種定時器定時完成時給進程發送的信號各不相同,其中ITIMER_REAL類定時器發送SIGALRM信號,ITIMER_VIRT類定時器發送SIGVTALRM信號,ITIMER_REAL類定時器發送SIGPROF信號。

函數alarm本質上設置的是低精確、非重載的ITIMER_REAL類定時器,它只能精確到秒,并且每次設置只能產生一次定時。函數setitimer設置的定時器則不同,它們不但可以計時到微妙(理論上),還能自動循環定時。

在一個Unix進程中,不能同時使用alarm和ITIMER_REAL類定時器。

結構itimerval描述了定時器的組成:

struct itimerval {???

struct tim. it_interval;??? /* 下次定時取值 */???

struct tim. it_value;?????? /* 本次定時設置值 */

}???

結構tim.描述了一個精確到微妙的時間:

struct tim. {???

long???tv_sec;???????????????? /* 秒(1000000微秒) */???

long???tv_usec;???????????????? /* 微妙 */

}

函數setitimer設置一個定時器,參數value指向一個itimerval結構,該結構決定了設置的定時器信息,結構成員it_value指定首次定時的時間,結構成員it_interval指定下次定時的時間。定時器工作時,先將it_value的時間值減到0,發送一個信號,再將it_value賦值為it_interval的值,重新開始定時,如此反復。如果it_value值被設置為0,則定時器停止定時;如果it_value值不為0但it_interval值為0,則定時器在一次定時后終止。函數setitimer調用成功時返回0,否則返回-1,參數ovalue如果不為空,返回上次的定時器狀態。函數getitimer獲取當前的定時器狀態,整型參數which指定了讀取的定時器類型,參數value返回定時器狀態。函數調用成功返回0,否則返回-1。

?

?

例1.???????????設置一個定時器,每2.5秒產生一個SIGALRM信號。

答:將itimerval結構的成員it_interval和成員it_value均賦值為2.5秒即可:

Struct itimerval value;

value.it_value.tv_sec=2;

value.it_value.tv_usec=500000;

value.it_interval.tv_sec=2;

value.it_interval.tv_usec=500000;

setitimer(ITIMER_REAL, &value, NULL);

函數setitimer設置的定時器可以重復定時,無需多次調用。

例2.???????????設置一個定時器,進程在用戶態下執行1秒鐘后發出首次信號,以后進程每在用戶態下執行3秒鐘,發送一個信號。

答:將itimerval結構的成員it_value均賦值為1秒,成員it_interval賦值為3秒即可:structitimerval value;

value.it_value.tv_sec=1;

value.it_value.tv_usec=0;

value.it_interval.tv_sec=3;

value.it_interval.tv_usec=0;

setitimer(ITIMER_VIRT, &value, NULL);

例3.???????????取消一個ITIMER_PROF類定時器。

答:將itimerval結構的成員it_value均賦值為0秒即可:

struct itimerval value;

value.it_value.tv_sec=1;

value.it_value.tv_usec=0;

setitimer(ITIMER_PROF, &value, NULL);

例4.???????????設置一個定時1.5秒的真實時間定時器,它僅發送一次信號就自動取消。

答:將itimerval結構的成員it_value均賦值為1.5秒,成員it_interval賦值為0秒即可:struct itimerval value;

value.it_value.tv_sec=1;

value.it_value.tv_usec=500000;

value.it_interval.tv_sec=0;

value.it_interval.tv_usec=0;

setitimer(ITIMER_REAL, &value, NULL);

?

精確定時器實例

本處設計了一個精確定時器的例子,進程每隔1.5秒數發送定時信號SIGPROF,在接收到信號時將打印定時的次數,用戶可以鍵入CTRL_C或DELETE結束程序

?

#include <sys/select.h>

#include <sys/time.h>

#include <stdio.h>

#include <unistd.h>

#include <signal.h>

int n = 0;

void timefunc(int sig)????????????????????? /* 定時事件代碼 */

{???

fprintf(stderr,"ITIMER_PROF[%d]\n", n++);

}

void main()

{???

struct itimervalvalue;???

value.it_value.tv_sec=1;???????? ???????/* 定時1.5秒 */???

value.it_value.tv_usec=500000;???

value.it_interval.tv_sec=1;???????????? /* 定時1.5秒 */??? value.it_interval.tv_usec=500000;???

signal(SIGALRM,timefunc);???????? /* 捕獲定時信號 */???

setitimer(ITIMER_REAL,&value, NULL);?? /* 定時開始 */???

while (1);

}

總結

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

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