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

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
相关推荐
ShineWinsu4 小时前
对于C++:IO流状态的详细解析
c++·面试·io·cin·io流状态·goodbit·failbit
「PlanA」4 小时前
测试开发面经001
面试
JL155 小时前
面试项目被问到自闭-如何把课设包装成亮眼项目
面试·职场和发展
风流 少年7 小时前
Spring AI 2.0:Advisor
android·人工智能·spring
砍材农夫7 小时前
spring-ai|Spring‑AI 2.0.0 新特性 + 入门教程
spring boot·spring·spring cloud
库玛西10 小时前
现代 C++ 智能指针全景指南:从 RAII 思想到工业级实践
c语言·开发语言·c++·笔记·面试
Jackson__11 小时前
面试官:如何在老项目中使用新框架,并实现通信?
前端·javascript·面试
lv__pf12 小时前
spring之整合mybatis【TL spring 12】
mysql·spring·mybatis
AI人工智能+电脑小能手13 小时前
大白话说Java设计模式-17-装饰器模式(源码剖析篇)
java·spring·设计模式·装饰器模式·源码分析·io流
码匠许师傅14 小时前
【C++ 面试真题】聊聊 C++ 中的 lambda 表达式
java·c++·面试