#ifndef __ALRM_H
#define __ALRM_H #define MAX 1024 typedef void (*any_t)(void *s); typedef struct {
int times;
any_t any;
void *p;
}alarm_t; //初始化
int alrm_init(int t, any_t a, void *ptr); //销毁
void akrm_destroy(int i); #endif
 #include <stdlib.h>
#include <sys/time.h>
#include <signal.h>
#include <errno.h>
#include <unistd.h> #include "alrm.h" static alarm_t *arr[MAX]; static int inited;
static struct sigaction oldact;
static struct itimerval olditv; void alrm_destroy(int i); static int get_pos(void)
{
for(int i; i<MAX; i++){
if(NULL == arr[i])
return i;
}
return -;
} static void alrm_handler(int s)
{
for(int i = ; i< MAX; i++){
if(NULL != arr[i]){
if(arr[i]->times > )
arr[i]->times -= ;
}else {
arr[i]->any(arr[i]->p);
alrm_destroy(i);
}
}
}
//信号行为 时钟恢复
static void moduler_unload(void)
{
sigaction(SIGALRM, &oldact, NULL);
setitimer(ITIMER_REAL, &olditv, NULL);
} static void moduler_load(void)
{
struct sigaction act;
struct itimerval itv; act.sa_handler = alrm_handler;
act.sa_flags = ;
sigemptyset(&(act.sa_mask));
sigaction(SIGALRM, &act, &oldact); itv.it_interval.tv_sec = ;
itv.it_interval.tv_usec = ; itv.it_value.tv_sec = ;
itv.it_value.tv_usec = ;
setitimer(ITIMER_REAL, &itv, &olditv); atexit(moduler_unload);
} //初始化
int alrm_init(int t, any_t a, void *ptr)
{
alarm_t *alm = NULL;
int pos; if(inited == ){
moduler_load();
inited = ;
}
alm = malloc(sizeof(*alm));
if(NULL == alm)
return -ENOMEM;
alm->times = t;
alm->any = a;
alm->p = ptr; pos = get_pos();
if(pos < ){
free(alm);
return -ENOSPC;
}
arr[pos] = alm;
 #include <stdio.h>
#include <unistd.h> #include "alrm.h"
static void any1(void *s)
{
printf("%s", (char *)s);
fflush(NULL);
} static void any2(void *s)
{
printf("%s", (char *)s);
fflush(NULL);
} static void any3(void *s)
{
printf("%s", (char *)s);
fflush(NULL);
} int main(void)
{
int val1, val2, val3; val1 = alrm_init(, any1, "hello");
val2 = alrm_init(, any2, "world");
val3 = alrm_init(, any3, "apue"); /*
**world*hello**apue******
*/
while () {
write(, "*", );
sleep();
} return ;
}

     return pos;
} //销毁
void alrm_destroy(int i){
free(arr[i]);
arr[i] = NULL;
}

 

anyalarm的更多相关文章

随机推荐

  1. 集合基本操作 Python DAY2

    集合本身具有两个特性 1.去重  2.关系测试 列表转集合的两种写法: list_1=[1,2,3,4,1,2,7,8,] list_1=set(list_1) #方法二 list_2=set([1, ...

  2. Robot Framework自动化测试(1)

    Python: https://www.python.org/ RF框架是基于python 的,所以一定要有python环境. Robot framework : https://pypi.pytho ...

  3. Dockerfile封装Django镜像

    部署过程 1.查看镜像 docker images 2.在/opt下建立了docker目录,下载一个django-2.1.7的源码包, mkdir -p /opt/docker cd /docker ...

  4. 处女座与复读机 DP

    题目链接:https://ac.nowcoder.com/acm/contest/327/G 题意:给你两个字符串序列,让你根据第二个序列判断是不是 复读机,复读机会有以下特征 1.       将任 ...

  5. java 32个Java面试必考点

    转:https://blog.csdn.net/werqerwer 一:https://blog.csdn.net/werqerwer/article/details/88061689  Java职业 ...

  6. Hive中数据的导入与导出

    最近在做一个小任务,将一个CDH平台中Hive的部分数据同步到另一个平台中.毕竟我也刚开始工作,在正式开始做之前,首先进行了一段时间的练习,下面的内容就是练习时写的文档中的内容.如果哪里有错误或者疏漏 ...

  7. zzw原创_linux下的ping6用法

    [oracle@sv0379 ~]$ /sbin/ifconfig  -aeth0      Link encap:Ethernet  HWaddr 00:E0:81:BC:4B:08         ...

  8. JAVA入门[23]-SpringBoot配置Swagger2

    一.新建SpringBoot站点 1.新建module,然后引入pom依赖: <parent> <groupId>org.springframework.boot</gr ...

  9. webpack中 resolve.alias 配置,@import相关踩坑

    1.在使用webpack打包项目时,可以在配置文件中配置resolve.alias来定义一些绝对路径,方便在项目中灵活使用路径,举例如下: resolve: { extensions: [‘.js‘, ...

  10. 小白的python之路10/30 vim编辑器

    1.vim进入命令行之后的编辑过程