inode - 移动一个已经打开的文件

inode - move a file which is already opened

在linux上,ext4分区上有一部电影,如果我打开电影观看,然后移动或重命名电影。

之前的缓存用完后,需要从原始文件中读取更多的缓存,然后它仍然可以做到。

问题是:

文件系统和 inode 是如何实现的?

对同一文件系统中的文件使用 rename() 只是更改指向 inode 的名称。您甚至可以使用 rename() 将该名称移动到另一个目录 - 只要它在同一文件系统中:

The rename() function shall change the name of a file. The old argument points to the pathname of the file to be renamed. The new argument points to the new pathname of the file. ...

请注意 rename() 的 POSIX 规范比 C 标准 rename() 规范更具体:

7.21.4.2 The rename function

Synopsis

#include <stdio.h>
int rename(const char *old, const char *new);

Description

The rename function causes the file whose name is the string pointed to by old to be henceforth known by the name given by the string pointed to by new . The file named old is no longer accessible by that name. If a file named by the string pointed to by new exists prior to the call to the rename function, the behavior is implementation-defined.

Returns

The rename function returns zero if the operation succeeds, nonzero if it fails, 269) in which case if the file existed previously it is still known by its original name.

(这是 rename() 的完整 C 标准规范。阅读 POSIX link 了解更多信息。)

那么如何在应用程序中观看文件时重命名文件呢?您的 movie-watching 进程的打开文件描述符用于访问您刚刚 rename() 的文件的底层 inode 没有改变。

这与您可以 unlink()(删除)正在使用的文件的原因相同 - 您所做的只是删除 指向 inode - links 之一到 inode。文件使用的 space 直到 inode 的 last link 被删除后才会被释放 - 并且打开的文件描述符算作 link.这也是为什么删除文件的目录条目的函数称为 unlink() 的原因 - 这就是它所做的全部。是的,一个文件(inode)可以有多个 link 指向它。