前言
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 匹配 中所包含的任何字串 ...