我正在玩我自己的pwd
命令。为了找到整个路径,我需要遍历inode
树,直到我到达根目录,告诉我已经命中根的方法是检查存储的相等inode
个数字。 .
和..
。
但是在我的Mac上似乎并非如此,至少如果你看下面这个表。
dirent | stat | link to
-----------+------------+--------
34078072 | 34078072 | self
31103058 | 31103058 | parent
31103058 | 31103058 | self
31103020 | 31103020 | parent
31103020 | 31103020 | self
613497 | 613497 | parent
613497 | 613497 | self
603204 | 603204 | parent
603204 | 603204 | self
157433 | 157433 | parent
157433 | 157433 | self
2 | 2 | parent
2 | 2 | self // This is root aka /
1 | 2 | parent // There is something above it?
这是使用以下代码生成的。 stat
结构似乎运行良好,但dirent
在/
时具有不同的值。为什么会这样?不应该{1}}和dirent
具有相同的inode编号值吗?为什么Mac上会有所不同?
stat
答案 0 :(得分:4)
在Macintosh HFS +文件系统上,每个文件和文件夹都有一个唯一的 “文件ID”。这个文件系统在Apple中描述 "Technical Note TN1150 – HFS Plus Volume Format"
特别是,根文件夹始终具有文件ID 2和父文件 ID 1.在TN1150中,这些记录为
enum {
kHFSRootParentID = 1,
kHFSRootFolderID = 2,
...
}
kHFSRootParentID
Parent ID of the root folder.
kHFSRootFolderID
Folder ID of the root folder.
HFS +文件系统上的inode完全反映
文件ID。这可以解释为什么readdir()
报告inode
{“1}}代表”。“输入根文件夹,输入inode 2
根文件夹的“..”条目。 (但我没有明确的参考这个事实。可以尝试找到源代码
http://www.opensource.apple.com:)
另一方面,根文件夹中的“..”始终是指向的链接 根文件夹本身。因此,何时
1
对“..”条目执行,根文件夹上的stat(entry->d_name, &status);
完成,
所以这又给了inode stat()
。