说到 Linux 下用 C++ 获取文件 inode,很多人第一反应就是 stat() 系统调用。但这里有个关键点:st_ino 本身并不可靠,必须和 st_dev 组合起来,才能形成一个跨文件系统的唯一标识对。否则,去重逻辑很容易翻车。

怎么用 C++ 调用 stat() 正确读取 inode 号

Linux 没有所谓的“C++ 原生 inode API”,一切还得靠 POSIX 系统调用。核心就是把 struct stat 填满,其中 st_ino 就是你要的值——但前提是调用成功,路径有效。

举个最简单的例子:

struct stat sb;
std::string path = "/tmp/test.txt";
if (stat(path.c_str(), &sb) == 0) {
    std::cout << "inode: " << sb.st_ino << ", dev: " << sb.st_dev << "\n";
} else {
    perror(("stat " + path).c_str()); // 自动打印 errno 对应的错误信息
}

为什么不能只比 st_ino?必须组合 st_dev 才能去重

st_ino 在单个挂载点内是唯一的,但不同设备(比如根目录 //home 可能是不同磁盘或 LVM 逻辑卷)上完全可能重复。举个例子:两个文件 st_ino == 12345,一个在 SSD 上,一个在 NFS 挂载点上,它们之间没有任何关系。

硬链接去重 vs 内容去重:两种场景对应不同逻辑

(st_dev, st_ino) 只能识别硬链接(同一份数据的多个入口)。如果文件名不同、路径不同,但内容一样(非硬链接),这个组合完全无效——它们的 st_ino 必然不同。

容易被忽略的路径与符号链接陷阱

相对路径、符号链接、当前工作目录(cwd)三者一搅和,stat() 的结果就可能出乎意料。

最麻烦的其实是 NFS + 符号链接 + 相对路径组合——这时候 st_inost_dev 都可能失真,硬编码去重逻辑大概率失效。

c++怎么在Linux下获取文件系统Inode号并实现文件去重逻辑【底层】

本文转载于:https://www.php.cn/faq/2333169.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。