Linux中檔名解析處理原始碼分析

2021-09-05 03:42:51 字數 2840 閱讀 7157

前言

linux中對乙個檔案進行操作的時候,一件很重要的事情是對檔名進行解析處理,並且找到對應檔案的inode物件,然後建立表示檔案的file物件。在此,對檔名解析過程,並且如何找到對應inode的過程進行原始碼分析。分析**基於linux-3.2版本。

關鍵函式分析

不管是通過應用層的api函式還是在核心中開啟乙個檔案,最終都需要呼叫filp_open函式,該函式的主要職責就是解析檔名,找到檔案對應的inode物件,然後分配記憶體建立file物件,最後執行該檔案對應的file->open函式。

filp_open的核心處理函式是path_openat,該函式分析如下:

static struct file *path_openat(int dfd, const char *pathname,  

struct nameidata *nd, const struct open_flags *op, int flags)  

nd->flags |= lookup_parent;  

nd->flags &= ~(lookup_open|lookup_create|lookup_excl);  

error = follow_link(&link, nd, &cookie);  

if (unlikely(error))  

filp = err_ptr(error);  

else  

filp = do_last(nd, &path, op, pathname);  

put_link(nd, &link, cookie);  

}  out:  

if (nd->root.mnt && !(nd->flags & lookup_root))  

path_put(&nd->root);  

if (base)  

fput(base);  

release_open_intent(nd);  

return filp;  

out_filp:  

filp = err_ptr(error);  

goto out;  

}

static int link_path_walk(const char *name, struct nameidata *nd)  

while (c && (c != '/'));  

/* 得到字串長度和hash結果 */  

this.len = name - (const char *) this.name;  

this.hash = end_name_hash(hash);  

type = last_norm;  

/* last_dot和last_dotdot情形判斷 */  

if (this.name[0] == '.') switch (this.len)   

break;  

case 1: /* last_dot是當前目錄 */  

type = last_dot;  

}  if (likely(type == last_norm))   

}  /* 如果字串已經解析完畢,直接跳轉到last_component */  

/* remove trailing slashes? */  

if (!c)  

goto last_component;  

while (*++name == '/');  

if (!*name)  

goto last_component;  

/* 通過walk_component函式找到解析字串對應的inode,並且將nd->inode改稱最新inode,準備繼續解析後面的字串資訊。因為目錄項所管理的inode在系統中通過hash表進行維護,因此,通過hash值可以很容易的找到inode。如果記憶體中還不存在inode物件,對於ext3檔案系統會通過ext3_lookup函式從磁碟上獲取inode的元資料資訊,並且構造目錄項中所有的inode物件。 */  

err = walk_component(nd, &next, &this, type, lookup_follow);  

if (err <

0)  

return err;  

if (err)   

if (can_lookup(nd->inode))  

continue;  

/* 字串還沒有解析完畢,但是當前的inode已經繼續不允許解析處理了,所以,返回錯誤碼 */  

err = -enotdir;   

break;  

/* here ends the main loop */  

last_component:  

/* 最後乙個字串不需要解析處理,需要由do_last函式來處理,此處結束解析,正確返回 */  

nd->

last = this;  

nd->

last_type = type;  

return 0;  

}  terminate_walk(nd);  

return err;  } 

小結

檔名解析處理是檔案系統的必備功能,通過檔名的解析索引到表示檔案的inode記憶體物件,並且建立檔案物件file。在檔名解析的過程中,首先需要確定的是檢索起始點,然後通過hash table查詢目錄項以及檢索檔案。在查詢的過程中,需要考慮檔案訪問的許可權以及符號連線等問題。總體來說這些**難度不是很大,但是需要有乙個整體的思路,就可以更好的理解分析**了,這裡只是對名字解析過程中的幾個關鍵函式進行拋磚引玉式的分析。不正之處,敬請指出。

Linux中檔名存在 的處理

linux 中 有特殊的含義,比如在命令的後面加 表示後面跟的是選項。但是如何新建帶名字中有 下面介紹三種方法,比如要新建 檔案 a 1 cd a 2 vi a 3 echo a 上面三種方法都可以在當前目錄下新建乙個 a 檔案 當然還可以有別的方法新建,這裡就不在介紹。如果要刪除 a 就比較麻煩了...

Linux 中文檔名亂碼解決 FTP檔名亂碼

linux下中文顯示亂碼是因為linux中使用的是utf 8編碼 windows使用的是gbk編碼 可以在linux中使用convmv工具來對檔名進行轉碼 當然如果檔名轉碼為utf 8後 在windwos資源管理器中使用ftp進行檢視時就會亂碼 可以把liunx中的檔案轉碼成gbk後在windows...

Linux中檔名的置換

linux 中使用命令行時,有時需要查詢所需要的檔案。shell 提供了一套字串模式匹配規則,或稱之為元字串。可以按照所要求的模式來匹配檔案,還可以使用字元型別來匹配檔名。在此主要介紹幾種常見的特殊字元 1 匹配檔名中的任何字串,包括空字串 2 匹配檔名中的任何單字串 3 匹配 中所包含的任何字串 ...