通过unregister_filesystem()函数学习linux单链表操作

通过unregister_filesystem()函数学习linux单链表操作

基础介绍    在linux内核中,每一种注册了的文件系统都由一个类型为file_system_type的结构体来代表,该结构体中含有一个类型为file_system_type*的域next,linux正是通过这个next域把所有注册了的文件系统连接起来的,同时,linux还定义了一个指向链表中第一个元素的全局指针file_systems和一个用来用来防止并发访问该链表的读/写自旋锁file_systems_lock。有了这些基础知识,我们开始下面的unregister_filesystem函数的分析。

代码分析    unregister_filesystem源代码如下:

  1. int unregister_filesystem(struct file_system_type * fs)
  2. {
  3.     struct file_system_type ** tmp;
  4.     write_lock(&file_systems_lock);
  5.     tmp = &file_systems;
  6.     while (*tmp) {
  7.         if (fs == *tmp) {
  8.             *tmp = fs->next;
  9.             fs->next = NULL;
  10.             write_unlock(&file_systems_lock);
  11.             return 0;
  12.         }
  13.         tmp = &(*tmp)->next;
  14.     }
  15.     write_unlock(&file_systems_lock);
  16.     return -EINVAL;
  17. }

由该函数名字可知,这个函数的作用是注销一个已注册的文件系统,它的输入参数就是一个指向代表已注册文件系统的结构体的指针。整个函数的操作就是:查找文件系统链表,若找到需要注销的文件系统描述结构就将该结构从链表上摘除。这个算法的优秀之处就在于:在整个操作单链表的过程中它只使用了一个临时指针变量。

代码注释:

    3    申请一个类型为struct file_system*的指针tmp,为什么要申请这种类型的指针?

    5    获得保护单链表的自旋锁。

    6    给3中申请的指针tmp赋值为指向单链表头那个指针变量的地址。

    7    判断tmp是否为空。为空则退出。

    8    判断tmp中的内容是否等于要注销的文件系统描述结构体首地址。

    9—12    若8中判断相等,则将该fs指向的结构体从单链表中摘除,并返回成功。请体会下该代码如何摘除结构体的。

    14    将tmp赋值为指向下一个结构体的指针next的地址。

    16    释放保护单链表的自旋锁。

    17    返回出错

整个算法的关键部分就在于:申请的临时指针变量不是直接指向单链表中的结构体的,而是指向的“指向结构体的指针”,这些“指向结构体的指针”包括:指向单链表第一个元素的指针以及每一个结构体中的next变量。这里我们可以把指向单链表第一个元素的指针file_systems看成一个特殊的next元素来理解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值