seo 发表于 2022-5-31 13:28:56

linux C 基于链表链的定时器

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;


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("            0123456789ABCDEF");

   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={"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

输出:

# ./util_timer

sleep begin

sleep end

timer tick

             0123456789ABCDEF

00000000h: 61 61 61 61 61 61 61 61

lens:8





             0123456789ABCDEF

00000000h: 62 62 62 62 62 62 62 62

lens:8





             0123456789ABCDEF

00000000h: 63 63 63 63 63 63 63 63

lens:8





tmp->expire is not chaoshi






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



               
      
      
   
            
      
      
https://www.yilongzhijia.cn/tupian/seo365t.jpg
页: [1]
查看完整版本: linux C 基于链表链的定时器