最近在开发程序的时候遇到一个小问题,就是当数据包到达时,如何根据传入的参数自动调用相应的处理函数。 奈何博主愚钝,并没有找到很好的解决方法,参照 Epoll 的思想,是否自己也能实现一种事件轮询的机制,之后便实验了一番,确实可行,故书博文一篇,记述一下自己的过程。
首先我们准备一个容器,用来存放已经注册了的事件集合,这里我选择了队列来作为这个容器的实现。
1 2 3 4 5 6 typedef struct FuncObject { int type; // 事件类型/标识符 void (CallBack*)(void *arg); //事件回调 struct FuncObject *next; }FuncObject_t; 在以上代码我们定义了一个节点,用于存放我们注册了的事件。
1 2 3 4 5 typedef struct FuncQueue { FuncObject_t *head; FuncObject_t *tail; }FuncQueue_t; 定义一个典型的队列。 下面我们就来定义一下这个队列的操作,在这里我习惯了使用面向对象的思想来编写C程序。
1 2 3 4 5 6 7 8 9 10 11 12 typedef struct FuncQueueObject { FuncQueue_t __queue; //私有队列 void(*Init)(struct FuncQueueObject *instance); void(*Add)(struct FuncQueueObject *instance,FuncObject_t *object); FuncObject_t *(*Set)(void(*CallBack)(void *arg),int type); void(*Set_Ex)(struct FuncQueueObject *instance, void(*CallBack)(void *package), int type); void(*Delete)(struct FuncQueueObject *instance, int type); } extern FuncQueueObject_t *FuncQueueObject_New(); extern void FuncQueueObject_Delete(FuncQueueObject_t *object); 以上实现了我们的一个队列容器,用于存放/修改/删除我们的注册的事件。