刘赤 myalarm 3-22

  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 }

猜你喜欢

转载自www.cnblogs.com/LC18330852893/p/10581269.html