比list_entry更简洁的写法list_for_each_entry 在list.h中,处理每个节点,宏list_entry是个好选择,但是需要用到for循环,而宏list_for_each_entry把for和list_entry结合起来了,使用更加方便。 list_for_each_entry用法 list_for_each_entry(pos,head,member) 其中,pos为定位外面结构的指针,在list_entry中即返回的地址,这里在这个宏中给它赋值。 head为struct list_head结构指针,在list_entry中为第一个参数。 member为在外面结构中的struct list_head结构。在list_entry中为第三个参数。改写上个遍历进程的程序为:(见上篇)#include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/sched.h> static void taskprint(void) { struct task_struct *p; struct list_head *current_head; current_head=¤t->tasks; list_for_each_entry(p,current_head,tasks)//通过它,每个结构指针都放入了p中 { printk("%d\t%s\n",p->pid,p->comm); } } static int taskprintinit(void) { printk("task print is working....\n"); taskprint(); return 0; } static void taskprintexit(void) { printk("task print is leaving...\n"); } module_init(taskprintinit); module_exit(taskprintexit); <span style="font-family:AR PL UMing HK, monospace;"></span><pre name="code" class="cpp">我们这里把list_entry和list_for_each_entry的用法总结一下 struct task_struct { ...... ...... int pid; char *comm; ...... struct list_head tasks; ............ } list_entry: { struct task_struct *ptask; struct list_head *plist; plist=&(current->tasks)->next; for(;plist=¤t->tasks; plist=plist->next) { ptask=list_entry(plist,struct task_struct,tasks); printk(“....”); } list_for_each_entry: { struct task_struct *ptask; struct list_head *current_head; current_head=&(current->tasks); list_for_each_entry(ptask,current_head,tasks) { printk(“....”); } } 这里可以看出来list_for_each_entry的简洁
版权声明:本文为u012566181原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。