myalarm.c

main.c

 1 #include<stdio.h>
 2 #include<unistd.h>
 3 #include<sys/time.h>
 4 
 5 #include"myalarm.h"
 6 
 7 int main(void)
 8 {
 9     anytimer_alarm(3,any1,"hello");
10     anytimer_alarm(2,any2,"world");
11     anytimer_alarm(5,any3,"apue");
12 
13     while(1)
14     {
15         write(1,"*",1);
16         sleep(1);
17     }
18     return 0;
19 }

myalarm.c

  1 #include<stdio.h>
  2 #include<signal.h>
  3 #include<stdlib.h>
  4 #include<sys/time.h>
  5 #include<unistd.h>
  6 #include<errno.h>
  7 
  8 #include"myalarm.h"
  9 
 10 int inited=0;
 11 
 12 typedef struct anyalarm
 13 {
 14     int sec;
 15     void (*fcntl)(void *);
 16     char *str;
 17 }ANYALRM;
 18 
 19 ANYALRM *alr[ALRSIZE];
 20 static struct sigaction oldact;
 21 static struct itimerval olditv;
 22 
 23 static void alrm_handler(int s)
 24 {
 25     for(int i=0;alr[i]!=NULL;i++)
 26     {
 27         alr[i]->sec-=1;
 28         if(alr[i]->sec==0)
 29         {
 30             alr[i]->fcntl(alr[i]->str);
 31             free(alr[i]);
 32         }
 33     }
 34 }
 35 
 36 void moduler_load()
 37 {
 38     struct sigaction act;
 39     struct itimerval itv;
 40 
 41     act.sa_handler=alrm_handler;
 42     act.sa_flags=0;
 43     sigemptyset(&act.sa_mask);
 44     sigaction(SIGALRM,&act,&oldact);
 45     itv.it_interval.tv_sec=1;
 46     itv.it_interval.tv_usec=0;
 47     itv.it_value.tv_sec=1;
 48     itv.it_value.tv_usec=0;
 49     setitimer(ITIMER_REAL,&itv,&olditv);
 50     atexit(moduler_unload);
 51 }
 52 
 53 //信号行为和时钟得到恢复
 54 void moduler_unload()
 55 {
 56     sigaction(SIGALRM,&oldact,NULL);
 57     setitimer(ITIMER_REAL,&olditv,NULL);
 58 }
 59 
 60 void any1(void *s)
 61 {
 62     printf("%s\n",(char *)s);    
 63 }
 64 
 65 void any2(void *s)
 66 {
 67     printf("%s\n",(char *)s);    
 68 }
 69 
 70 void any3(void *s)
 71 {
 72     printf("%s\n",(char *)s);    
 73 }
 74 
 75 int alr_init(int sec,void(*fcntl)(void *),char *str)
 76 {
 77     ANYALRM *alrm=NULL;
 78     //第一次调用
 79     if(inited==0)
 80     {
 81         moduler_load();
 82         inited=1;
 83     }
 84     alrm=malloc(sizeof(ANYALRM));
 85     if(alrm==NULL)
 86     {
 87         fprintf(stderr,"malloc is failed!\n");    
 88     }
 89     alrm->sec=sec;
 90     alrm->fcntl=fcntl;
 91     alrm->str=str;
 92     for(int i=0;i<ALRSIZE;i++)
 93     {
 94         if(alr[i]==NULL)
 95         {
 96             alr[i]=alrm;
 97             return 1;
 98         }
 99     }
100     return -1; 
101 }
102 
103 void anytimer_alarm(int sec,void (*fcntl)(void *),char *str)
104 {
105     if(alr_init(sec,fcntl,str)<0)
106     {
107         fprintf(stderr,"alr_init failed\n");
108         return;
109     }
110 }

myalarm.h

 1 #ifndef __MYALARM_H
 2 #define __MYALARM_H
 3 
 4 #define ALRSIZE 1024
 5 
 6 void any1(void *s);
 7 void any2(void *s);
 8 void any3(void *s);
 9 
10 void anytimer_alarm(int sec,void (*fcntl)(void *),char *str);
11 
12 int alr_init(int sec,void(*fcntl)(void *),char *str);
13 
14 void alarm_handler(int s);
15 
16 int alr_init(int sec,void(*fcntl)(void *),char *str);
17 
18 void moduler_load(void);
19 
20 void moduler_unload(void);
21 
22 #endif

