专栏名称: Linux内核之旅
Linux内核之旅
目录
相关文章推荐
Linux就该这么学  ·  输入中文秒变运维代码的神器,竟还接入满血 ... ·  17 小时前  
Linux爱好者  ·  分布式系统编程已停滞?! ·  2 天前  
Linux就该这么学  ·  去你的996!打工人非牛马,大厂强制下班双休 ·  2 天前  
Linux就该这么学  ·  AI 公司董事长。。十几刀。。刺死 CTO。。。 ·  2 天前  
Linux爱好者  ·  湖南大学的 DeepSeek ... ·  4 天前  
51好读  ›  专栏  ›  Linux内核之旅

open()在Linux内核的实现(3)-“.”和“..”的处理

Linux内核之旅  · 公众号  · linux  · 2017-10-16 09:18

正文

1.基本说明

open()在内核的实现过程中,有一大部分工作都是路径查找。路径查找即对用户态传入的文件路径以目录项为单位进行依次遍历。目录项包含五种类型,当目录项为”.”(LAST_DOT)或者“..”(LAST_DOTDOT),那么walk_component()将通过handle_dots()对其进行处理。

实际上,如果当前目录项为“.”,那么该函数什么也不做直接返回(返回到link_path_walk中)即可。也就是说,如果当前目录项为”.”,那么walk_component()此时的作用就是“越过”这些当前目录,而nd信息不做改变,因为所有“.”之前的普通目录项已经更新了nd。比如/home/edsionte/./././doc,目录项edsionte之后的“.”对应的nd与edsionte目录项相同,因此walk_component()在遇到“.”时直接越过他们,进而处理doc目录项。

如果当前目录项为“..”,即当前要walk的目录项为上一次已经walk的目录项的父目录,也就是需要向上获取当前目录的父目录。

2.函数实现

2.1.handle_dots()

该函数的实现比较简单,内部根据当前的walk类型做了函数分发。


1

static inline int handle_dots( struct nameidata *nd, int type) ;


如果当前搜索路径的模式位rcu,则进入follow_dotdot_rcu()的流程;否则进入follow_dotdot()的流程。

2.2.follow_dotdot_rcu()

该函数的声明如下:


1 static int follow_dotdot_rcu( struct nameidata *nd);



该函数是在rcu模式下获取父目录项信息,如果搜索成功,则返回0;否则,返回ECHILD,也就是说需要切换到ref-walk方式下进行搜索路径。该函数的主要处理过程如下:

1.如果有需要的话,首先通过set_root_rcu()设置当前路径的根目录信息。可以在path_init()中获知,只有搜索路径是绝对路径,nd中的root才会在一开始就被设置;否则,比如是相对路径,那么这里就必须对根目录进行设置了。因为此处是向上搜索,可能会一直找到根目录处。

2.进入循环体,向上获取当前目录项的父目录项。通过情况下,这个循环体只会被执行一次即退出,只有当父目录项为一个挂载点时才有可能不断进行循环。

3.如果退出循环体,至此已经获取到了当前目录项的上一级目录项(即“..”所代表的父目录项)。







请到「今天看啥」查看全文