成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

linux定時器的使用

系統 Linux
使用定時器的目的無非是為了周期性的執行某一任務,或者是到了一個指定時間去執行某一個任務。要達到這一目的,一般有兩個常見的比較有效的方法。

使用定時器的目的無非是為了周期性的執行某一任務,或者是到了一個指定時間去執行某一個任務。要達到這一目的,一般有兩個常見的比較有效的方法。一個是用linux內部的三個定時器,另一個是用sleep, usleep函數讓進程睡眠一段時間,其實,還有一個方法,那就是用gettimeofday, difftime等自己來計算時間間隔,然后時間到了就執行某一任務,但是這種方法效率低,所以不常用。

首先來看看linux操作系統為每一個進程提供的3個內部計時器。

ITIMER_REAL: 給一個指定的時間間隔,按照實際的時間來減少這個計數,當時間間隔為0的時候發出SIGALRM信號

ITIMER_VIRTUAL: 給定一個時間間隔,當進程執行的時候才減少計數,時間間隔為0的時候發出SIGVTALRM信號

ITIMER_PROF: 給定一個時間間隔,當進程執行或者是系統為進程調度的時候,減少計數,時間到了,發出SIGPROF信號,這個和ITIMER_VIRTUAL聯合,常用來計算系統內核時間和用戶時間。

用到的函數有:

#include

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

int setitimer(int which, struct itimerval*newvalue, struct itimerval* oldvalue);

strcut timeval

{

long tv_sec; /*秒*/

long tv_usec; /*微秒*/

};

struct itimerval

{

struct timeval it_interval; /*時間間隔*/

struct timeval it_value; /*當前時間計數*/

};

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秒,再重新計數。

為了幫助你理解這個問題,我們來看一個例子:

#include

#include

#include

#include

#include

static char msg[] = "time is running out\n";

static int len;

// 向標準錯誤輸出信息,告訴用戶時間到了

void prompt_info(int signo)

{

write(STDERR_FILENO, msg, len);

}

// 建立信號處理機制

void init_sigaction(void)

{

struct sigaction tact;

/*信號到了要執行的任務處理函數為prompt_info*/

tact.sa_handler = prompt_info;

tact.sa_flags = 0;

/*初始化信號集*/

sigemptyset(&tact.sa_mask);

/*建立信號處理機制*/

sigaction(SIGALRM, &tact, NULL);

#p#

}

void init_time()

{

struct itimerval value;

/*設定執行任務的時間間隔為2秒0微秒*/

value.it_value.tv_sec = 2;

value.it_value.tv_usec = 0;

/*設定初始時間計數也為2秒0微秒*/

value.it_interval = value.it_value;

/*設置計時器ITIMER_REAL*/

setitimer(ITIMER_REAL, &value, NULL);

}

int main()

{

len = strlen(msg);

init_sigaction();

init_time();

while ( 1 );

exit(0);

}

該程序的ITMER_REAL定時器,每隔2秒鐘都會發送一個SIGALRM信號,當主函數接收到了這個信號之后,調用信號處理函數prompt_info在標準錯誤上輸出time is running out這個字符串。

對于ITIMER_VIRTUAL和ITIMER_PROF的使用方法類似,當你在setitimer里面設置的定時器為ITIMER_VIRTUAL的時候,你把sigaction里面的SIGALRM改為SIGVTALarm, 同理,ITIMER_PROF對應SIGPROF。

不過,你可能會注意到,當你用ITIMER_VIRTUAL和ITIMER_PROF的時候,你拿一個秒表,你會發現程序輸出字符串的時間間隔會不止2秒,甚至5-6秒才會輸出一個,至于為什么,自己好好琢磨一下^_^

下面我們來看看用sleep以及usleep怎么實現定時執行任務。

#include

#include

#include

#include

static char msg[] = "I received a msg.\n";

int len;

void show_msg(int signo)

{

write(STDERR_FILENO, msg, len);

}

int main()

{

struct sigaction act;

union sigval tsval;

act.sa_handler = show_msg;

act.sa_flags = 0;

sigemptyset(&act.sa_mask);

sigaction(50, &act, NULL);

len = strlen(msg);

while ( 1 )

{

sleep(2); /*睡眠2秒*/

#p#

/*向主進程發送信號,實際上是自己給自己發信號*/

sigqueue(getpid(), 50, tsval);

}

return 0;

}

