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 }
运行结果