仪陇家园分类信息网、仪陇生活网、仪陇家园网

搜索

linux C 基于链表链的定时器

[复制链接]
seo 发表于 2022-5-31 13:28:56 | 显示全部楼层 |阅读模式
linux C 基于链表链的定时器发布时间:2022/5/31 13:16:54
            
                                                       
                                                       
            
        
        
               
                    
源码如下:

util_timer.h




#ifndef LST_TIMER

#define LST_TIMER





#include

#include

#include

#include









#define BUFFER_SIZE 64

struct util_timer;





/*

struct client_data{


sockaddr_in address;


int sockfd;


char buf[BUFFER_SIZE];


util_timer * timer;

};

*/





struct util_timer{


time_t expire;

//
  client_data * user_data;


char *buffer;


struct util_timer *prev;


struct util_timer *next;

};





struct timer_lst{


struct util_timer * head;


struct util_timer * tail;

};









void cb_func(unsigned char *userdata);

void add_timer2(struct util_timer * timer, struct util_timer *lst_head);

void add_timer(struct util_timer *timer);

void adjust_timer(struct util_timer *timer);

void del_timer(struct util_timer * timer);

void tick();





#endif






util_timer.c

#include "util_timer.h"





struct util_timer * head;

struct util_timer * tail;









void print_hex_ex(unsigned char *buf, int len)

{

     int i, n;

     printf("            0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F");

     n = 0;

     for (i=0; iprintf("\nlens:%d\n\n",len);

}





void cb_func(unsigned char *userdata){


print_hex_ex(userdata, 8);


return;

}





void add_timer2(struct util_timer * timer, struct util_timer * lst_head){


struct util_timer * prev = lst_head;


struct util_timer * tmp = prev->next;


while(tmp){


if(timer->expire expire ){


prev->next = timer;


timer->next =tmp;


tmp->prev = timer;


timer->prev = prev;


break;


}


prev = tmp;


tmp = tmp->next;


}


if(!tmp){


prev->next = timer;


timer->prev = prev;


timer->next = NULL;


tail = timer;


}




}





void add_timer(struct util_timer *timer){


if(!timer){


return;
   


}





if(!head){


head = tail = timer;


return ;


}





if(timer->expire expire){


timer->next = head;


head->prev = timer;


head = timer;





return;


}





add_timer2(timer, head);




}





void adjust_timer(struct util_timer *timer){


if(!timer){


return;


}


struct util_timer * tmp = timer->next;


if(!tmp || (timer->expire expire)){


return;


}


if(timer == head){


head = head->next;


head->prev = NULL;


timer->next = NULL;


add_timer2(timer, head);


}else{


timer->prev->next = timer->next;


timer->next->prev = timer->prev;


add_timer2(timer, timer->next);


}




}





void del_timer(struct util_timer * timer){


if(!timer){


return;


}


if((timer == head) && (timer == tail)){


free(timer);


head = NULL;


tail = NULL;


return;


}


if(timer == head){


head = head->next;


head->prev = NULL;


free(timer);


return;


}


if(timer == tail){


tail = tail ->prev;


tail->next = NULL;


free(timer);


return;


}





timer->prev->next = timer->next;

     timer->next->prev = timer->prev;


free(timer);




}





void tick(){


if( !head )

      {

         return;

      }

      printf( "timer tick\n" );

      time_t cur = time( NULL );

      struct util_timer* tmp = head;

      while( tmp )

      {

          if( cur expire )

          {


printf("tmp->expire is not chaoshi\n");

              break;

          }


cb_func( tmp->buffer );

          head = tmp->next;

          if( head )

          {

              head->prev = NULL;

          }

          free(tmp);

          tmp = head;

      }




}













int main(){


int i;


char *tmpbuf[5]={"aaaaaaaa","bbbbbbbb","cccccccc","dddddddd","eeeeeeee"};


head = NULL;


tail = NULL;


time_t cur = time(NULL);


for(i = 0; i


struct util_timer *timer = NULL ;


timer = (struct util_timer *)malloc(sizeof(struct util_timer)*1);


cur = cur + 1;


timer->expire = cur;


timer->buffer = tmpbuf;


add_timer(timer);


}





printf("sleep begin \n");


sleep(3);


printf("sleep end \n");





tick();

}






编译gcc -o util_timer util_timer.c

运行./util_timer

输出:

[root@hsm timer_test]# ./util_timer

sleep begin

sleep end

timer tick

             0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F

00000000h: 61 61 61 61 61 61 61 61

lens:8





             0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F

00000000h: 62 62 62 62 62 62 62 62

lens:8





             0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F

00000000h: 63 63 63 63 63 63 63 63

lens:8





tmp->expire is not chaoshi






总结:链表共五个节点,每个节点相差1秒,按时间大小升序排列,链表头时间节点最小,依次递增。tick函数只处理链表中已经超时的节点,并打印buffer里的值。当休眠3秒时,链表中的前3个节点已经超时,剩下的2个节点没有超时,所以只打印前三个节点。



               
        
        
   
            
        
        
回复

使用道具 举报

全部回复0 显示全部楼层

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

楼主

审核员

热门推荐

联系客服 关注微信 下载APP 返回顶部 返回列表