偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

linux定時(shí)器的使用

系統(tǒng) Linux
使用定時(shí)器的目的無(wú)非是為了周期性的執(zhí)行某一任務(wù),或者是到了一個(gè)指定時(shí)間去執(zhí)行某一個(gè)任務(wù)。要達(dá)到這一目的,一般有兩個(gè)常見的比較有效的方法。

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

首先來(lái)看看linux操作系統(tǒng)為每一個(gè)進(jìn)程提供的3個(gè)內(nèi)部計(jì)時(shí)器。

ITIMER_REAL: 給一個(gè)指定的時(shí)間間隔,按照實(shí)際的時(shí)間來(lái)減少這個(gè)計(jì)數(shù),當(dāng)時(shí)間間隔為0的時(shí)候發(fā)出SIGALRM信號(hào)

ITIMER_VIRTUAL: 給定一個(gè)時(shí)間間隔,當(dāng)進(jìn)程執(zhí)行的時(shí)候才減少計(jì)數(shù),時(shí)間間隔為0的時(shí)候發(fā)出SIGVTALRM信號(hào)

ITIMER_PROF: 給定一個(gè)時(shí)間間隔,當(dāng)進(jìn)程執(zhí)行或者是系統(tǒng)為進(jìn)程調(diào)度的時(shí)候,減少計(jì)數(shù),時(shí)間到了,發(fā)出SIGPROF信號(hào),這個(gè)和ITIMER_VIRTUAL聯(lián)合,常用來(lái)計(jì)算系統(tǒng)內(nèi)核時(shí)間和用戶時(shí)間。

用到的函數(shù)有:

#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; /*時(shí)間間隔*/

struct timeval it_value; /*當(dāng)前時(shí)間計(jì)數(shù)*/

};

it_interval用來(lái)指定每隔多長(zhǎng)時(shí)間執(zhí)行任務(wù), it_value用來(lái)保存當(dāng)前時(shí)間離執(zhí)行任務(wù)還有多長(zhǎng)時(shí)間。比如說(shuō), 你指定it_interval為2秒(微秒為0),開始的時(shí)候我們把it_value的時(shí)間也設(shè)定為2秒(微秒為0),當(dāng)過(guò)了一秒, it_value就減少一個(gè)為1, 再過(guò)1秒,則it_value又減少1,變?yōu)?,這個(gè)時(shí)候發(fā)出信號(hào)(告訴用戶時(shí)間到了,可以執(zhí)行任務(wù)了),并且系統(tǒng)自動(dòng)把it_value的時(shí)間重置為it_interval的值,即2秒,再重新計(jì)數(shù)。

為了幫助你理解這個(gè)問(wèn)題,我們來(lái)看一個(gè)例子:

#include

#include

#include

#include

#include

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

static int len;

// 向標(biāo)準(zhǔn)錯(cuò)誤輸出信息,告訴用戶時(shí)間到了

void prompt_info(int signo)

{

write(STDERR_FILENO, msg, len);

}

// 建立信號(hào)處理機(jī)制

void init_sigaction(void)

{

struct sigaction tact;

/*信號(hào)到了要執(zhí)行的任務(wù)處理函數(shù)為prompt_info*/

tact.sa_handler = prompt_info;

tact.sa_flags = 0;

/*初始化信號(hào)集*/

sigemptyset(&tact.sa_mask);

/*建立信號(hào)處理機(jī)制*/

sigaction(SIGALRM, &tact, NULL);

#p#

}

void init_time()

{

struct itimerval value;

/*設(shè)定執(zhí)行任務(wù)的時(shí)間間隔為2秒0微秒*/

value.it_value.tv_sec = 2;

value.it_value.tv_usec = 0;

/*設(shè)定初始時(shí)間計(jì)數(shù)也為2秒0微秒*/

value.it_interval = value.it_value;

/*設(shè)置計(jì)時(shí)器ITIMER_REAL*/

setitimer(ITIMER_REAL, &value, NULL);

}

int main()

{

len = strlen(msg);

init_sigaction();

init_time();

while ( 1 );

exit(0);

}

