使用dup()创build重复文件描述符和创build硬链接之间的区别?

我只是尝试了这个程序,我用dup来复制一个打开文件的文件parsing器。

我已经做了一个硬链接到这个相同的文件,我打开相同的文件来读取程序中的文件的内容。

我的问题是什么区别?

我知道dup给了我一个运行时抽象的文件,硬链接更多地指的是文件系统的实现,但我不明白需要使用哪一个。

使用其中一个的优点是什么?

如果我们想引用相同的文件位置而不是创build文件描述符,为什么不能明确地引用硬链接呢?反之亦然。

我正在使用Linux和标准C库。

硬链接在i节点上工作, dup在打开的文件描述符上工作 。 这些是不同的动物。

一个文件主要是一个inode,目录条目指向该inode(所以某些文件可以有多个名称通过硬链接,其他文件可以根本没有名字:临时文件仍然打开,但未链接有一个i节点被引用由一个打开的文件描述符,但没有更多的任何名称)。 I-节点在文件的存在期间存在并被写入磁盘。

文件描述符只存在于进程中(仅在内核内存中,不在磁盘上),因此不能写入磁盘(只能写入其编号,通常没有任何意义)。 一个文件描述符知道(在内核内)其inode,但也有一些更多的状态,特别是当前的偏移量。

你可能有两个文件描述符在相同的文件上工作(相同的inode,也许是通过open两个不同的硬链接或符号链接的路径),但具有不同的状态(例如不同的文件位置或偏移量)。

如果使用dup(2)系统调用,则两个文件描述符共享相同的状态(在dup之后),特别是共享相同的文件偏移量或位置。

如果使用链接(2)系统调用,则两个目录条目指向相同的inode。 他们需要在同一个文件系统上。

而一个符号链接(2)系统调用创建一个新的inode(和一个新的文件)引用的符号名称。 阅读有关path_resolution(7)和符号链接(7)的其他手册页。

硬链接只是在两个不同的目录中拥有相同文件的一种方式。 这对保存一些磁盘空间很有用。

使用fdup可以让程序中有两个不同的文件描述符指向同一个文件。 如果你想复制某种包装文件描述符的逻辑对象,这很有用。

主要区别在于硬链接是持久的,重复的文件描述符只会持续到进程的时间。 再加上已经给出的原因。