13-Openwrt libubox uloop

  • 日期:07-20
  • 点击:(1184)

申博太阳城

  上一章节将libubox的一些简单组件介绍了一下,其实里面还有很多东西,只能等用到的时候再去学习,这边再介绍一个libubox里面比较经常用到的组件,就是uloop,uloop下面有太多东西了。

  uloop是libubox下的一个模块,有三个功能:文件描述符触发事件的监控,timeout定时器处理, 当前进程的子进程的维护。

  主框架接口

  初始化事件循环 int uloop_init(void)

  创建一个epoll的句柄,最多监控32个文件描述符。

  设置文件描述符属性,如FD_CLOEXEC。

  事件循环主处理入口 void uloop_run(void)

  uloop_run轮询处理定时器、进程、描述符事件。

  遍历定时器timeouts链表判断是否有定时器超时,如果有则进行相应的回调处理,没有跳过。

  判断是否有子进程退出SIGCHLD信号,有就会遍历processes进程处理的链表,调勇相应的回调函数,没有跳过。

  计算出距离下一个最近的定时器的时间,作为文件描述符事件epoll的超时时间。然后epoll进行事件监听,如果有文件描述符准备就绪(可读写时间)则调用相应的回调函数,或者有信号进行中断epoll返回停止监听,否则epoll阻塞直到超时时间完成。

  销毁事件循环 void uloop_done(void)

  关闭epoll句柄。

  清空定时器链表中的所有的定时器。

  清空进程处理事件链表中删除所有的进程事件节点。

  1 uloop_fd

  epoll 的本质是什么:

  

  挂载一个cb回掉函数即可,fd有改变时即触发

  2 定时器time

  如下,一个定时器的使用就是这么简单。

  3 uloop_fd fd串口使用

  平常一直在纠结linux的串口编程要怎么弄,又是read,又是select的太过麻烦了,赶快转成用libubox的epool方式,太方便了。

  测试流程,开启一个定时器,5秒发一次数据,收到的数据会直接跑到回调函数里面,666

  回调函数:

  串口初始化:

  4 uloop usock

  uloop_fd的时候不止这些,sock也可以监听,只要时流设备都可以监听,如下例子:

  服务器:

  客户端:

  uloop出来fd,timeout还有一个process,不过我自己没有用过,别人与用过的可以留下链接改成用的时候参考。

  代码位于github:

达到当天最大量