2019-3-23
makefile
1 main : main.o myalarm.o
2 gcc main.o myalarm.o -o main
3 clean :
4 rm -rf *.o main
main.c
1 #include "myalarm.h"
2
3 static void any3(void *s)
4 {
5 printf("%s", (char *)s);
6 fflush(NULL);
7 }
8
9 static void any2(void *s)
10 {
11 printf("%s", (char *)s);
12 fflush(NULL);
13 }
14
15 static void any1(void *s)
16 {
17 printf("%s", (char *)s);
18 fflush(NULL);
19 }
20
21 int main(void)
22 {
23 myalarm(3, any1, "hello");
24 myalarm(2, any2, "world");
25 myalarm(5, any3, "apue");
26
27 while(1)
28 {
29 write(1, "*", 1);
30 sleep(1);
31 }
32
33 return 0;
34 }
myalarm.h
1 #ifndef __MYALARM_H
2 #define __MYALARM_H
3
4 #define MAXALARM 1024
5
6 void myalarm(int sec, void (*handler)(void *s), char *p);
7
8 #endif
myalarm.c
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <signal.h>
4 #include <string.h>
5 #include <sys/time.h>
6 #include <unistd.h>
7 #include <errno.h>
8
9 #include "myalarm.h"
10
11 typedef struct {
12 int sec;
13 void (*handler)(void *s);
14 char s[30];
15 }ar;
16
17 static ar *arr[MAXALARM];
18 static int inited;
19
20 static int get_pos(void)
21 {
22 for(int i = 0; i < MAXALARM; i++)
23 {
24 if(arr[i] == NULL)
25 {
26 return i;
27 }
28 }
29 }
30
31 static void print(int i)
32 {
33 (arr[i]->handler)(arr[i]->s);
34 arr[i] = NULL;
35 free(arr[i]);
36 }
37
38 static void handleri(int s)
39 {
40 for(int i = 0; i < MAXALARM; i++)
41 {
42 if(arr[i] != NULL)
43 {
44 arr[i]->sec -= 1;
45 // sleep(arr[i]->sec);
46 if(arr[i]->sec == 0)
47 print(i);
48 }
49 }
50 }
51
52 static void statdo(void)
53 {
54 struct sigaction act, oldact;
55 struct itimerval itv, olditv;
56
57 act.sa_handler = handleri;
58 act.sa_flags = 0;
59 sigemptyset(&act.sa_mask);
60 sigaction(SIGALRM, &act, &oldact);
61
62 itv.it_interval.tv_sec = 1;
63 itv.it_interval.tv_usec = 0;
64 itv.it_value.tv_sec = 1;
65 itv.it_value.tv_usec = 0;
66 setitimer(ITIMER_REAL, &itv, &olditv);
67
68 }
69
70 void myalarm(int sec, void (*handler)(void *s), char *p)
71 {
72 ar *t = NULL;
73 int pos;
74
75
76 if(!inited)
77 {
78 statdo();
79 inited = 1;
80 }
81
82 t = malloc(sizeof(ar));
83 if(NULL == t)
84 return ;
85
86 t->sec = sec;
87 t->handler = handler;
88 strcpy(t->s,p);
89
90 pos = get_pos();
91 // printf("%d\n",pos);
92 if(pos < 0)
93 {
94 free(t);
95 return ;
96 }
97
98 arr[pos] = t;
99
100
101
102 }
运行结果