首页 | Linux 基础 | 资讯动态 | Linux 应用 | Linux 服务器 | Linux 开发 | Linux 安全 | 专题 | 联盟论坛
  当前位置:主页>Linux 开发>linux 内核>文章内容
深入分析 Linux操作系统的内核链表
来源:www.unix5.com 作者:riechelr_hl 发布时间:2007-05-26  
#define LIST_HEAD_INIT(name) { &(name), &(name) } #define LIST_HEAD(name) struct list_head name = LIST_HEAD_INIT(name)
  

当我们用 LIST_HEAD(nf_sockopts) 声明一个名为 nf_sockopts 的链表头时,它的 next、prev 指针都初始化为指向自己,这样,我们就有了一个空链表,因为 Linux 用头指针的 next 是否指向自己来判断链表是否为空:

 

 static inline int list_empty(const struct list_head *head) 
{ return head->next == head; }
  

除了用 LIST_HEAD() 宏在声明的时候初始化一个链表以外,Linux 还提供了一个 INIT_LIST_HEAD 宏用于运行时初始化链表:

 

#define INIT_LIST_HEAD(ptr) do { (ptr)->next = (ptr); 
(ptr)->prev = (ptr); } while (0)
  

我们用 INIT_LIST_HEAD(&nf_sockopts) 来使用它。

2. 插入/删除/合并

a) 插入

对链表的插入操作有两种:在表头插入和在表尾插入。Linux为此提供了两个接口:

 

 static inline void list_add
(struct list_head *new, struct list_head *head); 
static inline void list_add_tail
(struct list_head *new, struct list_head *head);
  

因为 Linux 链表是循环表,且表头的 next、prev 分别指向链表中的第一个和最末一个节点,所以,list_add 和 list_add_tail 的区别并不大,实际上,Linux 分别用

 

  __list_add(new, head, head->next);
  

 

 __list_add(new, head->prev, head);
  

来实现两个接口,可见,在表头插入是插入在 head 之后,而在表尾插入是插入在 head->prev 之后。

假设有一个新 nf_sockopt_ops 结构变量 new_sockopt 需要添加到 nf_sockopts 链表头,我们应当这样操作:

 

 list_add(&new_sockopt.list, &nf_sockopts);
  

从这里我们看出,nf_sockopts 链表中记录的并不是 new_sockopt 的地址,而是其中的 list 元素的地址。怎么样通过链表访问到 new_sockopt 呢?下面会有详细介绍。

b) 删除

 

 static inline void list_del(struct list_head *entry);

共4页: 上一页 [1] 2 [3] [4] 下一页
 
如果您对本文有任何疑问或者建议,请到论坛讨论区发表您的意见: >> 论坛入口
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
  热点文章
·使用 Linux 系统调用的内核命令
·Linux 2.6.11内核文件IO系统调用
·Linux操作系统的源代码目录树结
·Linux用户态与内核态的交互讲解
·Linux内核对I/O端口的管理实现(
·Linux内核可装载模块对设备驱动
·概述Linux系统的驱动框架及驱动
·详解Linux 2.6内核新文件系统变
·Linux系统可卸载内核模块完全指
·FreeBSD手册讲解(一)--配置FreeB
·编译Linux操作系统的内核讲解
·Linux系统可卸载内核模块完全指
  相关文章
·走向Linux系统高手之路 编译内核
·Linux内核入侵检测安全增强实现
·Linux内核可装载模块对设备驱动
·Linux内核入侵检测安全增强实现
·详细解析Linux操作系统的内核空
·Linux操作系统内核启动参数详细
·剖析Linux 2.6内核在嵌入式上的
·Linux操作系统的源代码目录树结
·使用 Linux 系统调用的内核命令
·Linux内核对I/O端口的管理实现(
·Linux内核对I/O端口的管理实现(
·内核设计篇

本站信息源至:互联网络,均为学习,交流所用,如有版权问题,请联系我们.
站长QQ:397422079 E_mail:riechelr_hl@unix5.com
转载本站内容请注明原作者名.谢谢!