Question: Using only a single timer (either alarm or the higher-precision setitimer), provide a set of functions that allows a process to set any number of timers.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <assert.h>
#include <time.h>
typedef void Func(int);
struct __timer
{
void *next;
unsigned int sec;
unsigned int intersec;
int id;
Func *sigactor;
};
typedef struct alarm *Timer;
struct alarm
{
union{
struct
{
Timer next;
unsigned int sec;
};
struct __timer __inner;
};
};
typedef struct list *Header;
struct list
{
Timer head;
};
Func* sig_alarm_fun;
struct list linkedlist;
Header hdr_ptr = &linkedlist;
Timer mallocTimer(int id, Func *actor,unsigned int sec, unsigned int interval)
{
Timer ret = (Timer)malloc(sizeof(struct alarm));
assert(ret);
ret->__inner.id = id;
ret->__inner.sigactor = actor;
ret->__inner.intersec = interval;
ret->sec = sec;
return ret;
}
Timer findTimerPrev(Header h, int id)
{
assert(h);
if(h->head == NULL)
return NULL;
Timer t = h->head;
Timer prev = NULL;
while(t)
{
if(t->__inner.id == id){
if(prev == NULL)
return (Timer)-1;
else
return prev;
}
prev = t;
t = t->next;
}
return NULL;
}
void delTimer(Header h, Timer t)
{
assert(h);
assert(t);
Timer prevtodel = findTimerPrev(h, t->__inner.id);
unsigned int base = 0;
if(prevtodel)
{
if(prevtodel == (Timer)-1){
unsigned int res = (h->head)->sec;
if(res != 0)
{
base = res;
}
else
{