該程序的ITMER_REAL定時(shí)器,每隔2秒鐘都會(huì)發(fā)送一個(gè)SIGALRM信號(hào),當(dāng)主函數(shù)接收到了這個(gè)信號(hào)之后,調(diào)用信號(hào)處理函數(shù)prompt_info在標(biāo)準(zhǔn)錯(cuò)誤上輸出time is running out這個(gè)字符串。

對(duì)于ITIMER_VIRTUAL和ITIMER_PROF的使用方法類似,當(dāng)你在setitimer里面設(shè)置的定時(shí)器為ITIMER_VIRTUAL的時(shí)候,你把sigaction里面的SIGALRM改為SIGVTALarm, 同理,ITIMER_PROF對(duì)應(yīng)SIGPROF。

不過(guò),你可能會(huì)注意到,當(dāng)你用ITIMER_VIRTUAL和ITIMER_PROF的時(shí)候,你拿一個(gè)秒表,你會(huì)發(fā)現(xiàn)程序輸出字符串的時(shí)間間隔會(huì)不止2秒,甚至5-6秒才會(huì)輸出一個(gè),至于為什么,自己好好琢磨一下^_^

下面我們來(lái)看看用sleep以及usleep怎么實(shí)現(xiàn)定時(shí)執(zhí)行任務(wù)。

#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#

/*向主進(jìn)程發(fā)送信號(hào),實(shí)際上是自己給自己發(fā)信號(hào)*/

sigqueue(getpid(), 50, tsval);

}

return 0;

}

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

下面我們來(lái)看看,通過(guò)自己計(jì)算時(shí)間差的方法來(lái)定時(shí):

#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;

/*獲取當(dāng)前時(shí)間*/

time(&nowtime);

/*和上一次的時(shí)間做比較,如果大于等于2秒,則立刻發(fā)送信號(hào)*/

if (nowtime - lasttime >= 2)

{

/*向主進(jìn)程發(fā)送信號(hào),實(shí)際上是自己給自己發(fā)信號(hào)*/

sigqueue(getpid(), 50, tsval);

lasttime = nowtime;

}

}

return 0;

}

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

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

【編輯推薦】

  1. Linux系統(tǒng)信息查看命令
  2. linux大掃盲:linux之Tar命令常用參數(shù)
  3. Linux系統(tǒng)巧用NMAP來(lái)收集主機(jī)信息
責(zé)任編輯:趙寧寧 來(lái)源: chinaitlab
相關(guān)推薦

2018-11-02 08:10:58

Linuxsystemd定時(shí)器

2021-08-03 14:33:53

cron定時(shí)器Linux命令

2023-12-11 09:50:35

Linux定時(shí)器

2023-01-10 13:53:21

Linux定時(shí)器

2010-07-28 15:56:22

FlexTimer定時(shí)

2021-04-18 12:12:29

systemd定時(shí)器系統(tǒng)運(yùn)維

2021-08-11 10:10:26

Linux定時(shí)器數(shù)組

2022-11-02 11:40:16

Flowable定時(shí)器流程

2011-04-21 10:49:28

Linux時(shí)間定時(shí)器

2021-06-28 06:00:11

systemd定時(shí)器系統(tǒng)運(yùn)維

2018-12-03 12:20:52

Systemd定時(shí)器Linux

2009-04-12 08:51:50

Symbian諾基亞移動(dòng)OS

2011-02-23 10:20:45

2013-07-29 10:10:40

TCP協(xié)議TCP定時(shí)器TCP

2021-03-31 08:33:17

SysTick定時(shí)器SysTick定時(shí)器

2021-07-27 16:01:29

高并發(fā)定時(shí)器高性能

2021-08-26 06:29:47

STM32DWT數(shù)據(jù)觀察點(diǎn)觸發(fā)

2010-03-12 19:49:11

python 定時(shí)器

2022-05-06 16:12:40

定時(shí)器CSS前端

2017-02-28 17:18:34

Linux驅(qū)動(dòng)技術(shù)內(nèi)核定時(shí)器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)