核心資料結構-連結串列
連結串列作為一種常用的資料結構,核心中使用很多,常用的連結串列把資料結構放入連結串列,定義方式如下:
struct fox {
unsigned long tail_length;
unsigned long weight;
bool is_fantastic;
struct fox *next;
struct fox *prev;
};
這種連結串列的定義方式就是,等你建立一個鏈之後,需要自己去實現它的增刪改查操作,如果有很多不同型別的連結串列,就需要為其重複實現增刪改查。為了避免重複造輪子,核心提供了一種精妙的設計——把連結串列放到資料結構。
連結串列在<linux/list.h>中宣告如下:
struct list_head {
struct list_head *next;
struct list_head *prev;
};
該連結串列實現了通用的操作比如list_add()方法。
在需要使用連結串列的時候,將改連結串列結構放到自定義的資料結構:
struct fox {
unsigned long tail_length;
unsigned long weight;
bool is_fantastic;
struct list_head list;
};
該連結串列的操作方法指接受list_head結構作為引數,需要找父結構中包含的變數試,可以使用container_of()巨集。
#define container_of(ptr, type, member) ({ const typeof(((type *)0) *__mptr = (ptr); (type *) ((char *)__mptr - offsetof(type, member));})
因為在C語言中,一個給定結構的變數偏移在編譯時,地址就被ABI固定下來了。