makefile

1 main :main.o myalarm.o
2     gcc main.o myalarm.o -o main
3 clean :
4     rm -rf *.o main

 

转载于:https://www.cnblogs.com/KbBryant24/p/10590006.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于计算机专业的学生而言,参加各类比赛能够带来多方面的益处,具体包括但不限于以下几点: 技能提升: 参与比赛促使学生深入学习和掌握计算机领域的专业知识与技能,如编程语言、算法设计、软件工程、网络安全等。 比赛通常涉及实际问题的解决,有助于将理论知识应用于实践中,增强问题解决能力。 实践经验: 大多数比赛都要求参赛者设计并实现解决方案,这提供了宝贵的动手操作机会,有助于积累项目经验。 实践经验对于计算机专业的学生尤为重要,因为雇主往往更青睐有实际项目背景的候选人。 团队合作: 许多比赛鼓励团队协作,这有助于培养学生的团队精神、沟通技巧和领导能力。 团队合作还能促进学生之间的知识共享和思维碰撞,有助于形成更全面的解决方案。 职业发展: 获奖经历可以显著增强简历的吸引力,为求职或继续深造提供有力支持。 某些比赛可能直接与企业合作,提供实习、工作机会或奖学金,为学生的职业生涯打开更多门路。 网络拓展: 比赛是结识同行业人才的好机会,可以帮助学生建立行业联系,这对于未来的职业发展非常重要。 奖金与荣誉: 许多比赛提供奖金或奖品,这不仅能给予学生经济上的奖励,还能增强其成就感和自信心。 荣誉证书或奖状可以证明学生的成就,对个人品牌建设有积极作用。 创新与研究: 参加比赛可以激发学生的创新思维,推动科研项目的开展,有时甚至能促成学术论文的发表。 个人成长: 在准备和参加比赛的过程中,学生将面临压力与挑战,这有助于培养良好的心理素质和抗压能力。 自我挑战和克服困难的经历对个人成长有着深远的影响。 综上所述,参加计算机领域的比赛对于学生来说是一个全面发展的平台,不仅可以提升专业技能,还能增强团队协作、沟通、解决问题的能力,并为未来的职业生涯奠定坚实的基础。
你的存储过程报错可能是因为你没有指定 DELIMITER。在你的存储过程中,你使用了分号 (;) 来分隔语句,而这与 MySQL 默认使用的分隔符相同。因此,你需要使用 DELIMITER 命令来改变分隔符。 下面是修改后的代码: ``` DELIMITER // CREATE PROCEDURE area_pro2 ( IN x INT, OUT alarm_count INT, OUT over_spped INT, OUT over_spped_10 INT, OUT over_spped_20 INT, OUT over_spped_50 INT, OUT untreated INT, OUT processed INT ) BEGIN WITH cte AS ( SELECT organization_id FROM `user` WHERE organization_id = x OR father LIKE CONCAT( COALESCE((SELECT father FROM `user` WHERE organization_id = x), ''), x, '-%' ) AND is_del = 0 ) SELECT count(location_alarm.id) INTO alarm_count, COUNT(CASE WHEN location_alarm.max_speed > location_alarm.speed_limit * 10 THEN 0 END), count(CASE WHEN location_alarm.max_speed / location_alarm.speed_limit > 11 THEN 0 END) INTO over_spped_10, count(CASE WHEN location_alarm.max_speed / location_alarm.speed_limit > 12 THEN 0 END) INTO over_spped_20, count(CASE WHEN location_alarm.max_speed / location_alarm.speed_limit > 15 THEN 0 END) INTO over_spped_50, count(CASE WHEN location_alarm.alarm_process_id IS NULL THEN 0 END) INTO untreated, count(location_alarm.alarm_process_id) INTO processed FROM cte INNER JOIN car ON car.organization_id = cte.organization_id AND car.is_del = 0 INNER JOIN location_alarm ON car.id = location_alarm.car_id; END// DELIMITER ; ``` 在这里,我们使用了 DELIMITER // 命令来指定新的分隔符,并在存储过程的结尾使用了 END// 来结束存储过程定义。最后,我们使用 DELIMITER ; 命令来将分隔符改回默认值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值