linux内核删除list_del()删除元素…
来源:互联网 发布:淘宝小号无忧网 编辑:程序博客网 时间:2024/05/22 14:34
为什么说调用list_del()删除元素有安全隐患?具体看源代码:
static inline void __list_del(struct list_head * prev, structlist_head * next)
{
next->prev = prev;
prev->next = next;
}
static inline void list_del(struct list_head *entry)
{
__list_del(entry->prev, entry->next);
entry->next = LIST_POISON1;
entry->prev = LIST_POISON2;
}
可以看出,当执行删除操作的时候, 被删除的节点的两个指针被指向一个固定的位置(entry->next =LIST_POISON1;
entry->prev = LIST_POISON2;)。而list_for_each(pos,head)中的pos指针在遍历过程中向后移动,即pos =pos->next,如果执行了list_del()操作,pos将指向这个固定位置的next, prev,而此时的next,prev没有任何意义,别无选择,出错。
而list_for_each_safe(p, n, head) 宏解决了上面的问题:
#define list_for_each_safe(pos, n, head) \
for (pos = (head)->next, n = pos->next; pos != (head);\
pos = n, n = pos->next)
它采用了一个同pos同样类型的指针n 来暂存将要被删除的节点指针pos,从而使得删除操作不影响pos指针!
实际上,list.h的设计可谓精益求精,煞费苦心,用简洁的代码突破计算机科学中传统的链表实际机制,不仅考虑了单处理机,还利用了PaulE.McKenney提出的RCU(读拷贝更新)的技术,从而提高了多处理机环境下的性能。关于RCU,请看http://www.rdrop.com/users/paulmck/rclock/
- linux内核删除list_del()删除元素…
- Linux删除旧内核
- linux删除旧内核
- linux删除多余内核
- Linux旧内核删除
- Linux删除旧内核
- Linux:删除内核
- Linux内核的删除
- 彻底删除老linux内核
- 删除Ubuntu Linux旧内核
- ubuntu删除linux旧内核
- linux删除旧的内核
- [备忘]删除linux旧内核
- Linux添加与删除内核
- [note]如何删除linux内核
- 删除元素.
- 删除元素
- 删除元素
- 预处理调试标志 -D
- win7下装debian6.0.5双系统
- 通知链
- 包含min函数的最小栈
- The journey of a packet through the linux 2.4network stack
- linux内核删除list_del()删除元素…
- ip层和4层的接口实现分析
- showdown.js使用示例(把markdown转化为html)
- Linux网络协议栈协议的处理
- 2012年10月17日
- 深入理解RunLoop(链接)
- 网络协议的初始化dev_add_pack
- 位字段-C语言
- C:字符串