最近一个项目要用到这个东西,发现确实很好用,就写了个最简单的例子,希望对大家有用,对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中看他们的宏定义,了解他是如何实现的,关键就是了解他是如何读取具体的数据,其实就是一个地址的获取。
分享到:
相关推荐
例如,在`include/linux/netfilter.h`文件中,`nf_sockopt_ops`结构体中就包含了一个`struct list_head`成员,用于组织多个协议族的`nf_sockopt_ops`实例。 **初始化链表** 在Linux内核中,链表头通常是通过`LIST_...
这样,每个 `person` 或 `animal` 实例不仅包含了年龄和体重等数据成员,还能通过 `list` 成员与其他实例形成双向链表结构。 #### 三、`list_head` 相关函数介绍 `<linux/list.h>` 头文件中提供了一系列用于操作...
假设我们有一个自定义的结构体`my_struct`,其中包含一个`list_head`成员`list`,我们可以通过以下方式获取`my_struct`实例: ```c #define list_entry(ptr, type, member) \ container_of(ptr, type, member) ```...
`LIST_HEAD(name)`则创建一个名为`name`的`list_head`结构体实例,并用`LIST_HEAD_INIT(name)`对其进行初始化,使得新链表的首尾节点相同。 `INIT_LIST_HEAD`是一个静态内联函数(代码行28),它的功能和`LIST_HEAD...
无论是链表头节点还是链表中的普通节点,都是`struct list_head`类型的实例。该结构体包含了两个指针字段:`next`和`prev`,分别指向当前节点的下一个节点和前一个节点。 #### 结构体定义与初始化 ```c struct ...
在实际项目中,你可以创建一个结构体来存储你的数据,并在其中包含一个`list_head`成员,这样就可以将该结构体实例插入内核链表中。例如: ```c struct my_data { int data; struct list_head list; }; void add...
创建一个简单的 `list_head` 实例: ```c struct list_head my_list; INIT_LIST_HEAD(&my_list); ``` ##### 3.2. 遍历方向 在遍历链表时,可以从前向后或者从后向前遍历。 ##### 3.3. list_entry **3.3.1. 定义*...
例如,如果有一个名为`autofs`的结构体,其中有一个名为`list`的`list_head`成员,`list_entry(aup, struct autofs, list)`就可以从`aup`这个链表节点指针获取对应的`autofs`结构体实例。 5. **遍历链表**:`list_...
- `LIST_HEAD(list)`:与`INIT_LIST_HEAD`类似,也是初始化一个链表头,但在某些版本的内核中可能有所不同。 3. **链表操作**: - `list_add(head, entry)`:在链表`head`的末尾添加新节点`entry`。 - `list_add...
这样,多个 `nf_sockopt_ops` 实例可以通过它们的 `list` 成员组成一个链表。 ##### 声明和初始化 链表的声明和初始化是通过 `LIST_HEAD()` 宏完成的,例如: ```c #define LIST_HEAD_INIT(name) {&(name),&(name...
2. `list_add(head, entry)`:将新节点`entry`插入到链表头部`head`之前。 3. `list_add_tail(head, entry)`:将新节点`entry`插入到链表头部`head`之后。 4. `list_del(entry)`:从链表中删除节点`entry`。 5. `...
本篇文章将深入探讨如何应用`linux kernel list`,并借助实例帮助理解`container_of`宏以及链表操作。 `linux kernel list`是一个双向循环链表,它在`include/linux/list.h`头文件中定义。这个数据结构非常适用于...
在2.6.x版本的内核中,链表的实现是基于`list_head`结构,这是一种用于构建单向和双向链表的基础。本文将深入探讨内核链表的实现原理、数据结构以及常见操作接口。 首先,我们来看链表数据结构的基本概念。链表不同...
struct list_head *next, *prev; }; ``` 为了方便操作,Linux内核提供了以下关键宏: 1. `LIST_HEAD_INIT`: 初始化一个空链表。 2. `LIST_HEAD`: 定义一个链表头。 3. `INIT_LIST_HEAD`: 初始化链表头。 4. `list...
《Head First Java》书中包含了许多互动练习和实例,旨在通过轻松愉快的学习方式帮助读者掌握以上知识点。通过实践这些程序,你将能够更好地理解Java编程的核心概念,并逐步成长为一名熟练的Java开发者。
1. **初始化链表**:`LIST_HEAD_INIT(list)` 或 `LIST_HEAD(list)` 用于创建一个新链表并初始化头节点。 2. **添加元素**:`list_add(head, entry)` 在链表头部添加元素,`list_add_tail(entry, head)` 在尾部添加。...
`list_entry`和`container_of`宏在遍历时起到了关键作用,它们帮助我们从`list_head`指针恢复到实际的数据结构实例。 举个简单的例子,创建一个链表并进行操作: ```c #include <linux/list.h> typedef struct ...
在实际编程中,可以定义自己的结构体来包含`struct list_head`,如示例中的`struct list_node`,它有一个`data`成员存储具体数据,以及一个名为`list`的`struct list_head`成员,表示链表节点。 以下是一个简单的...