看到了吧,這個要比上面的簡單多了,而且你用秒表測一下,時間很準,指定2秒到了就給你輸出一個字符串。所以,如果你只做一般的定時,到了時間去執行一個任務,這種方法是最簡單的。

下面我們來看看,通過自己計算時間差的方法來定時:

#include

#include

#include

#include

#include

static char msg[] = "I received a msg.\n";

int len;

static time_t lasttime;

void show_msg(int signo)

{

write(STDERR_FILENO, msg, len);

}

int main()

{

struct sigaction act;

union sigval tsval;

act.sa_handler = show_msg;

act.sa_flags = 0;

sigemptyset(&act.sa_mask);

sigaction(50, &act, NULL);

len = strlen(msg);

time(&lasttime);

while ( 1 )

{

time_t nowtime;

/*獲取當前時間*/

time(&nowtime);

/*和上一次的時間做比較,如果大于等于2秒,則立刻發送信號*/

if (nowtime - lasttime >= 2)

{

/*向主進程發送信號,實際上是自己給自己發信號*/

sigqueue(getpid(), 50, tsval);

lasttime = nowtime;

}

}

return 0;

}

這個和上面不同之處在于,是自己手工計算時間差的,如果你想更精確的計算時間差,你可以把 time 函數換成gettimeofday,這個可以精確到微妙。

上面介紹的幾種定時方法各有千秋,在計時效率上、方法上和時間的精確度上也各有不同,采用哪種方法,就看你程序的需要了。

【編輯推薦】

  1. Linux系統信息查看命令
  2. linux大掃盲:linux之Tar命令常用參數
  3. Linux系統巧用NMAP來收集主機信息
責任編輯:趙寧寧 來源: chinaitlab
相關推薦

2018-11-02 08:10:58

Linuxsystemd定時器

2021-08-03 14:33:53

cron定時器Linux命令

2023-12-11 09:50:35

Linux定時器

2023-01-10 13:53:21

Linux定時器

2010-07-28 15:56:22

FlexTimer定時

2021-04-18 12:12:29

systemd定時器系統運維

2022-11-02 11:40:16

Flowable定時器流程

2021-08-11 10:10:26

Linux定時器數組

2011-04-21 10:49:28

Linux時間定時器

2021-06-28 06:00:11

systemd定時器系統運維

2018-12-03 12:20:52

Systemd定時器Linux

2009-04-12 08:51:50

Symbian諾基亞移動OS

2011-02-23 10:20:45

2021-03-31 08:33:17

SysTick定時器SysTick定時器

2013-07-29 10:10:40

TCP協議TCP定時器TCP

2021-07-27 16:01:29

高并發定時器高性能

2021-08-26 06:29:47

STM32DWT數據觀察點觸發

2010-03-12 19:49:11

python 定時器

2022-05-06 16:12:40

定時器CSS前端

2017-02-28 17:18:34

Linux驅動技術內核定時器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩一区在线观看视频 | 久久久精彩视频 | 欧美精品久久久 | 久久久久久美女 | 欧美一区不卡 | 精品久久香蕉国产线看观看亚洲 | 欧美国产免费 | 亚洲成人免费av | 久久精品中文字幕 | 中文字幕在线一区 | 高清免费av| 一区二区三区国产 | 日韩一区二 | 少妇性l交大片免费一 | 久亚州在线播放 | 中文字幕日韩一区 | 精品久久久久久久 | 精产嫩模国品一二三区 | 麻豆一区| 欧美日韩国产在线观看 | 91在线成人 | 一级黄色播放 | 久久精品国产久精国产 | 国产日韩欧美在线 | 一级黄色片免费 | 青青草国产在线观看 | 91精品国产91久久久久久最新 | 久久亚洲欧美日韩精品专区 | 一区二区三区四区视频 | 国产成人艳妇aa视频在线 | 日本a视频 | 欧美成人激情 | 国产精品久久777777 | 黄色av网站在线观看 | 亚洲欧美另类在线 | 东方伊人免费在线观看 | 婷婷91| 亚洲444eee在线观看 | 久久免费精品视频 | 99在线免费观看 | 欧美午夜视频 |