Linux setitimer()在同一进程中实现多个定时器
来源:互联网 发布:linux查看elf文件 编辑:程序博客网 时间:2024/06/05 05:10
通过链表与定时器的搭配,实现同一进程中多定时器
#define NULL 0
typedef struct{
int timer_type;
int timer_status;
struct timeval end_time;
process_fun fun;
long int time;
}ama_timer_t;
#define C_MS_TO_S 1000
#define C_US_TO_S 1000000
typedef enum{
C_BT_RUN_TIMER_ONE,
C_BT_RUN_TIMER_CYCLE
}ama_run_timer_type_e;
typedef enum{
C_BT_RUN_TIMER_OFF,
C_BT_RUN_TIMER_ON
}ama_run_timer_status_e;
typedef enum{
C_CONFIG_SUCCESS,
C_CONFIG_FALSE,
C_CONFIG_ENDS
}ma_event_result_e;
void (*process_fun)(void);
int get_timer_list_null_id(int* id);
int ama_time_compare(struct timeval* now_time,struct timeval* target_time);
void ama_endtime_process(struct timeval*start_time,long int time);
int ama_create_timer(int type,long int time,process_fun fun);
void am_destroy_timer(int id);
int am_timer_check(void);
Glist* timer_list;
1.int ama_create_timer(int type,long int time,process_fun fun)
{
ama_timer_t* time_info =NULL;
gettimeofday(&sys_time,NULL);
Glist* iterator;
time_info =(ama_timer_t*)ama_malloc(ama_timer_t);
if(time_info !=NULL){
count=get_timer_list_null_id(&(timer_info->id));
time_info->timer_type=type;
time_info->time=time;
time_info->fun=fun;
time_info->status=C_BT_RUN_TIMER_ON;
ama_endtime_process(&sys_time,time);
time_info->end_time.tv_sec= sys_time.tv_sec;
time_info->end_time.tv_usec= sys_time.tv_usec;
result= timer_info->id;
timer_list=g_list_insert(timer_list,count);
}else{
result=NULL;
}
return result;
}
2 void am_destroy_timer(int id)
{
Glist* iterator;
int list_count;
ama_timer_t* time_info =NULL;
list_count =g_list_length(timer_list);
if(list_count){
for(iterator =timer_list;iterator;iterator++){
time_info =(ama_timer_t*)iterator->data;
if(time_info->id ==id){
timer_list= g_list_remove(timer_list,time_info);
ama_free(time_info);
break;
}else{
}
}
}else{
}
}
3.int am_timer_check(void)
{
int result;
Glist* iterator;
int list_count;
ama_timer_t* time_info =NULL;
struct timeval sys_time;
result=C_BT_FALSE;
list_count =g_list_length(timer_list);
if(list_count){
return result;
}else{
}
gettimeofday(&sys_time,NULL);
for(iterator =timer_list;iterator;iterator++){
time_info =(ama_bt_timer_t*)iterator->data;
if(time_info->status==C_BT_RUN_TIMER_ON){
result=ama_time_compare(&sys_time,&(time_info->end_time));
if(result ==C_CONFIG_SUCCESS){
if(time_info->type==C_BT_RUN_TIMER_ONE){
time_info->status=C_BT_RUN_TIMER_OFF;
time_info->fun();
am_destroy_timer(time_info->id);
}elseif(time_info->type==C_BT_RUN_TIMER_CYCLE){
ama_endtime_process(&sys_time,&(time_info->time));
time_info->end_time.tv_sec= sys_time.tv_sec;
time_info->end_time.tv_usec= sys_time.tv_usec;
time_info->fun();
gettimeofday(&sys_time,NULL);
}else{
}
}
}else{
}
}
result=C_CONFIG_SUCCESS;
return result;
}
void ama_endtime_process(struct timeval*start_time,long int time)
{
start_time->tv_usec=(start_time->tv_usec+time*C_MS_TO_S)%C_US_TO_S;
start_time->tv_sec=start_time.tv->sec+(start_time->tv_usec+time*C_MS_TO_S)/C_US_TO_S;
}
int ama_time_compare(struct timeval* now_time,struct timeval* target_time)
{
int result;
if(now_time->tv_sec>target_time->tv_sec){
result=C_CONFIG_SUCCESS;
}elseif((now_time->tv_sec==target_time->tv_sec)&&(now_time->tv_usec>=target_time->tv_usec)){
result=C_CONFIG_SUCCESS;
}else{
result=C_CONFIG_FALSE;
}
return result;
}
int get_timer_list_null_id(int* id)
{
int list_count;
int result;
int tmp_id;
result=0;
tmp_id=0;
ama_timer_t* time_info =NULL;
list_count =g_list_length(timer_list);
if(list_count){
for(iterator =timer_list;iterator;iterator++){
time_info =(ama_bt_timer_t*)iterator->data;
if(time_info->id >(tmp_id+1)){
id[0]=tmp_id+1;
}else{
}
tmp_id++;
result++;
}
}else{
id[0]=1;
result=1;
}
if(list_count==result){
id[0]=result+1;
result=result+1;
}
return result;
}
void mian()
{
struct itimerval tick;
signal(SIGALRM, am_timer_check);
tick.it_value.tv_sec = 1; //1秒钟后将启动定时器
tick.it_value.tv_usec= 0;
// Interval time to run function
tick.it_interval.tv_sec = 0 ;
tick.it_interval.tv_usec =10000; //定时器启动后,每隔0.01s将执行相应的函数
setitimer(ITIMER_REAL, &tick, NULL); //setitimer将触发SIGALRM信号
while(1){
}
}
- Linux setitimer()在同一进程中实现多个定时器
- linux中定时器 setitimer()
- Linux下使用setitimer函数实现多个定时器的功能
- Linux setitimer()函数实现单个定时器
- linux定时器setitimer
- Linux 定时器setitimer()
- Linux 定时器setitimer()
- Linux 定时器setitimer()
- linux c setitimer定时器
- Linux定时器之setitimer()
- Linux定时器函数setitimer
- 编写一个程序库,实现定时器的功能,它能为用户提供在同一进程中多次使用的定时器。
- 基于setitimer实现允许单进程多次调用的定时器
- linux 同一终端开启多个进程
- Linux定时器——setitimer()
- linux定时器 --setitimer 的用法
- Linux定时器设置函数setitimer
- 【linux 开发】定时器使用setitimer
- 2015阿里校招前端在线题目
- 跳槽指南(1)----什么时候离职
- centos修改ssh端口
- 学ios需要了解的C语言基础知识-10-内外部函数,内外部变量
- HDU 4912 Paths on the tree 贪心+lca
- Linux setitimer()在同一进程中实现多个定时器
- 跳槽指南(2)--什么是好公司
- rac 中节点的vip在该节点启动不了,在其他节点正常启动。
- 学ios需要了解的C语言基础知识-11-C语言精华总结
- Android:下拉刷新完全解析
- linux tty driver 相关结构体 整理(tty driver 自己写出来之前保持更新)
- 第十章 10.4.3节练习
- 今日总结
- android系列:Toast用法