redis 之 ae 模型测试
redis 之 ae 模型测试
老汉-憨憨 发表于4个月前
redis 之 ae 模型测试
  • 发表于 4个月前
  • 阅读 8
  • 收藏 0
  • 点赞 0
  • 评论 0

主要用来测试和学习 redis 的 ae 模型

总体来说 代码结构简单,容易理解。

1. 从 redis 目录拷贝 ae.c  ae.h ae_epoll.c 到一个单独的目录

代码目录结构如下:

>ls
ae.c  ae_epoll.c  ae.h  aeRun  main.c

# ae.c 来自 redis 的源码
# ae_epoll.c 来自 redis 的源码 (代码未做修改)
# ae.h 来自 redis 的源码 (代码未做修改)
# aeRun 编译后的可执行文件
# main.c 自己编写的测试 代码

ae.c 代码修改如下:

/* 注释调下面的两个头文件, 这里测试无需这两个头文件 */
//#include "zmalloc.h"
//#include "config.h"

/* 添加下面的 4 个宏, 系统是 linux 所以用 epoll 即可 */
#define zmalloc  malloc
#define zfree    free
#define zrealloc realloc

#define HAVE_EPOLL (1)

 

2. main.c 源码

#include "ae.h"

#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <poll.h>
#include <string.h>
#include <time.h>
#include <errno.h>

void loop_init(aeEventLoop *lp)
{
    printf("loop init!\n");
}

void file_cb(aeEventLoop *lp, int fd, void *date, int mask)
{
    char buf[1024] = {'\0'};
    int len = read(fd, buf, sizeof(buf) - 1);
    printf("fd = %d, data = %s\n", fd, buf);
}

int time_cb(aeEventLoop *lp, long long id, void *data)
{
    static int num = 0;
    printf("now is %ld\n", time(NULL));
    if (++num == 5) {
        return AE_NOMORE;
    }
    return 5 * 1000;
}

void fin_cb(aeEventLoop *lp, void *data)
{
    printf("fin_cb run!\n");
}

int main(int argc, char *argv[])
{
    aeEventLoop *lp = NULL;

    lp = aeCreateEventLoop(1024);
    aeSetBeforeSleepProc(lp, loop_init);

    int res;
    res = aeCreateFileEvent(lp, STDIN_FILENO, AE_READABLE, file_cb, NULL);
    if (res) {
        printf("aeCreateFileEvent error! res = %d\n", res);
    }

    res = aeCreateTimeEvent(lp, 5*1000, time_cb, NULL, fin_cb);
    if (res) {
        printf("aeCreateTimeEvent error! res = %d\n", res);
    }

    aeMain(lp);

    return 0;
}

编译:

gcc ae.c  main.c -o aeRun

输出:

./aeRun 
loop init!
loop init!
now is 1500956579
loop init!
now is 1500956584
loop init!
now is 1500956589
loop init!
loop init!
now is 1500956594
loop init!
now is 1500956599
loop init!
fin_cb run!
loop init!
1234567890
fd = 0, data = 1234567890

loop init!
^C

 

标签: redis ae epoll
共有 人打赏支持
粉丝 18
博文 259
码字总数 57478
×
老汉-憨憨
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: