面试笔试--通用事件处理框架编写一个日志缓存插件

1.编程题(40分钟, 写磁盘文件、从磁盘加较数据等底层接口函数可以不用写实现细节, 重点是工程完整性)

请为一个通用事件处理框架编写一个日志缓存插件, 插件功能及要求如下

(1)插件编译成 loopfile. so, 通用插件框架的共享库为 modules_ std. so

(2)在 loopfile插件中, 实现日志缓存功能, 缓存事件 event 中的 s_ip , s_mac, s_user 三个字段(均为字符串类型), 其中s_ip为key

(3) 缓存策略为: 插件每收到一个 event, 就要先查看一下缓存中是否已经有了该事件、如果没有就添加, 否则更新一下缓存中的s_mac, s_user字段: 每隔30秒 , 需要将缓存中的事件"落地" , 写入 /var/ log/ loopfile.log 中; 插件加载时, 要先从文件中加载旧数据。

(4)请写出插件的主要源文件 loopfile. c、 loopfile. h、 Makefile( 或 Makefile, arm) 插件中至少要包括以下三个接口

c 复制代码
/**********************
function: module_init,  插件初始化时调用一次。  
@param private:插件私有数据,  可以在init中进行分配, exit中释放
**************************/
int module_init(void ** private);

/*************************
@ function; module_exit,   插件卸载时调用一次
@ param private: 插件私有数据, 这里需要释放
******************/
int module_exit(void ** private);

/***********************
@ function: module_ process,   插件中的事件处理函数,  每个事件都会调用一次
@Param private:  插件私有数据, process中可以读取
@ param event   事件, 是一个KV结构的fmap类型,  key为字符串 , value可以为int、char、list等基本类型
**************************/
int module_process(void *private, fmap * event);

附录: fmap 定义在通用库 module_std.so中, 其中一些参考接口如下

c 复制代码
/**************************
@ function:获取str值
@Param map :  要获取的map对象
@Param  kbuf: key值
Param  ksize :key长度
@reurn:成功返回值,  失败返回NULL
*************************/
const unsigned char * fmap_get_str(Fmap * map, const void * kbuf , int size);

/************************
function 添加一个字符串项, 会覆盖旧数据
param map要添加的map对象
param kbuft key值长
appara vhuf  要添加的数据
reun:成功返回0.  失败返回-1
**************************/
int fmap_put_str(Fmap * map, const void * kbuf, int ksize, unsigned char * vbut, int vsizel);

/****************
 @ function:  获取int值, 会覆盖旧数据
param map:  要获取的map对象
param kbut:  key值
param ksize: key长度
@ param find  标识是否找到  1:找到,  0:未找到o
reurn:成功返回值, 失败返回0
*************************/
u_int32_t fmap_get_int(Fmap * map, const void kbuf, int ksize, int *find);

/*******************
@ Function:  从一个map获取一个整数
@ param nap:  要操作的map对象
@ param kbuf: key值
param ksize:  key长度
@ param find:  获取成功后为1, 否则为0
@ Return:  要获取的整数
*************/
int fmap_put_int(Fmap * map, const void * kbuf, int ksize, u_int32_t num);
   
/*************
@ function: 添加一个整数到map里面
 @ param map:  要添加的map对象
 param kbuf: key值
@ param size: key长度
@ param num:  添加的整数
@ 0: 成功  -1: 失败
***************/
void * fmap_dump(fmap * map, int * msize );

/*************
 @ function:加载一个map对象
 param data: 要加载的数据
 @ param len: data的长度
@ return: 返回解析后的map对象
*************/
fmap *fmap_load(void * data, int *len);

/************
② function:  建立新的Fmap对象
@ return:成功返回Fmap对象,   失败返回NULL;
***********/
fmap * fmap_new();
/*******
@ function:释放Fmap对象/
*************/
void fmap_del(Fmap * map);
c 复制代码
struct fmap
{
    
};
struct fmap event;

int module_init(void ** private)
{
    
}

int module_exit(void ** private)
{
    
}

int module_process(void *private, fmap * event)
{
    
}
makefile 复制代码
gcc-linux - c loopfile. c、 loopfile. h
相关推荐
呆呆的小鳄鱼9 分钟前
cin,cin.get()等异同点[面试题系列]
java·算法·面试
顾林海30 分钟前
ViewModel 销毁时机详解
android·面试·android jetpack
bo5210039 分钟前
解决跨域的几种种方法, 你都知道几种?
前端·面试·浏览器
hello早上好1 小时前
CGLIB代理核心原理
java·spring
在肯德基吃麻辣烫1 小时前
《Redis》缓存与分布式锁
redis·分布式·缓存
掘金安东尼1 小时前
前端周刊第421期(2025年7月1日–7月6日)
前端·面试·github
前端小巷子2 小时前
web从输入网址到页面加载完成
前端·面试·浏览器
先睡7 小时前
Redis的缓存击穿和缓存雪崩
redis·spring·缓存
Bug退退退12312 小时前
RabbitMQ 高级特性之死信队列
java·分布式·spring·rabbitmq
yanlele15 小时前
前端面试第 75 期 - 2025.07.06 更新前端面试问题总结(12道题)
前端·javascript·面试