队列的操作中,一般都是为每一个队列写一个队列操作函数,普通的程序多写几个队列操作函数可能并不会增加太多的负担,但是对于Linux内核,里面使用了很多的队列操作,如果为每个队列都写一个队列操作函数这将是一件很多麻烦的事。所以我们想是否可以写一个模板让适合于所有的队列操作。
当然是可行的,看一下linux内核中是如何实现的吧!
定义一个结构体当作寄宿者:
struct list_head
{
struct list_head *next;
struct list_head *prev;
};
再定义一个宿主:
typedef struct page
{
struct list_head list;
......
struct list_head lru;
.......
}page ;
通过将寄宿者寄宿在宿主中,我们就可以只对寄宿者进行队列操作。
现在我们还要思考一个问题,就是我们只是对寄宿者进行队列操作,那我们如何在知道寄宿者指针的情况下找到宿主呢?其实这个问题还是很简单地,现在我们知道了寄宿者的指针位置要找到宿主的指针地址,只要知道寄宿者的指针相对于宿主指针的偏移量就可以了。下面给出代码:
d=(unsigned long )(&((struct page *)0)->list);
其中d就是list相对于page的偏移量。
By @liupsmail