Unix获取目录名称。要么

时间:2012-12-06 18:26:43

标签: c unix filesystems

我的任务是使用C中的inode实现Unix命令pwd。我已经弄清楚如何递归返回,直到'..'的inode与'。'的inode相同。我现在遇到的问题是我不知道如何获取目录名称“..”。使用stat结构我可以得到关于文件的所有内容,如size,inode等,但我需要获取文件,以便我可以输出类似的内容:

/home/GONZAGA/tcosentino/documents/OS

如何获取这些目录名称?

我有stat结构,所以到目前为止它可以打印出来:

[tcosentino@ada2 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 个答案:

答案 0 :(得分:0)

查找当前目录名称的简单,半暴力方法意味着您必须找到父目录的名称,然后扫描父目录中列出的名称以找到具有相同目录的名称inode编号和设备编号作为当前目录。你如何找到父目录的名称?好吧,...你递归目录树,当你到达系统的根目录时停止,这是..的inode编号和设备编号与.相同的地方。

请注意,这是一种头脑简单的方法。如果当前目录是NFS挂载并且有许多主目录要自动挂载,那么它可能会产生破坏性的糟糕性能。因此,必须有另一种方法来实现它而不触发自动挂载等,但我还没有调查它是什么。

我的代码具有破坏性的性能,从1987年的1.1版本,从2008年的2.5版本(它在Mac OS X 10.10.1上编译,虽然我认为它失败了,但仔细审查表明它运行正常,但我误解了打印输出;版本2.6将有更清晰的打印,所以我不会再次感到困惑。)