【问题标题】:Difference between creating a duplicate file descriptor using dup() and creating a hard link?使用 dup() 创建重复文件描述符和创建硬链接之间的区别?
【发布时间】:2012-09-09 06:52:55
【问题描述】:

我刚刚试用了这个程序,我使用 dup 来复制打开文件的文件描述符。

我创建了一个指向同一个文件的硬链接,并打开同一个文件以在程序中读取文件的内容。

我的问题是有什么区别?

我知道 dup 为我提供了对文件的运行时抽象,并且硬链接更多地指的是 filsystem 实现,但我不明白需要使用一个而不是另一个。

使用一个比另一个有什么优势?

如果我们想引用相同的文件位置而不是创建文件描述符,为什么不能显式引用硬链接,反之亦然?

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

【问题讨论】:

    标签: c linux hardlink dup


    【解决方案1】:

    硬链接适用于i-nodesdup 适用于打开的file descriptors。这些是不同的动物。

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

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

    您可以有两个文件描述符在同一个文件上工作(同一个 inode,可能是 open-ing 两个不同的硬链接或符号链接路径)但具有不同的状态(例如不同的文件位置或偏移量)。

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

    如果使用link(2) 系统调用,两个目录条目指向同一个inode。它们需要在同一个文件系统上。

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

    【讨论】:

    • 这意味着被某个进程打开并取消链接的文件在删除所有指向它的链接后仍然可以访问。
    • 是的,临时文件就是这样处理的。但是您只能通过以前打开的文件描述符访问该文件。只有当最后一个打开它的进程终止时,该文件才会从磁盘上删除。
    • 使用 dup 访问同一个文件的内容比在程序中打开同一个文件的硬链接有什么优势吗?毕竟两者都是系统调用。
    【解决方案2】:

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

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

    【讨论】:

    • 它对节省磁盘空间有什么帮助?它们指向同一个inode。尺寸信息在元数据中而不是在硬链接中。
    • 这是对拥有两个相同文件的优化。
    • 还要注意文件描述符有额外的状态。如果你打开一个文件,读取一个字节,然后复制描述符,两个描述符将在下一次读取时返回文件的第二个字节。
    【解决方案3】:

    主要区别在于硬链接是持久的,而重复的文件描述符只持续与进程一样长。加上已经给出的原因。

    【讨论】:

    • 好的,我想我现在明白了。有什么理由比两次打开同一个文件更喜欢 dup 吗?内核显然会分配两个不同的文件描述符,它们将指向同一个文件。使用 dup 时 open not present 是否存在任何延迟或延迟问题?
    • 我不明白你为什么想要一个硬链接。硬链接用于解决文件系统命名空间中的共享问题。我不认为那是你所追求的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    • 2012-02-16
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    相关资源
    最近更新 更多