我刚刚试用了这个程序,我使用 dup 复制打开文件的文件描述符。
我已经对同一个文件进行了硬链接,并打开了同一个文件以读取程序中文件的内容。
我的问题是有什么区别?
我知道 dup 为我提供了对文件的运行时抽象,并且硬链接更多地指的是 filsystem 实现,但我不明白需要使用一个而不是另一个。
使用一个比另一个有什么优势?
如果我们想引用相同的文件位置而不是创建文件描述符,为什么不能显式引用硬链接,反之亦然?
我正在使用 Linux 和标准 C 库。
硬链接在i-nodes上dup
工作,在打开的文件描述符上工作。这些是不同的动物。
一个文件主要是一个inode,目录条目指向那个inode(所以一些文件可以通过硬链接有多个名称,其他文件可以根本没有名称:一个临时文件仍然打开但未链接有一个i-node引用通过打开的文件描述符,但不再有任何名称)。I 节点在文件的持续时间内存在并被写入磁盘。
文件描述符仅存在于进程中(仅在内核内存中,不在磁盘上),因此无法写入磁盘(您只能写入其编号,这通常没有任何意义)。文件描述符(在内核内部)知道它的 inode,但也知道更多状态,特别是当前偏移量。
你可以有两个文件描述符在同一个文件上工作(同一个inode,可能是通过open
两个不同的硬链接或符号链接路径)但具有不同的状态(例如不同的文件位置或偏移量)。
如果使用dup(2)系统调用,两个文件描述符共享相同的状态(就在 dup 之后),特别是共享相同的文件偏移或位置。
如果使用link(2)系统调用,则两个目录条目指向同一个 inode。它们需要在同一个文件系统上。
并且symlink(2)系统调用创建了一个新的 inode(和一个新文件),它引用了符号名称。阅读有关path_resolution(7)和symlink(7)的其他手册页。
硬链接只是在两个不同目录中拥有相同文件的一种方式。这对于节省一些磁盘空间很有用。
Usingfdup
让你的程序中有两个不同的文件描述符指向同一个文件。如果您想复制某种包装文件描述符的逻辑对象,这很有用。
主要区别在于硬链接是持久的,而重复的文件描述符只持续与进程一样长。加上已经给出的原因。