pwd 命令實現

2021-06-27 23:29:03 字數 1783 閱讀 8383

最近linux課要考試了,在複習檔案系統。順便就嘗試實現一下pwd命令

這個命令的功能很簡單,就是顯示當前目錄的絕對路徑

key point:

由於在linux/unix檔案系統中,每個檔案對應的inode值都是唯一的。這個就是我們要尋找的突破點。

演算法核心:

1. 拿到當前目錄中"."這個目錄的st_ino值,記為inode。

2. 轉到父目錄中,遍歷父目錄,找到第乙個st_ino值與inode相同的那個目錄,並儲存名字。

3. 再拿當前目錄中"."目錄的st_ino值作為inode,向前遞迴(此時的"."目錄已經不是1中的"."了,而是1中的"..")

4. 輸出 「/" + 2中儲存的名字

由於3與4之間的次序關係,保證了輸出的字串中,子目錄總是在父目錄後面的。

遞迴出口:

由於在根目錄下,"." 和 ".." 的inode值是一樣的,所以當遞迴到某一層,若父目錄的inode值與當前的inode值(作為遞迴函式的引數傳入) 相同,那麼就可以結束遞迴了。

注意:

需要注意的就是,步驟2 要把遍歷父目錄的那個函式的當前路徑跳轉到父目錄中去,chdir("..")。如果不這樣子做的話,你匹配到的那個字串始終是 ".",且你的目標的st_ino和inode不一樣 !!!  結果,程式的輸出就變成這樣了:/./././. ....  讀者可以自行嘗試。下面是我在/users/user下的乙個測試程式的輸出:

程式分別輸出:

1. 當前目錄下,"."的st_ino值

2. 父目錄下所有檔案的st_ino值,(其中"user" 是正確的目標目錄名)

(如果"."和"user"的inode值相同,那麼才算正確)

1. 沒有加chdir,僅以opendir("..")代替,出錯!!!

2. 加上chdir(".."),轉換到父目錄後,應該 opendir(".") 而不是 opendir("..")了,正確!!!

看,當前目錄中,"."的inode值是603090,父目錄中,"user"的inode值也是603090

源**:

#include #include #include #include #include int flag = 0;

unsigned long get_inode(char *name)

return e.st_ino;

}void pwd(unsigned long inode)

while ( (dp = readdir(dir)) != null)

if (e.st_ino == inode)

} closedir(dir);

}int main(int args , char * argv)

pwd命令的簡單實現

1.linux檔案系統的結構 1 檔案系統的三個區域 不會插入,囧 超級塊,i 節點表,資料區 2 各個區域的作用 a 超級塊 存放檔案系統本身的結構資訊,例如每個區域的大小 b i 節點表 用於存放檔案的的屬性,如大小,檔案所有者和最近修改 時間檔案系統中的每個檔案在該表中都有乙個i節點。c 資料...

Linux 實現自己的pwd命令

檔名 mypwd.c 描述 實現簡單的pwd命令 include include include include include include include 根據檔名獲取檔案inode number ino t get ino byname char filename return file s...

Linux命令之pwd命令

一步一步學linux pwd命令 顯示出 完整的 當前 活動目錄 名稱.l 列印 pwd 變數的值,如果它命名了當前的工作目錄 p 列印當前的物理路徑,不帶有任何的符號鏈結 預設情況下,pwd 的行為和帶 l 選項一致 help 顯示 幫助 資訊,然後 退出 version 顯示 版本 資訊,然後 ...