我正在编写一个程序,它的功能类似于 Linux 上的磁盘使用实用程序,但在硬链接方面我遇到了麻烦。
我目前正在运行程序,它确定程序是否有硬链接。我在文件上使用 stat() 来确定这一点。
if (st.st_nlink > 1)
当我运行它时,链接和它链接的程序都返回,但是磁盘使用实用程序只会报告程序而不是它的硬链接。
如何使用 C 在 Linux 中区分程序及其硬链接?
我正在编写一个程序,它的功能类似于 Linux 上的磁盘使用实用程序,但在硬链接方面我遇到了麻烦。
我目前正在运行程序,它确定程序是否有硬链接。我在文件上使用 stat() 来确定这一点。
if (st.st_nlink > 1)
当我运行它时,链接和它链接的程序都返回,但是磁盘使用实用程序只会报告程序而不是它的硬链接。
如何使用 C 在 Linux 中区分程序及其硬链接?
首先,为什么您处理具有多个硬链接的不同程序和数据文件?
然后,重要的不是名称或它们的编号(请注意硬链接会向文件添加另一个名称),而是inode。对于具有多个硬链接的“文件”(即一个 inode),指向同一个 inode 的所有名称都具有相同的权限(没有“主”名称,指向同一个 inode 的所有名称都是等效的)。
因此,在调用stat(2)系统调用后,您希望同时使用st_dev
和st_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)
),这就是临时文件的制作方式。