#ifndef __MY_ALARM_H
#define __MY_ALARM_H
#define MAX 1024
typedef void alarm_func_t(void*);
int anytimer_alarm(int sec, alarm_func_t *func, void *ch);
int anytimer_destory(int id);
#endif
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <unistd.h>
#include <signal.h>
#include "my_alarm.h"
static void mouder_load(void);
static void handler(int s);
static void mouder_unload(void);
static int get_pos(void);
struct func_st
{
int sec;
alarm_func_t *func;
void *ch;
};
static struct func_st *line[MAX];
static int inited = 0;
struct sigaction oldact;
struct itimerval olditv;
int anytimer_alarm(int sec, alarm_func_t *func, void *ch)
{
struct func_st *new;
int pos;
if(inited == 0)
{
mouder_load();
inited = 1;
}
pos = get_pos();
if(pos < 0)
return -1;
new=malloc(sizeof(*new));
if(new == NULL)
return -1;
new -> sec = sec;
new -> func = func;
new -> ch = ch;
line[pos] = new;
return pos;
}
int anytimer_destory(int id)
{
free(line[id]);
line[id] = NULL;
}
static void mouder_load(void)
{
struct sigaction act;
struct itimerval itv;
act.sa_handler = handler;
act.sa_flags = 0;
sigemptyset(&act.sa_mask);
sigaction(SIGALRM, &act, &oldact);
itv.it_interval.tv_sec = 1;
itv.it_interval.tv_usec = 0;
itv.it_value.tv_sec = 1;
itv.it_value.tv_usec = 0;
setitimer(ITIMER_REAL, &itv, &olditv);
atexit(mouder_unload);
}
static void handler(int s)
{
int i;
for(i=0; i<MAX; i++)
{
if (line[i] != NULL)
{
if(line[i] -> sec != 0)
line[i] -> sec -= 1;
else
{
line[i] -> func(line[i]->ch);
anytimer_destory(i);
}
}
}
}
static int get_pos(void)
{
for(int i=0; i<MAX; i++)
{
if(line[i] == NULL)
return i;
}
return -1;
}
static void mouder_unload(void)
{
sigaction(SIGALRM, &oldact, NULL);
setitimer(ITIMER_REAL, &olditv, NULL);
}
#include <stdio.h>
#include <unistd.h>
#include "my_alarm.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)
{
anytimer_alarm(3, any1, "hello");
anytimer_alarm(2, any2, "world");
anytimer_alarm(5, any3, "apue");
while (1) {
write(1, "*", 1);
sleep(1);
}
return 0;
}