我正在研究Linux内核模块,我正在使用链接列表构建。我需要对此列表进行排序,并且我看到有一个内置的list_sort函数,如下所述。但是我对priv
参数感到困惑。这个参数用于什么以及我需要传递什么?在任何地方都没有很多文档。
在linux/list_sort.h
中定义:
/**
* list_sort - sort a list
* @priv: private data, opaque to list_sort(), passed to @cmp
* @head: the list to sort
* @cmp: the elements comparison function
*
* This function implements "merge sort", which has O(nlog(n))
* complexity.
*
* The comparison function @cmp must return a negative value if @a
* should sort before @b, and a positive value if @a should sort after
* @b. If @a and @b are equivalent, and their original relative
* ordering is to be preserved, @cmp must return 0.
*/
void list_sort(void *priv, struct list_head *head,
int (*cmp)(void *priv, struct list_head *a,
struct list_head *b))
修改 所以我理解我可以为priv参数传递NULL。现在我不确定如何编写我的cmp函数,因为list_sort接受struct list_head指针,但我有自己定义的struct birthday,其中包含list_head。我的下面的比较函数不起作用,因为list_head不包含我的struct birthday所拥有的成员。
struct birthday {
char *name;
int month;
int day;
int year;
struct list_head list;
};
int compare(void *priv, struct list_head *a, struct list_head *b) {
if (a != NULL && b != NULL) {
struct birthday personA = a;
struct birthday personB = b;
int monthA = personA.month;
int monthB = personB.month;
int dayA = personA.day;
int dayB = personB.day;
int yearA = personA.year;
int yearB = personB.year;
if (yearA < yearB) {
return 1;
} else if (yearB < yearA) {
return -1;
} else {
if (monthA < monthB) {
return 1;
} else if (monthB < monthA) {
return -1;
} else {
if (dayA < dayB) {
return 1;
} else if (dayB < dayA) {
return -1;
} else {
return 0;
}
}
}
}
}
答案 0 :(得分:1)
priv
参数只是一个传递回cmp
函数的参数,list_sort
本身没有使用它。如果您不需要,可以传递NULL
。
这样的参数对于C中的回调函数是常见的,以避免使用全局变量将信息传递给回调函数。
答案 1 :(得分:0)
使用container_of检索您的实际结构。 container_of
函数的第一个操作数是list_head
,第二个是结构的类型。用list
填充第三个参数。
很容易找出container_of
函数的工作原理。它将head->next->prev
返回到您通过第二个参数传递的类型中。