1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <sys/types.h> 5 #include <unistd.h> 6 #include <errno.h> 7 #include <signal.h> 8 #include <sys/time.h> 9 10 #define ALARM_MAX 1024 11 12 typedef struct 13 { 14 int real_sec; 15 int sec; 16 void (*any)(void *s); 17 void *str; 18 }alarm_t; 19 20 static alarm_t *alarm_list[ALARM_MAX]={}; 21 static int flg=0; //第一次调用标志 22 23 int myalarm(int sec,void (*any)(void *s), void *p); 24 static void handler(int s); 25 static int init_alarm(void); 26 static int get_pos(void); 27 28 void any1(void *p) 29 { 30 printf("%s",(char *)p); 31 fflush(NULL); 32 } 33 void any2(void *p) 34 { 35 printf("%s",(char *)p); 36 fflush(NULL); 37 } 38 void any3(void *p) 39 { 40 printf("%s",(char *)p); 41 fflush(NULL); 42 } 43 44 int main(void) 45 { 46 myalarm(3, any1,"hello"); 47 myalarm(2, any2,"world"); 48 myalarm(5, any3,"aque"); 49 50 while(1) 51 { 52 write(1,"*",1); 53 sleep(1); 54 } 55 exit(0); 56 } 57 58 59 //信号行为 60 void handler(int s) 61 { 62 63 for(int i=0; alarm_list[i] !=NULL; i++) 64 { 65 if(--(alarm_list[i]->real_sec) == 0) 66 { 67 //实时秒数更新 68 alarm_list[i]->real_sec = alarm_list[i]->sec; 69 //调用用户函数 70 alarm_list[i]->any (alarm_list[i]->str); 71 } 72 } 73 } 74 75 //闹钟信号初始化 76 static int init_alarm(void) 77 { 78 struct itimerval itv; 79 struct sigaction act; 80 81 act.sa_handler=handler; 82 act.sa_flags=0; 83 84 //信号集赋空 85 if(sigemptyset(&act.sa_mask)==-1) 86 return -1; 87 //信号行为注册 88 if(sigaction(SIGALRM,&act,NULL)) 89 return -1; 90 91 itv.it_interval.tv_sec=1; 92 itv.it_interval.tv_usec=0; 93 itv.it_value.tv_sec=1; 94 itv.it_value.tv_usec=0; 95 96 //alarm 初始化 97 if(setitimer(ITIMER_REAL, &itv, NULL)==-1) 98 return -1; 99 return 0; 100 } 101 102 //获取闹钟索引 103 static int get_pos(void) 104 { 105 int i; 106 //查找没有使用索引 107 for (i = 0; alarm_list[i] != NULL; i++) 108 { 109 } 110 //达到上限 111 if (i == ALARM_MAX) 112 { 113 return -1; 114 } 115 116 return i; 117 } 118 119 /*.闹钟创建*/ 120 int myalarm(int sec,void (*any)(void *s), void *p) 121 { 122 int i; 123 124 //闹钟信号初始化 125 if(flg==0) 126 { 127 if(init_alarm()==-1) 128 return -1; //初始化失败,闹钟队列满。 129 flg=1; 130 } 131 //获取闹钟索引 132 i=get_pos(); 133 if(i==-1) 134 { 135 return -2; 136 } 137 //开辟闹钟配置 空间 138 alarm_list[i]=malloc(sizeof(alarm_t)); 139 if(alarm_list[i]==NULL) 140 { 141 return -3; //空间开辟失败 142 } 143 //闹钟参数初始化 144 alarm_list[i]->any=any; 145 alarm_list[i]->sec=sec; 146 alarm_list[i]->real_sec=sec; 147 alarm_list[i]->str=p; 148 149 return 0; 150 }
刘赤 myalarm 3-22
猜你喜欢
转载自www.cnblogs.com/LC18330852893/p/10581269.html
今日推荐
周排行