1 /* 2 时钟控制字符串输出 3 **world*hello**apue****** 4 */ 5 #include <stdio.h> 6 #include <stdlib.h> 7 #include <signal.h> 8 #include <string.h> 9 #include <sys/time.h> 10 #include <unistd.h> 11 #include <errno.h> 12 13 #define MAXALARM 1024 14 15 typedef struct { //显示字符串 16 int sec; 17 void (*handler)(void *s); 18 char s[20]; 19 }ar; 20 21 static ar *arr[MAXALARM]; 22 static int inited; 23 24 static int get_pos(void) 25 { 26 for(int i = 0; i < MAXALARM; i++) 27 { 28 if(arr[i] == NULL) 29 { 30 return i; 31 } 32 } 33 } 34 35 static void print(int i)//打印数组成员 36 { 37 (arr[i]->handler)(arr[i]->s); 38 arr[i] = NULL; 39 free(arr[i]); 40 } 41 42 static void handleri(int s) 43 { 44 for(int i = 0; i < MAXALARM; i++) 45 { 46 if(arr[i] != NULL) 47 { 48 arr[i]->sec -= 1; 49 if(arr[i]->sec == 0) 50 print(i); 51 } 52 } 53 } 54 55 static void statdo(void)//定义时钟 56 { 57 struct sigaction act, oldact; 58 struct itimerval itv, olditv; 59 60 act.sa_handler = handleri; 61 act.sa_flags = 0; 62 sigemptyset(&act.sa_mask); 63 sigaction(SIGALRM, &act, &oldact); 64 65 itv.it_interval.tv_sec = 1; 66 itv.it_interval.tv_usec = 0; 67 itv.it_value.tv_sec = 1; 68 itv.it_value.tv_usec = 0; 69 setitimer(ITIMER_REAL, &itv, &olditv); 70 71 } 72 73 void anytimer_alarm(int sec, void (*handler)(void *s), char *p) 74 { 75 ar *t = NULL; 76 int pos; 77 78 79 if(!inited) 80 { 81 statdo(); 82 inited = 1; 83 } 84 85 t = malloc(sizeof(ar)); 86 if(NULL == t) 87 return ; 88 89 t->sec = sec; 90 t->handler = handler; 91 strcpy(t->s,p); 92 93 pos = get_pos(); 94 if(pos < 0) 95 { 96 free(t); 97 return ; 98 } 99 100 arr[pos] = t; 101 } 102 103 static void any1(void *s) 104 { 105 printf("%s", (char *)s); 106 fflush(NULL); 107 } 108 109 static void any2(void *s) 110 { 111 printf("%s", (char *)s); 112 fflush(NULL); 113 } 114 115 static void any3(void *s) 116 { 117 printf("%s", (char *)s); 118 fflush(NULL); 119 } 120 121 int main(void) 122 { 123 anytimer_alarm(3, any1, "hello"); 124 anytimer_alarm(2, any2, "world"); 125 anytimer_alarm(5, any3, "apue"); 126 127 /* 128 **world*hello**apue****** 129 */ 130 while (1) { 131 write(1, "*", 1); 132 sleep(1); 133 } 134 135 return 0; 136 }