国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Linux > 正文

淺談linux幾種定時函數的使用

2019-11-02 16:23:16
字體:
來源:轉載
供稿:網友

在程序開發過程中,我們時不時要用到一些定時器,通常如果時間精度要求不高,可以使用sleep,uslepp函數讓進程睡眠一段時間來實現定時,

前者單位為秒(s),后者為微妙(us);但有時候我們又不想讓進程睡眠阻塞在哪兒,我們需要進程正常執行,當到達規定的時間時再去執行相應的操作,

在linux下面我們一般使用alarm函數跟setitimer函數來實現定時功能;

下面對這兩個函數進行詳細分析:

(1)alarm函數

alarm也稱為鬧鐘函數,它可以在進程中設置一個定時器,當定時器指定的時間到時,它向進程發送SIGALRM信號;

alarm函數原型如下:

unsigned int alarm(unsigned int seconds);//seconds 為指定的秒數

所需頭文件

  #include<unistd.h>

函數原型

  unsigned int alarm(unsigned int seconds)

函數參數

  seconds:指定秒數

函數返回值

  成功:如果調用此alarm()前,進程已經設置了鬧鐘時間,則返回上一個鬧鐘時間的剩余時間,否則返回0。

  出錯:-1

下面是alarm()函數的簡單例子:

void sigalrm_fn(int sig)   {   printf("alarm!/n");   alarm(2);   return; }  int main(void)  {   signal(SIGALRM, sigalrm_fn); //后面的函數必須是帶int參數的  alarm(1);   while(1)    pause();  }

(2)setitimer()函數

在linux下如果對定時要求不太精確的話,使用alarm()和signal()就行了,但是如果想要實現精度較高的定時功能的話,就要使用setitimer函數。

setitimer()為Linux的API,并非C語言的Standard Library,setitimer()有兩個功能,一是指定一段時間后,才執行某個function,二是每間格一段時間就執行某個function;

Linux為每個任務安排了3個內部定時器:

ITIMER_REAL:實時定時器,不管進程在何種模式下運行(甚至在進程被掛起時),它總在計數。定時到達,向進程發送SIGALRM信號。

ITIMER_VIRTUAL:這個不是實時定時器,當進程在用戶模式(即程序執行時)計算進程執行的時間。定時到達后向該進程發送SIGVTALRM信號。

ITIMER_PROF:進程在用戶模式(即程序執行時)和核心模式(即進程調度用時)均計數。定時到達產生SIGPROF信號。ITIMER_PROF記錄的時間比ITIMER_VIRTUAL多了進程調度所花的時間。

定時器在初始化是,被賦予一個初始值,隨時間遞減,遞減至0后發出信號,同時恢復初始值。在任務中,我們可以一種或者全部三種定時器,但同一時刻同一類型的定時器只能使用一個。

setitimer函數原型如下:

#include <sys/time.h>    int setitimer(int which, const struct itimerval *new_value,           struct itimerval *old_value); Timer values are defined by the following structures:      struct itimerval {        struct timeval it_interval; /* next value */        struct timeval it_value;  /* current value */      };      struct timeval {        time_t   tv_sec;     /* seconds */        suseconds_t tv_usec;    /* microseconds */      };

it_interval用來指定每隔多長時間執行任務, it_value用來保存當前時間離執行任務還有多長時間。比如說, 你指定it_interval為2秒(微秒為0),開始的時候我們把it_value的時間也設定為2秒(微秒為0),當過了一秒, it_value就減少一個為1, 再過1秒,則it_value又減少1,變為0,這個時候發出信號(告訴用戶時間到了,可以執行任務了),并且系統自動把it_value的時間重置為 it_interval的值,即2秒,再重新計數

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 鄂温| 旌德县| 颍上县| 科尔| 景德镇市| 东乡| 平和县| 靖西县| 龙泉市| 苍山县| 门头沟区| 寻乌县| 林西县| 林周县| 溧水县| 龙胜| 洛阳市| 河间市| 于都县| 理塘县| 祁门县| 潮安县| 安西县| 望奎县| 滕州市| 睢宁县| 涟源市| 泰州市| 明水县| 馆陶县| 桃园市| 上虞市| 印江| 安阳县| 岫岩| 农安县| 无为县| 玉环县| 南城县| 无为县| 搜索|