#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. mysql查表的时候报错:java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timest

    在spark项目中读取mysql中的数据的时候,发生了报错: 原因:主要是因为数据库中有一些字段为null,无法进行转换: 上面字段那种,我的inserttime字段类型为timestamp类型,不为 ...

  2. A.CTable 自动创建数据表

    1.添加依赖 <!-- A.CTable 自动创建数据表 --> <dependency> <groupId>com.gitee.sunchenbin.mybati ...

  3. 现代 PHP 新特性 —— 闭包

    一.概述 闭包是指在创建时封装周围状态的函数,即使闭包所在的环境的不存在了,闭包中封装的状态依然存在.闭包对象实现了__invoke()魔术方法,只要变量名后有(),PHP就会查找并调用__invok ...

  4. 2019.3.16数据结构考试(Problem 1. rotinv)(循环逆序对)

    Problem 1. rotinvInput file: rotinv.inOutput file: rotinv.outTime limit: 2 secondsMemory limit: 256 ...

  5. 多条件分类统计group by 显示数目为0的类别

    CREATE TABLE #authorTable(author VARCHAR(50)) INSERT #authorTable SELECT 'peter' UNION SELECT '捌妮' U ...

  6. 配置rpm本地源及局域网环境下使用

    LInux个人开发过程中可以直接连到公网,所以想要安装各种软件时直接安装即可,但工作环境往往很让人头疼. 如果应用场景是没法链接外网的,公司内部绝大多数情况下是在自己的局域网下玩,这时候想装个软件是相 ...

  7. tensorflow tfrecord文件存储

    import tensorflow as tf import numpy as np import skimage from skimage import data, io, color from P ...

  8. this的学习

    面试经常被问到this的问题,每次回答都感觉回答的不尽人意,今天周六就在家好好研究this的问题 1.function定义的时候this的指向是无法确定的,执行function的时候才知道this的指 ...

  9. 用反射的形式将一个对象属性值赋值给另一个对象,省略点get/set方法的冗余代码

    1.本例使用的是idea 首先需要在idea中安装lombok插件,省略getter和setter方法的书写 在maven项目中加入lombok依赖 <dependency> <gr ...

  10. spring中ApplicationListener的用法

    1.实现ApplicationListener接口,并重写onApplicationEvent方法 @Component public class RSAKeyInitListener impleme ...