Linux間隔定時器的使用 探索一

2021-06-16 05:23:52 字數 2786 閱讀 8765

2023年1月17日

之前看《高階unix程式設計》說有基本定時器與高階定時器之分

好像基本定時器不符合我的要求,那麼就先來個高階的吧。

寫個**看看會有什麼發生:

2023年1月18日

看下timer_create函式

int t1;

timer_t tm_id;//timer_t其實是個long型

t1 = timer_create(clock_realtime, null, &tm_id);

cout << "timer_create return "

<< t1 << endl;

cout << "tm_id"

<< tm_id << endl;

int t2;

timer_t tm_id2;//timer_t其實是個long型

t2 = timer_create(clock_realtime, null, &tm_id2);

cout << "timer_create return "

<< t2 << endl;

cout << "tm_id"

<< tm_id2 << endl;

可看到輸出的第乙個time_id是0,第二個是1,其實就是用數字標識timerid啦。

2023年1月21日

今天終於試驗出了個timer的用法:

下面是**:

#include 

#include

#include

using std::cout;

using std::endl;

void alrm_handler(int i)

int main()

makefile檔案:

# # # # # # # # # # # # # # # # # # # # #

#  makefile for pafone, general use

#                       2011.01.18

# # # # # # # # # # # # # # # # # # # # #

libs = -lrt

objs = main.o

target = timer

#gcflags :compile flags, gdflags: link flags

gcflags =

gdflags =

gcc  = g++

all : $(objs)

$(gcc) -o $(target) $(objs) $(libs)

@echo "compile success"

%.o : %.cpp

$(gcc) $(gcflags) -c $< -o $@

clean :

rm -f $(target) $(objs)

編譯執行後的輸出:

[root@pafone timer]# ./timer

timer_create return 0

tm_id0

timer_create return 0

tm_id1

set the timer 0: 5s

set timer 1: 3s

settime : 1295597124s

timer interrupt 14

settime : 1295597127s

timer interrupt 14

settime : 1295597129s

timer interrupt 14

settime : 1295597130s

timer interrupt 14

settime : 1295597133s

其中有乙個是5s,另乙個是3s的,但alrm_handler(int i)  函式傳入來的i都是14,怎麼區分是哪個定時器呢?    man 7 signal 發現裡面的說明有說到handler的傳入引數便是訊號sigalrm的#define值。

那麼用sigacton可不可以區分是哪個定時器呢?還是一定要通過傳送不同的訊號來區分定時器?

注:訊號會中斷一些阻塞呼叫及sleep()函式,例如將while(1)改為sleep()

itmspec.it_interval.tv_sec = 3;

itmspec.it_interval.tv_nsec = 0;

itmspec.it_value.tv_sec = 3;

itmspec.it_value.tv_nsec = 0;

timer_settime(tm_id2, null,&itmspec,null);

sleep(100);

輸出是:

[root@pafone timer]# ./timer

timer_create return 0

tm_id0

timer_create return 0

tm_id1

set the timer 0: 5s

set timer 1: 3s

settime : 1295599530s

timer interrupt 14

settime : 1295599533s

[root@pafone timer]#

即它會在第乙個定時訊號後返回,也就是定時訊號中斷了sleep.

如用用sigaction, 其它一些系統呼叫可以設定sa_restart使呼叫繼續,但對sleep不起作用。

間隔定時器itimer

間隔定時器的介面如下 include int getitimer int which,struct itimerval curr value int setitimer int which,const struct itimerval new value,struct itimerval old v...

Linux定時器的使用

使用定時器的目的無非是為了週期性的執行某一任務,或者是到了乙個指定時間去執行某乙個任務。要達到這一目的,一般有兩個常見的比較有效的方法。乙個是用linux內部的三個定時器,另乙個是用sleep,usleep函式讓程序睡眠一段時間,使用alarm定時發出乙個訊號,還有那就是用gettimeofday,...

linux定時器的使用

使用定時器的目的無非是為了週期性的執行某一任務,或者是到了乙個指定時間去執行某乙個任務。要達到這一目的,一般有兩個常見的比較有效的方法。一 個是用linux內部的三個定時器,另乙個是用sleep,usleep函式讓程序睡眠一段時間,其實,還有乙個方法,那就是用gettimeofday,difftim...