张继伟 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 }

运行结果

猜你喜欢

转载自www.cnblogs.com/zjw2030/p/10585739.html