MENU

【一起来写http服务器】事件框架2

2023 年 06 月 22 日 • linux

本章节主要介绍通过timerfd机制来实现事件框架中的定时器。

本次合入的PR为https://gitee.com/popzilla/popevent/pulls/1。主要合入如下两个文件,分别为:

  • pop_timer.c,定时器的功能实现;
  • pop_timer.h,定时器的对外接口。

整体思路是,当创建定时器时通过timerfd设置溢出的时间,将创建出的fd加入到之前实现的事件框架中去,对fd的事件进行监听。当定时器溢出时,便会收到fd可读事件,此时执行定时器回调即可。关于timerfd的介绍可见之前的章节《timerfd简介》

接口

当前提供如下接口:

pop_timer_t pop_timer_create(uint32_t millsec, bool loop, pop_timer_cb cb, void *usrdata);

其中各参数功能如下:

  • millsec,定时器溢出时间,单位毫秒;
  • loop,是否循环定时器;
  • cb,定时器溢出时的处理函数;
  • usrdata,定时器溢出时传入给处理函数的用户自定义数据;

测试

测试代码比较简单,功能主要为定时每隔500毫秒打印一次计数值。

void timer_proc(pop_timer_t timer, void *usrdata)
{
    uint32_t *counter = (uint32_t *)usrdata;
    printf("counter: %u\n", *counter);
    (*counter)++;
}

int main(void)
{
    /* 事件框架初始化 */
    pop_event_init();

    /* 启动定时器,每500毫秒调用一次timer_proc,其中`counter`为自定义函数。 */
    static uint32_t counter = 0;
    pop_timer_create(500, true, timer_proc, &counter);

    /* 事件循环,此处函数不会再退出 */
    pop_event_loop();

    return 0;
}
最后编辑于: 2023 年 07 月 02 日