1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<unistd.h>
4 #include<sys/time.h>
5 #include<signal.h>
6 #include<string.h>
7
8 #define BUFMAX 1024
9
10
11 static void alarm_handler(int s);
12
13
14 static int init_mod;
15 static struct sigaction oldact;
16 typedef void (*anytm_t)(void *s);
17 typedef struct myalarm{
18 int sec;
19 anytm_t anytm;
20 //void (*anytm_t)(void *s);
21 char * arg;
22 }tim_t;
23 static tim_t *buf[BUFMAX] = {};
24
25
26 //关闭闹钟
27 static void buf_break(void)
28 {
29 struct itimerval itv;
30 sigaction(SIGALRM,&oldact,NULL);
31 itv.it_interval.tv_sec = 0;
32 itv.it_interval.tv_usec = 0;
33 itv.it_value.tv_sec = 0;
34 itv.it_value.tv_usec = 0;
35 setitimer(ITIMER_REAL,&itv,NULL);
36 init_mod = 0;
37 }
38
39
40 static void func(void *s)
41 {
42 printf("%s",(char *)s);
43 fflush(NULL);
44
45 }
46
47 static void alarm_init(void)
48 {
49 struct itimerval itv;
50 itv.it_interval.tv_sec = 1;
51 itv.it_interval.tv_usec = 0;
52 itv.it_value.tv_sec = 1;
53 itv.it_value.tv_usec = 0;
54
55 struct sigaction act;
56 act.sa_handler = alarm_handler;
57 sigemptyset(&act.sa_mask);
58 act.sa_flags = 0;
59
60 setitimer(ITIMER_REAL,&itv,NULL);
61 sigaction(SIGALRM,&act,&oldact);
62 init_mod = 1;
63
64
65 }
66 static void alarm_handler(int s)
67 {
68 for(int i = 0;i < 1024;i++)
69 {
70 if(buf[i] != NULL)
71 {
72 buf[i]->sec--;
73 if(buf[i]->sec == 0)
74 {
75 buf[i]->anytm(buf[i]->arg);
76 free(buf[i]);
77 buf[i] = NULL;
78 }
79 }
80 }
81 }
82
83
84
85 static int time_init(int n,anytm_t anytm,void *p)
86 {
87 tim_t *t = NULL;
88 int i;
89 if(0==init_mod)
90 alarm_init();
91 t = malloc(sizeof(tim_t) + strlen(p));
92 if(t == NULL)
93 return -1;
94
95 for(int i = 0;i < BUFMAX;i++)
96 {
97 if(buf[i] == NULL)
98 {
99 break;
100 }
101 }
102 t->sec = n;
103 t->anytm = anytm;
104 strcpy(t->arg,(char *)p);
105 buf[i] = t;
106 return i;
107
108
109 }
110
111 void anytime_destroy(void)
112 {
113 buf_break();
114 for(int i = 0;i < 1024;i++)
115 {
116 if(buf[i] != NULL)
117 {
118 free(buf[i]);
119 buf[i] = NULL;
120 }
121 }
122 }
123
124
125
126 int main(void)
127 {
128 int i = 0;
129
130 time_init(2,func,"hello");
131 time_init(4,func,"world");
132 time_init(6,func,"uplooking");
133
134
135
136 while(1)
137 {
138 write(1,"*",1);
139 sleep(1);
140 i++;
141 if(i == 6)
142 anytime_destroy();
143
144
145
146 }
147
148
149 exit(0);
150 }