`
andrew913
  • 浏览: 188843 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

list_head 实例

阅读更多
最近一个项目要用到这个东西,发现确实很好用,就写了个最简单的例子,希望对大家有用,对linux下面的编程了解实在太少,正在努力学习中,学生嘛,慢慢来,不急躁。
#define __KERNEL__ //这样才能使用list.h,具体请看list.h
#include "list.h" /*由于我的机器上没有list.h,所以我拷贝了一个,如果你机器上有,应该是加#include <linux/list.h>*/
#include <stdio.h> 
#include <string.h>

#define MAX_USER_LEN 32
#define MAX_PAS_LEN 32
#define MAX_SERVER_LEN 1024

 
typedef struct server_detect_ftp
{
	struct list_head list;
	char server[MAX_SERVER_LEN];
	int port;
	char username[MAX_USER_LEN];
	char password[MAX_PAS_LEN];
}server_detect_ftp_t;

int main(void)
{
	struct list_head head;//头部
	server_detect_ftp_t ftp_link;
	server_detect_ftp_t ftp_link1;
	server_detect_ftp_t *entry;
	struct list_head *p;
	INIT_LIST_HEAD(&head);//初始化头部
	strcpy(ftp_link.server,"www.163.com");
	ftp_link.port=34;
	strcpy(ftp_link.username,"good");
	strcpy(ftp_link.password,"good");

	strcpy(ftp_link1.server,"www.163.com");
	ftp_link1.port=34;
	strcpy(ftp_link1.username,"good");
	strcpy(ftp_link1.password,"good");

	INIT_LIST_HEAD(&head);

	list_add(&ftp_link.list,&head);
	list_add(&ftp_link1.list,&head);//添加链表
	list_del(&ftp_link1.list);//删除链表
	list_for_each(p,&head)//遍历
	{
		entry=list_entry(p,struct server_detect_ftp,list);//读取某个值

		printf("%s\n",entry->username);
	}

	return 0;
}




list_head在实际应用中很有用,而且他的设计非常有意思,大家可以去list.h中看他们的宏定义,了解他是如何实现的,关键就是了解他是如何读取具体的数据,其实就是一个地址的获取。
2
1
分享到:
评论

相关推荐

    Linux内核之list_head

    例如,在`include/linux/netfilter.h`文件中,`nf_sockopt_ops`结构体中就包含了一个`struct list_head`成员,用于组织多个协议族的`nf_sockopt_ops`实例。 **初始化链表** 在Linux内核中,链表头通常是通过`LIST_...

    深入浅出linux内核源代码之双向链表list_head.pdf

    这样,每个 `person` 或 `animal` 实例不仅包含了年龄和体重等数据成员,还能通过 `list` 成员与其他实例形成双向链表结构。 #### 三、`list_head` 相关函数介绍 `&lt;linux/list.h&gt;` 头文件中提供了一系列用于操作...

    内核数据结构之双向循环链表

    假设我们有一个自定义的结构体`my_struct`,其中包含一个`list_head`成员`list`,我们可以通过以下方式获取`my_struct`实例: ```c #define list_entry(ptr, type, member) \ container_of(ptr, type, member) ```...

    list.h 浅谈 手把手教你

    `LIST_HEAD(name)`则创建一个名为`name`的`list_head`结构体实例,并用`LIST_HEAD_INIT(name)`对其进行初始化,使得新链表的首尾节点相同。 `INIT_LIST_HEAD`是一个静态内联函数(代码行28),它的功能和`LIST_HEAD...

    Linux内核双向链表简单分析

    无论是链表头节点还是链表中的普通节点,都是`struct list_head`类型的实例。该结构体包含了两个指针字段:`next`和`prev`,分别指向当前节点的下一个节点和前一个节点。 #### 结构体定义与初始化 ```c struct ...

    kernel list

    在实际项目中,你可以创建一个结构体来存储你的数据,并在其中包含一个`list_head`成员,这样就可以将该结构体实例插入内核链表中。例如: ```c struct my_data { int data; struct list_head list; }; void add...

    Linux内核list&hlist;解读

    创建一个简单的 `list_head` 实例: ```c struct list_head my_list; INIT_LIST_HEAD(&my_list); ``` ##### 3.2. 遍历方向 在遍历链表时,可以从前向后或者从后向前遍历。 ##### 3.3. list_entry **3.3.1. 定义*...

    linux内核链表(一套精彩的链表数据结构)

    例如,如果有一个名为`autofs`的结构体,其中有一个名为`list`的`list_head`成员,`list_entry(aup, struct autofs, list)`就可以从`aup`这个链表节点指针获取对应的`autofs`结构体实例。 5. **遍历链表**:`list_...

    list_list_

    - `LIST_HEAD(list)`:与`INIT_LIST_HEAD`类似,也是初始化一个链表头,但在某些版本的内核中可能有所不同。 3. **链表操作**: - `list_add(head, entry)`:在链表`head`的末尾添加新节点`entry`。 - `list_add...

    深入分析_Linux_内核链表的数据结构.doc

    这样,多个 `nf_sockopt_ops` 实例可以通过它们的 `list` 成员组成一个链表。 ##### 声明和初始化 链表的声明和初始化是通过 `LIST_HEAD()` 宏完成的,例如: ```c #define LIST_HEAD_INIT(name) {&(name),&(name...

    Linux代码分析 本文详细分析了 2.6.x 内核中链表结构的实现,并通过实例对每个链表操作接口进行了详尽的讲解。

    2. `list_add(head, entry)`:将新节点`entry`插入到链表头部`head`之前。 3. `list_add_tail(head, entry)`:将新节点`entry`插入到链表头部`head`之后。 4. `list_del(entry)`:从链表中删除节点`entry`。 5. `...

    linux kernel list的应用

    本篇文章将深入探讨如何应用`linux kernel list`,并借助实例帮助理解`container_of`宏以及链表操作。 `linux kernel list`是一个双向循环链表,它在`include/linux/list.h`头文件中定义。这个数据结构非常适用于...

    内核链表--内核学习第一步

    在2.6.x版本的内核中,链表的实现是基于`list_head`结构,这是一种用于构建单向和双向链表的基础。本文将深入探讨内核链表的实现原理、数据结构以及常见操作接口。 首先,我们来看链表数据结构的基本概念。链表不同...

    抽取linux内核链表模块

    struct list_head *next, *prev; }; ``` 为了方便操作,Linux内核提供了以下关键宏: 1. `LIST_HEAD_INIT`: 初始化一个空链表。 2. `LIST_HEAD`: 定义一个链表头。 3. `INIT_LIST_HEAD`: 初始化链表头。 4. `list...

    Head-First-Java-master_java_java编程_HeadFirst_

    《Head First Java》书中包含了许多互动练习和实例,旨在通过轻松愉快的学习方式帮助读者掌握以上知识点。通过实践这些程序,你将能够更好地理解Java编程的核心概念,并逐步成长为一名熟练的Java开发者。

    linux内核链表测试用例

    1. **初始化链表**:`LIST_HEAD_INIT(list)` 或 `LIST_HEAD(list)` 用于创建一个新链表并初始化头节点。 2. **添加元素**:`list_add(head, entry)` 在链表头部添加元素,`list_add_tail(entry, head)` 在尾部添加。...

    Linux 内核通用链表学习小结

    `list_entry`和`container_of`宏在遍历时起到了关键作用,它们帮助我们从`list_head`指针恢复到实际的数据结构实例。 举个简单的例子,创建一个链表并进行操作: ```c #include &lt;linux/list.h&gt; typedef struct ...

    Linux中的内核链表实例详解

    在实际编程中,可以定义自己的结构体来包含`struct list_head`,如示例中的`struct list_node`,它有一个`data`成员存储具体数据,以及一个名为`list`的`struct list_head`成员,表示链表节点。 以下是一个简单的...

Global site tag (gtag.js) - Google Analytics