APUE Exercises 10.5 pp381

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
            {
             
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值