anyalarm

Posted ylx0506

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了anyalarm相关的知识,希望对你有一定的参考价值。

 1 #ifndef __ALRM_H
 2 #define __ALRM_H
 3 
 4 #define MAX 1024
 5 
 6 typedef void (*any_t)(void *s);
 7 
 8 typedef struct {
 9     int times;
10     any_t any;
11     void *p;
12 }alarm_t;
13 
14 //初始化
15 int alrm_init(int t, any_t a, void *ptr);
16 
17 //销毁
18 void akrm_destroy(int i);
19 
20 #endif


 1 #include <stdlib.h>
 2 #include <sys/time.h>
 3 #include <signal.h>
 4 #include <errno.h>
 5 #include <unistd.h>
 6 
 7 #include "alrm.h"
 8 
 9 static alarm_t *arr[MAX];
10 
11 static int inited;
12 static struct sigaction oldact;
13 static struct itimerval olditv;
14 
15 void alrm_destroy(int i);
16 
17 static int get_pos(void)
18 {
19     for(int i; i<MAX; i++){
20         if(NULL == arr[i])
21             return i;
22     }
23     return -1;
24 }
25 
26 static void alrm_handler(int s)
27 {
28     for(int i = 0; i< MAX; i++){
29         if(NULL != arr[i]){
30             if(arr[i]->times > 1)
31                 arr[i]->times -= 1;
32         }else {
33             arr[i]->any(arr[i]->p);
34             alrm_destroy(i);
35         }
36     }
37 }
38 //信号行为 时钟恢复
39 static void moduler_unload(void)
40 {
41     sigaction(SIGALRM, &oldact, NULL);
42     setitimer(ITIMER_REAL, &olditv, NULL);
43 }
44 
45 static void moduler_load(void)
46 {
47     struct sigaction act;
48     struct itimerval itv;
49 
50     act.sa_handler = alrm_handler;
51     act.sa_flags = 0;
52     sigemptyset(&(act.sa_mask));
53     sigaction(SIGALRM, &act, &oldact);
54 
55     itv.it_interval.tv_sec = 1;
56     itv.it_interval.tv_usec = 0;
57 
58     itv.it_value.tv_sec = 1;
59     itv.it_value.tv_usec = 0;
60     setitimer(ITIMER_REAL, &itv, &olditv);
61 
62     atexit(moduler_unload);
63 }
64 
65 //初始化
66 int alrm_init(int t, any_t a, void *ptr)
67 {
68     alarm_t *alm = NULL;
69     int pos;
70 
71     if(inited == 0){
72         moduler_load();
73         inited = 1;
74     }
75     alm = malloc(sizeof(*alm));
76     if(NULL == alm)
77         return -ENOMEM;
78     alm->times = t;
79     alm->any = a;
80     alm->p = ptr;
81 
82     pos = get_pos();
83     if(pos < 0){
84         free(alm);
85         return -ENOSPC;
86     }
87     arr[pos] = alm;
 1 #include <stdio.h>
 2 #include <unistd.h>
 3 
 4 #include "alrm.h"
 5 static void any1(void *s)
 6 {
 7     printf("%s", (char *)s);
 8     fflush(NULL);
 9 }
10 
11 static void any2(void *s)
12 {
13     printf("%s", (char *)s);
14     fflush(NULL);
15 }
16 
17 static void any3(void *s)
18 {
19     printf("%s", (char *)s);
20     fflush(NULL);
21 }
22 
23 int main(void)
24 {
25     int val1, val2, val3;
26     
27     val1 = alrm_init(3, any1, "hello");
28     val2 = alrm_init(2, any2, "world");
29     val3 = alrm_init(5, any3, "apue");
30 
31     /*
32      **world*hello**apue******
33      */
34     while (1) {
35         write(1, "*", 1);
36         sleep(1);
37     }
38 
39     return 0;
40 }

 

88     return pos;
89 }
90 
91 //销毁
92 void alrm_destroy(int i){
93     free(arr[i]);
94     arr[i] = NULL;
95 }

 

 

 

以上是关于anyalarm的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段——CSS选择器

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

片段和活动之间的核心区别是啥?哪些代码可以写成片段?

VSCode自定义代码片段——.vue文件的模板

VSCode自定义代码片段6——CSS选择器

VSCode自定义代码片段——声明函数