其中,new表示要插入的新节点,head表示链表的头节点。函数的实现调用了另一个辅助函数__list_add,这个函数的作用是将new节点插入到head节点之前。 使用list_add_tail函数非常简单,只需要将要插入的节点和链表的头节点作为参数传入即可。在Linux内核的源码中,这个函数被广泛地使用,在各种数据结构中都可以看到其身影。 一个典型的使
Linux内核驱动开发会经常用到Linux内核中经典的双向链表list_head,以及它的拓展接口和宏定义:list_add、list_add_tail、list_del、list_entry、list_for_each等。 在内核源码中,list_head结构体的定义在文件source_code/include/linux/types.h文件中,结构体定义如下: structlist_head{structlist_head*next,*prev;}...
看源码吧:static inline void __list_add(struct list_head *new,struct list_head *prev,struct list_head *next){next->prev = new; //(1)new->next = next; //(2)new->prev = prev; //(3)prev->next = new; //(4)}static inline void list_add_tail(struct list_head *new...
struct my_data_list{int data;struct list_head list;/* list head , 这个至关重要,后期遍历通过container_of 解析my_data_list 地址 */}; 创建一个节点: 代码语言:javascript 复制 struct my_data_list first_data={.val=1,/* 这里有点绕,事实上就是将first_data.list , 前驱和后继都指向自己进行初...
2. list_add_tail 接口 上面所讲的list_add接口是从链表头header后添加的节点。同样,内核也提供了从链表尾处向前添加节点的接口list_add_tail.让我们来看一下它的具体实现。 1/**2* list_add_tail - add a new entry3* @new: new entry to be added4* @head: list head to add it before5*6* ...
__list_add(new, head, head->next); } 在尾部插入,在最后一个元素和头指针间插入, 因为是循环链表嘛~ static inline voidlist_add_tail(struct list_head *new, struct list_head *head) { __list_add(new, head->prev, head); } 删除操作 ...
假如我们创建一个新的struct fox节点,并把它加入fox_list,那么我们这样做: struct fox f; list_add(&f->list, &fox_list); 如果想想链表尾部添加一个节点,可以使用下面函数: list_add_tail(struct list_head *new, struct list_head *head) 该函数向指定链表的head节点之前插入一个new节点。
Linux内核实现了一批优雅而功能强大的双向循环列表操作宏,它们位于/usr/include/linux/list.h(请注意直接#include会报编译错误),这些宏可以直接扣出来,在需要时使用。 2. 通用宏 2.1. typeof 请注意typeof并不是一个宏,而是GCC的一个内建操作符。
用途:列表(List)显示目录内容 格式:ls [选项]… [目录或文件名] 常用命令选项 -l :以长格式显示 -a:显示所有子目录和文件的信息,包括隐藏文件 -d:显示目录本身的属性 -A:类似于“-a”,但不显示“.”和“…”目录的信息 -h:以更易读的字节单位(K、M等)显示信息 ...
● 文件查看:cat、more、less、head、tail ● 文件权限:chmod、chgrp、chown ● 文件搜索:grep、find、wc ● 文件编辑:vi、vim 文件操作命令:ls -l ll 用途:显示当前目录下的文件和文件夹,类似Dos中的Dir,list 列表。 文件管理指令:ls ● 指令名称:ls ...