最近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 顯示 版本 資訊,然後 ...