資料結構在coding中起到了非常重要的作用,重要的資料結構包括了鍊錶,棧,佇列,樹等等。這裡介紹一些鍊錶在核心中的實現。
我們書本上學到的鍊錶的一般實現方式如下:
struct my_link
這種做法是資料嵌入到鍊錶結構中。在核心中,存在著各種各樣的資料,很多都需要鍊錶操作。如果對每個資料結構都採用這樣方式來實現鍊錶操作的話,既容易出錯,又無謂的增加了核心的大小。最好核心能提供乙個統一鍊錶操作介面,liunx自然做到了。
資料結構:
struct list_head;
使用:採用資料嵌入liat_head的方式來實現鍊錶。舉個例子
struct net_device;
那麼怎麼獲得根據鍊錶獲得資料結構呢?
需要使用list_entry,最終呼叫container_of巨集。
功能函式:
宣告鍊錶
list_head_init()
list_head
執行時初始化函式
init_list_head
鍊錶遍歷及資料操作
list_for_each 遍歷鍊錶
list_for_each_entry 遍歷鍊錶並取得資料,相當於list_for_each 和list_entry 的結合
鍊錶操作函式
list_add(struct list_head *new,struct list_head *head);
list_add_tail(struct list_head *new,struct list_head *head);
list_del(struct list_head *entry)
list_replcace(struct list_head *old,struct list_head *new);
list_move(struct list_head *list, struct list_head *head);//從乙個鍊錶移動到另外乙個
list_is_last(struct list_head *list, struct list_head *head);
list_empty(const struct list_head *head)
list_splice(const struct list_head *list,struct list_head *head);//合併鍊錶
list_move_tail(struct list_head *list,struct list_head *head);//從尾部乙個鍊錶移動到另外乙個
list擴充套件
1,對應hash列表,linux採用了單指標雙迴圈鍊錶。hlist表頭只有乙個指向首節點的指標,沒有指向尾節點的指標,這樣可能對於海量hash表中表頭能減少一半的空間消耗。
2,對list的操作同樣提供了以_rcu結尾的巨集。rcu(read-copy update)通過延遲寫來提高效能。
linux下tcpdump的使用簡介
簡介 用簡單的話來定義tcpdump,就是 dump the traffic on a network,根據使用者的定義對網路上的資料報進行截獲的包分析工具。tcpdump可以將網路中傳送的資料報的 頭 完全截獲下來提供分析。它支 持針對網路層 協議 主機 網路或埠的過濾,並提供and or not...
Linux下cmake使用簡介
cmake好像都說比直接寫makefile牛一點,因為它可以自動生成makefile。專門針對檔案比較多的情況,要不是這幾天在用別人的 一大堆,我覺得用makefile也夠了,但是據說linux程式設計師必備技能啊,所以還是要學學這麼高階的東西。在源 目錄src中建立cmakelists.txt檔案...
linux 下samba使用簡介
今天裝了一台真正的linux主機 red hat 呵呵。安裝好了ftp,ssh等服務,但是好像還需要個window能和linux共享資料夾的軟體samba,還好,一開始在安裝linux的時候,就按照了smaba,如果沒有,我們可以在iso中提取rpm包來安裝。主要參考文獻為 1.確認smaba是否安...