1. 程式人生 > >2019.3.23王允 多任務計時器anytime

2019.3.23王允 多任務計時器anytime

sig printf nom unistd.h ring lda pos %s ()

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<stdlib.h>
  4 #include<signal.h>
  5 #include<sys/time.h>
  6 #include<errno.h>
  7 #include<string.h>
  8 
  9 #define MAXTIM 1024
 10 typedef void (*any_timer)(void *);
 11 
 12 typedef struct
{ 13 int sec; 14 any_timer anytm; 15 char *arg; 16 }tim_t; 17 18 static tim_t *jobs[MAXTIM]; 19 static int inited; 20 static struct sigaction oldact; 21 22 static int get_pos(void) 23 { 24 int i; 25 for(i=0;i<MAXTIM;i++) 26 { 27 if(jobs[i]==NULL)
28 return i; 29 } 30 return -1; 31 } 32 33 static void alrm_handler(int s) 34 { 35 int i; 36 for(i=0;i<MAXTIM;i++) 37 { 38 if(jobs[i]!=NULL) 39 { 40 jobs[i]->sec--; 41 if(jobs[i]->sec<=0) 42
{ 43 jobs[i]->anytm(jobs[i]->arg); 44 free(jobs[i]); 45 jobs[i]=NULL; 46 } 47 } 48 } 49 50 } 51 52 static void moduler_load(void) 53 { 54 struct sigaction act; 55 struct itimerval itv; 56 57 itv.it_interval.tv_sec = 1; 58 itv.it_interval.tv_usec = 0; 59 itv.it_value.tv_sec = 1; 60 itv.it_value.tv_usec = 0; 61 setitimer(ITIMER_REAL, &itv, NULL); 62 63 act.sa_handler = alrm_handler; 64 act.sa_flags = 0; 65 sigemptyset(&act.sa_mask); 66 sigaction(SIGALRM, &act, &oldact); 67 68 } 69 static int anytimer_alarm(int time,any_timer any_tm,void *s) 70 { 71 tim_t *t=NULL; 72 int pos; 73 if(inited==0) 74 { 75 moduler_load(); 76 inited=1; 77 } 78 t=malloc(sizeof(*t)); 79 if(NULL==t) 80 return -ENOMEM; 81 t->arg=malloc(strlen(s)); 82 if(NULL==t->arg) 83 { 84 free(t); 85 return -1; 86 } 87 t->sec=time; 88 t->anytm=any_tm; 89 t->arg=s; 90 pos=get_pos(); 91 if(pos<0) 92 { 93 free(t); 94 return -ENOSPC; 95 } 96 jobs[pos]=t; 97 return pos; 98 } 99 100 static void _any(void *s) 101 { 102 printf("%s",(char *)s); 103 fflush(NULL); 104 } 105 106 int main(void) 107 { 108 anytimer_alarm(3,_any,"hello"); 109 anytimer_alarm(2,_any,"world"); 110 anytimer_alarm(5,_any,"apue"); 111 112 while(1) 113 { 114 write(1,"*",1); 115 sleep(1); 116 } 117 118 exit(0); 119 }

2019.3.23王允 多任務計時器anytime