内核中struct list_head的使用

        如果想在用户程序中使用内核的 struct list_head 数据结构,那么可以参考 scripts/kconfig/list.h 中的实现,甚至可以将其直接拷贝出来使用。

        struct list_head 可以连接任何带有 struct list_head 元素的结构体。它的使用方法也很简单,主要分为以下几个步骤:

  • 通过 LIST_HEAD() 初始化一个 struct list_head 头结点,即初始化一个链表
  • 定义带有 struct list_head 元素的结构体
  • 通过 list_add_tail() 等接口将上述结构体实例中的 struct list_head 元素连接到链表中
  • 通过 list_entry()、list_for_each_entry() 等接口从链表中获取结构体实例

        下面看代码示例:

#include <stdio.h>
#include <string.h>
#include "list.h"

struct struct1 {
	const char *name;
	struct list_head list;
	int value1;
};

struct struct2 {
	const char *name;
	struct list_head list;
	int value2;
};

int main(void)
{
	struct struct1 a = {
		"struct1 -- a",
		LIST_HEAD_INIT(a.list),
		100,
	};

	struct struct1 b = {
		"struct1 -- b",
		LIST_HEAD_INIT(b.list),
		101,
	};

	struct struct2 c = {
		"struct2 -- c",
		LIST_HEAD_INIT(c.list),
		102,
	};

	struct struct2 d = {
		"struct2 -- d",
		LIST_HEAD_INIT(d.list),
		103,
	};

	LIST_HEAD(g_list);

	list_add_tail(&a.list, &g_list);
	list_add_tail(&b.list, &g_list);
	list_add_tail(&c.list, &g_list);
	list_add_tail(&d.list, &g_list);

	struct struct1 *p;
	struct struct2 *q;

	list_for_each_entry(p, &g_list, list) {
		if (strncmp(p->name, "struct1", 7) == 0)
			printf("name=%s, value=%d\n", p->name, p->value1);
		else {
			q = (struct struct2 *)p;
			printf("name=%s, value=%d\n", q->name, q->value2);
		}
	}

	return 0;
}

运行结果:

$ gcc main.c -o main
$ ./main
name=struct1 -- a, value=100
name=struct1 -- b, value=101
name=struct2 -- c, value=102
name=struct2 -- d, value=103

当然,平时一般也没人这么用,为了使用方便,链表上的结构体类型最好一致。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值