openWrt libubox組件之uloop原理分析

来源:https://www.cnblogs.com/laoxiaobaiup/archive/2018/07/25/9366880.html
-Advertisement-
Play Games

1. libubox概述 libubox是openwrt新版本中的一個基礎庫,有很多應用是基於libubox開發的,如uhttpd,netifd,ubusd等。 libubox主要提供以下兩種功能: 提供一套基於事件驅動的機制; 提供多種開發支持介面,如鏈表、kv鏈表、平衡查找二叉樹、md5、jso ...


 

1.    libubox概述

  libubox是openwrt新版本中的一個基礎庫,有很多應用是基於libubox開發的,如uhttpd,netifd,ubusd等。

  •   libubox主要提供以下兩種功能:

  提供一套基於事件驅動的機制;

  提供多種開發支持介面,如鏈表、kv鏈表、平衡查找二叉樹、md5、json等。

  •  使用libubox開發的好處有如下幾點:

  可以使程式基於事件驅動,從而可實現在單線程中處理多個任務;

  基於libubox提供的API可以加快開發進度,提高程式的穩定性;

  能更好的將程式融入openwrt架構中,因為新的openwrt的很多應用和庫都基於libubox開發,當前K2T使用的libubox版本為libubox-2014-08-04。

2.    uloop

uloop是libubox下的一個模塊,有三個功能:文件描述符觸發事件的監控,timeout定時器處理, 當前進程的子進程的維護。

2.1   整體框架

2.1.1     主框架介面

  • 初始化事件迴圈

  int uloop_init(void)

  創建一個epoll的句柄,最多監控32個文件描述符。

  設置文件描述符屬性,如FD_CLOEXEC。

  • 事件迴圈主處理入口

  void uloop_run(void)

  • 銷毀事件迴圈

  void uloop_done(void)

  關閉epoll句柄。

        清空定時器鏈表中的所有的定時器。

        清空進程處理事件鏈表中刪除所有的進程事件節點。

2.1.2     主框架流程

 

  uloop_run輪詢處理定時器、進程、描述符事件。

  • 遍歷定時器timeouts鏈表判斷是否有定時器超時,如果有則進行相應的回調處理,沒有跳過。
  • 判斷是否有子進程退出SIGCHLD信號,有就會遍歷processes進程處理的鏈表,調勇相應的回調函數,沒有跳過。
  • 計算出距離下一個最近的定時器的時間,作為文件描述符事件epoll的超時時間。然後epoll進行事件監聽,如果有文件描述符準備就緒(可讀寫時間)則調用相應的回調函數,或者有信號進行中斷epoll返回停止監聽,否則epoll阻塞直到超時時間完成。

2.2   描述符事件

2.2.1     文件描述符uloop結構

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等*/ 

};

2.2.2     描述符uloop使用介面

  • 註冊一個新描述符到事件處理迴圈

  int uloop_fd_add(struct uloop_fd *sock, unsigned int flags)

  uloop最多支持10個描述符事件。

  • 從事件處理迴圈中銷毀指定描述符

  int uloop_fd_delete(struct uloop_fd *sock)

2.2.3     描述符事件流程

 

2.3   定時器事件

2.3.1     定時器timeout結構

struct uloop_timeout

{

    struct list_head list;  //鏈表節點

     bool pending;           //添加一個新的timeout pending是true, false刪除該節點timeout

       uloop_timeout_handler cb; //超時處理函數

       struct timeval time;      //超時時間

   };

2.3.2     定時器使用介面

  • 註冊一個新定時器

  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標記可判斷定時器是否處於生命周期,如果尚處在生命周期內,則返回離定時器超時還有多少時間,單位為毫秒。

2.3.3     定時器的使用

  用戶使用定時器非常簡單

       struct uloop_timeout *t;    //第一步定義一個定時器並申請記憶體空間

       t = malloc(sizeof(*t));

       t->cb = light_ctl_check_cb; //第二步指定回調函數

       t->pending = false;

       uloop_timeout_set(t, 2000); //第三步設置定時器超時時間

2.3.4     定時器功能流程

遍歷定時器鏈表,如果有定時器已經超時,執行該定時器的回調函數。

2.4   進程事件

2.4.1     進程事件處理結構

struct uloop_process {

       struct list_head list;             

       bool pending;                  

       uloop_process_handler cb;  /** 文件描述符, 調用者初始化 */

       pid_t pid;                 /** 文件描述符, 調用者初始化 */

};

2.4.2     進程事件使用介面

  • 註冊新進程到事件處理迴圈

  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)

  從進程事件處理鏈表中刪除該進程事件。

2.4.3     進程事件處理流程

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 基於 Red Hat Enterprise Linux 7.5 或者 CentOS 7.4 基本概念 Linux最核心的一個概念就是:Linux裡面任何東西都可以被視為一個文件,包括系統本身(說到底Linux啟動不就是調用那些開機文件再連帶啟動其他的文件麽~~~) User:文件擁有者 Group: ...
  • 什麼是shell? shell是一個命令解釋器,它在操作系統的最外層,負責直接與用戶對話,把用戶的輸入解釋給操作系統,並處理各種各樣的操作系統的輸出結果,輸出到屏幕返回給用戶。這種對話方式可以是交互的方式(從鍵盤輸入命令,可以立即得到shell的回應),或非交互(執行腳本程式)的方式。下圖的黃色部分... ...
  • Linux幫助文檔 1、--help 一般是Linux命令自帶的幫助信息 如:ls --help 2、man man是linux提供的一個手冊,包含了絕大多數的命令、函數使用說明 該手冊分成許多章節(section),使用man時可以指定不同的章節來瀏覽。 例:man ls; man 2 print ...
  • linux的設計之處就是為了多用戶同時執行不同的任務,但是硬體資源是有限的,不能讓一個用戶無限制的上傳文件,如果不加以限制,那麼磁碟最終將會被充滿,對此我們應該使用uquota來加以限制。 1.quota分類 1.1 軟限制:當達到限制時,提示用戶,但任然允許用戶在限定的額度內使用磁碟 1.2 硬限 ...
  • nc     nc命名netcat,直譯為 網路貓 。在CentOS 7查看幫助的解釋如下所示: 翻譯過來就是可以連接和重定向Sockets。通過查詢其他資料,可以看到nc命令功能確實非常多,它可以打開TCP連接,發送UDP包,監聽TCP/UDP埠,進行埠掃描等等。 基本語法 ...
  • 一、Docker hub 交互 Docker hub 是 Docker 官方維護的一個公共倉庫,大部分需求都可以通過在 Docker hub 中直接下載鏡像來完成。接下來,來看一下怎麼與 Docker hub 進行交互,包括登陸登出以及將本地鏡像推送到 Docker hub 等... 註冊:http ...
  • 在PADS,PCB板設計中,怎麼一次就把絲印的大小設置好? CTRL+ALT+F 組合鍵 打開 選擇過濾器(Filter) 如下圖 去掉其他的勾選,只選擇 Labels 。 之後在板子上滑鼠拖動選上所有絲印。 右鍵選擇 properties 彈出如下視窗,修改需要的大小即可 PADS如何自動調整線寬 ...
  • ulimit [-HSTabcdefilmnpqrstuvx [limit]] 利用ulimit命令可以對資源的可用性進行控制。 -H選項和-S選項分別表示對給定資源的硬限制(hard limit)和軟限制(soft limit)進行設置。 硬限制(hard limit)一旦被設置以後就不能被非ro ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...