2013-04-18 44 views
0

我正在编写一个类似于Linux上的磁盘使用实用程序的程序,而且我在硬链接方面遇到了麻烦。C中的硬链接和它的程序之间的区别

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

if (st.st_nlink > 1) 

当我运行此,无论是链接,它链接到程序恢复,但磁盘使用工具将只报告程序,而不是它的硬链接。

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

回答

2

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

然后,重要的不是名称或它们的编号(注意硬链接会为文件添加另一个名称),而是inode。对于具有多个硬链接的“文件”(即inode),指向同一个inode的所有名称具有相同的权限(没有“main”名称,指向同一个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中你必须创建这样一个容器。

注意:文件(例如,一些索引节点),甚至可能为零名称(例如,如果一个系统调用unlink(2)open(2)之后被调用),这是临时文件是如何制造的。

+0

嗯......我没有得到使用这个预期的结果。我真正要问的是如何区分硬链接和它所对应的文件。当我运行这个时,我得到st_dev和st_ino都是相同的文件和硬链接为我的测试用例。当这两个文件弹出时,我怎么能说“这个是硬链接”? –

+0

重点是没有一个“主”名和其他“奴隶”的名字!所有的硬名都是“平等的”。 –

+0

所以不可能确定哪个是哪个? –

相关问题