libubox是openwrt新版本中的一个基础库,有不少应用是基于libubox开发的,如uhttpd,netifd,ubusd等。json
提供一套基于事件驱动的机制;架构
提供多种开发支持接口,如链表、kv链表、平衡查找二叉树、md五、json等。框架
可使程序基于事件驱动,从而可实如今单线程中处理多个任务;函数
基于libubox提供的API能够加快开发进度,提升程序的稳定性;oop
能更好的将程序融入openwrt架构中,由于新的openwrt的不少应用和库都基于libubox开发,当前分析使用的libubox版本为libubox-2014-08-04。ui
uloop是libubox下的一个模块,有三个功能:文件描述符触发事件的监控,timeout定时器处理, 当前进程的子进程的维护。spa
int uloop_init(void)线程
建立一个epoll的句柄,最多监控32个文件描述符。blog
设置文件描述符属性,如FD_CLOEXEC。排序
void uloop_run(void)
void uloop_done(void)
关闭epoll句柄。
清空定时器链表中的全部的定时器。
清空进程处理事件链表中删除全部的进程事件节点。
uloop_run轮询处理定时器、进程、描述符事件。
struct uloop_fd
{
uloop_fd_handler cb; /*文件描述符对应的处理函数 */
int fd; /*文件描述符*/
bool eof; /*EOF*/
bool error; /*出错*/
bool registered; /*是否已经添加到epoll的监控队列*/
uint8_t flags; /*ULOOP_READ | ULOOP_WRITE | ULOOP_BLOCKING等*/
};
int uloop_fd_add(struct uloop_fd *sock, unsigned int flags)
uloop最多支持10个描述符事件。
int uloop_fd_delete(struct uloop_fd *sock)
struct uloop_timeout
{
struct list_head list; //链表节点
bool pending; //添加一个新的timeout pending是true, false删除该节点timeout
uloop_timeout_handler cb; //超时处理函数
struct timeval time; //超时时间
};
int uloop_timeout_add(struct uloop_timeout *timeout)
用户不直接使用,内部接口,被接口uloop_timeout_set调用。
将定时器插入到timeouts链表中,该链表成员根据超时时间从小到大排列。
int uloop_timeout_set(struct uloop_timeout *timeout, int msecs)
若是pending为true,则从定时器链表中删除原先已存在的定时器。
设置定时器的超时时间点。
调用uloop_timeout_add接口将该定时器加入到定时器链表中。
int uloop_timeout_cancel(struct uloop_timeout *timeout)
从定时器链表中删除指定定时器。
int uloop_timeout_remaining(struct uloop_timeout *timeout)
这里pending标记可判判定时器是否处于生命周期,若是尚处在生命周期内,则返回离定时器超时还有多少时间,单位为毫秒。
用户使用定时器很是简单
struct uloop_timeout *t; //第一步定义一个定时器并申请内存空间
t = malloc(sizeof(*t));
t->cb = light_ctl_check_cb; //第二步指定回调函数
t->pending = false;
uloop_timeout_set(t, 2000); //第三步设置定时器超时时间
遍历定时器链表,若是有定时器已经超时,执行该定时器的回调函数。
struct uloop_process {
struct list_head list;
bool pending;
uloop_process_handler cb; /** 文件描述符, 调用者初始化 */
pid_t pid; /** 文件描述符, 调用者初始化 */
};
int uloop_process_add(struct uloop_process *p)
将进程事件插入到进程事件链表中,链表根据PID从小到大排序。
其中p->proc.pid为注册到uloop监控的进程ID。
P->cb为进程退出的回调函数,类型为:
typedef void (*uloop_process_handler)(struct uloop_process *c, int ret)
int uloop_process_delete(struct uloop_process *p)
从进程事件处理链表中删除该进程事件。