在Linux中,container_of
是一個宏函數,用于計算給定成員變量的指針所在的結構體的指針。它的定義如下:
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
container_of
宏函數接受三個參數:
ptr
:指向成員變量的指針。type
:結構體類型。member
:成員變量的名稱。它的作用是返回給定成員變量的指針所在的結構體的指針。
舉個例子,假設我們有以下的結構體定義:
struct person {
char name[20];
int age;
struct list_head list;
};
其中list
是一個鏈表節點,類型為struct list_head
。如果我們有一個指向list
的指針變量ptr
,我們可以使用container_of
來獲取ptr
所在的person
結構體的指針,如下所示:
struct person *p = container_of(ptr, struct person, list);
通過這樣的方式,我們可以在鏈表中通過節點指針獲取整個結構體,并進行相應的操作。這在Linux內核中經常使用,特別是在處理鏈表和數據結構時。