在linux核心中,有一種通用的雙向迴圈鍊錶,構成了各種佇列的基礎。鍊錶的結構定義和相關函式均在include/linux/list.h中,下面就來全面的介紹這一鍊錶的各種api。
struct list_head ;
這是鍊錶的元素結構。因為是迴圈鍊錶,表頭和表中節點都是這一結構。有prev和next兩個指標,分別指向鍊錶中前一節點和後一節點。
#define list_head_init(name)
#define list_head(name) \
struct list_head name = list_head_init(name)
static inline void init_list_head(struct list_head *list)
在初始化的時候,煉表頭的prev和next都是指向自身的。
static inline void __list_add(struct list_head *new,
struct list_head *prev,
struct list_head *next)
static inline void list_add(struct list_head *new, struct list_head *head)
static inline void list_add_tail(struct list_head *new, struct list_head *head)
雙向迴圈鍊錶的實現,很少有例外情況,基本都可以用公共的方式來處理。這裡無論是加第乙個節點,還是其它的節點,使用的方法都一樣。
另外,鍊錶api實現時大致都是分為兩層:一層外部的,如list_add
、list_add_tail
,用來消除一些例外情況,呼叫內部實現;一層是內部的,函式名前會加雙下劃線,如__list_add
,往往是幾個操作公共的部分,或者排除例外後的實現。
static inline void __list_del(struct list_head * prev, struct list_head * next)
static inline void list_del(struct list_head *entry)
static inline void list_del_init(struct list_head *entry)
list_del
是鍊錶中節點的刪除。之所以在呼叫__list_del
後又把被刪除元素的next、prev指向特殊的list_position1
和list_position2
,是為了除錯未定義的指標。
list_del_init
則是刪除節點後,隨即把節點中指標再次初始化,這種刪除方式更為實用。
static inline void list_replace(struct list_head *old,
struct list_head *new)
static inline void list_replace_init(struct list_head *old,
struct list_head *new)
list_replace
是將鍊錶中乙個節點old,替換為另乙個節點new。從實現來看,即使old所在地鍊錶只有old乙個節點,new也可以成功替換,這就是雙向迴圈鍊錶可怕的通用之處。
list_replace_init
將被替換的old隨即又初始化。
工業機械人核心部件發展還需要加強
國際機構預計,到明年底,中國有望成為全球第二大機械人市場。但在滬啟工業機械人的第19屆中國國際小電機技術展會傳出訊息,作為製造業大國的中國,國內用於機械人的微型特種電機80 依賴國外產品,機械人各種 關節 中的關鍵零部件遠未自主可控,成為機械人產業高速發展的大瓶頸。世界上工業機械人保有量達160萬台...
音訊監控叫好又叫座,核心部件拾音器怎麼裝
目前,音訊監控已廣泛應用在公共設施當中,一套完整的音訊監控系統包括聲音採集部分 語音降噪處理部分 網路錄音部分 語音對講部分 聲音智慧型分析部分。通過音訊監控的場景分析來判斷公共場景下的異常行為,這種技術是基於各類異常聲音在時域 頻域的特徵,結合模式識別的分類方法可以對異常事件報警。拾音器的安裝 一...
音訊監控叫好又叫座 核心部件拾音器怎麼裝?
目前,音訊監控已廣泛應用在公共設施當中,一套完整的音訊監控系統包括聲音採集部分 語音降噪處理部分 網路錄音部分 語音對講部分 聲音智慧型分析部分。通過音訊監控的場景分析來判斷公共場景下的異常行為,這種技術是基於各類異常聲音在時域 頻域的特徵,結合模式識別的分類方法可以對異常事件報警。拾音器的安裝 一...