为什么`.`和`..`在Mac上的`/`中有不同的inode号?

时间:2015-11-02 22:45:34

标签: c macos filesystems

我正在玩我自己的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

1 个答案:

答案 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()