2012-12-06 60 views
1

我的任務是使用C中的inode實現Unix命令pwd。我已經想出瞭如何遞歸回去,直到'..'的inode與'。'的inode相同。我現在遇到的問題是我不知道如何獲取'..'的目錄名稱。使用stat結構,我可以得到約如大小,索引節點等文件的一切,但我需要的文件,所以我可以使它輸出類似:Unix獲取目錄使用的名稱。或

/home/GONZAGA/tcosentino/documents/OS 

我怎樣才能得到這些目錄名?

我有統計結構,因此它可以打印出這個至今:

[[email protected] OS]$ ./a.out . 
filename: . 
device: 64768 
inode: 55804237 
protection: 40755 
number of hard links: 5 
user ID of owner: 81963576 
group ID of owner: 501 
device type (if inode device): 0 
total size, in bytes: 4096 
blocksize for filesystem I/O: 4096 
number of blocks allocated: 8 
time of last access: 1354817261 : Thu Dec 6 10:07:41 2012 
time of last modification: 1354817249 : Thu Dec 6 10:07:29 2012 
time of last change: 1354817249 : Thu Dec 6 10:07:29 2012 
+1

您允許使用[opendir](http://linux.die.net/man/3/opendir)和[readdir](http://linux.die.net/man/3/readdir)嗎?從[相關問題](http://stackoverflow.com/q/1659071/509868) – anatolyg

回答

0

笨笨,半蠻力的方法來尋找當前目錄的名字的意思是,你必須找到名稱,然後掃描父目錄中列出的名稱以找到具有與當前目錄相同的inode號和設備號的名稱。你如何找到父目錄的名字?那麼......你遞增目錄樹,在到達系統的根目錄時停止,這是..的inode編號和設備編號與.相同的地方。

請注意,這是一種簡單的方法。如果當前目錄是NFS掛載的,並且有很多主目錄需要自動掛載,那麼它的性能可能會非常糟糕。因此,必須有另一種方式來做到這一點,而不觸發自動支付等,但我沒有調查是什麼。

我確實有破壞性的代碼,從1987年的版本1.1,2.5版本到2008年(它在Mac OS X 10.10.1上編譯,雖然我認爲它失敗了,但仔細審查表明它運行正確,但我錯誤地解釋了打印的輸出;版本2.6將有更清晰的打印,所以我不會再困惑)。