gpt4 book ai didi

c - 为什么 `.` 和 `..` 在 Mac 上的 `/` 内部有不同的 inode 编号?

转载 作者:太空狗 更新时间:2023-10-29 15:03:42 26 4
gpt4 key购买 nike

我正在尝试实现我自己的 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 在涉及 / 时具有不同的值。为什么会这样? direntstat 不应该具有相同的 inode 编号值吗?为什么它在 Mac 上有所不同?

#include <stdio.h>
#include <dirent.h>
#include <sys/stat.h>
#include <string.h>
#include <unistd.h>

void inodes();

int main()
{
printf(" dirent | stat | link to\n");
printf("-----------+------------+--------\n");
inodes();
return 0;
}

void inodes()
{
DIR* directory = opendir(".");
struct dirent* entry = NULL;
struct stat status;
ino_t self = -1;
ino_t parent = -1;

while ((entry = readdir(directory))) {
stat(entry->d_name, &status);
if (strcmp(entry->d_name, ".") == 0) {
self = status.st_ino;
printf("%10.llu | %10.llu | self\n", entry->d_ino, self);
}
if (strcmp(entry->d_name, "..") == 0) {
parent = status.st_ino;
printf("%10.llu | %10.llu | parent\n", entry->d_ino, parent);
}
}
if (self != parent) {
if (chdir("..") != -1) {
inodes();
}
}
}

最佳答案

在 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 准确反射(reflect)文件 ID。这或许可以解释为什么 readdir() 报告 inode2 代表“.”根文件夹的条目,inode 1 为根文件夹的“..”条目。 (但我对这一事实没有明确的引用。可以尝试在以下位置找到源代码 http://www.opensource.apple.com :)

另一方面,根文件夹中的“..”始终是指向根文件夹本身。因此,当

stat(entry->d_name, &status);

为“..”条目执行,根文件夹上的 stat() 已完成,所以这再次给出 inode 2

关于c - 为什么 `.` 和 `..` 在 Mac 上的 `/` 内部有不同的 inode 编号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33488420/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com