0

我正在编写一个程序,它的功能类似于 Linux 上的磁盘使用实用程序,但在硬链接方面我遇到了麻烦。

我目前正在运行程序,它确定程序是否有硬链接。我在文件上使用 stat() 来确定这一点。

if (st.st_nlink > 1)

当我运行它时,链接和它链接的程序都返回,但是磁盘使用实用程序只会报告程序而不是它的硬链接。

如何使用 C 在 Linux 中区分程序及其硬链接?

4

1 回答 1

2

首先,为什么您处理具有多个硬链接的不同程序数据文件?

然后,重要的不是名称或它们的编号(请注意硬链接会向文件添加另一个名称),而是inode。对于具有多个硬链接的“文件”(即一个 inode),指向同一个 inode 的所有名称都具有相同的权限(没有“主”名称,指向同一个 inode 的所有名称都是等效的)。

因此,在调用stat(2)系统调用后,您希望同时使用st_devst_ino字段。它们一起唯一标识一个文件,即它的 inode。

因此,对于带有 的文件,st.st_nlink>1您可能会将 ( st_dev, st_ino) 对添加到某个哈希表或集合容器中。

在 C++ 中你甚至可以使用一些std::set<std::pair<dev_t,ino_t> >,但在 C 中你必须制作这样一个容器。

注意:一个文件(例如一些 inode)甚至可以有零名(例如,如果在unlink(2)之后调用了一个系统调用open(2)),这就是临时文件的制作方式。

于 2013-04-18T05:38:26.883 回答