inode - 移动已打开的文件

时间:2016-01-20 15:44:57

标签: linux filesystems inode

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

在上一次缓存用完后,需要从原始文件中读取更多缓存,然后仍然可以这样做。

问题是:

文件系统& inode实现了这个目标吗?

1 个答案:

答案 0 :(得分:2)

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

  

rename()函数应更改文件名。老人   参数指向要重命名的文件的路径名。新的   参数指向文件的新路径名。 ...

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

  

7.21.4.2 rename功能

     

<强>概要

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

<强>描述

     

重命名功能会导致名称为字符串指向的文件   由old到今后通过字符串给出的名称来知道   由new指出。名为old的文件不再可供访问   那个名字。如果由new指向的字符串命名的文件存在   在调用rename函数之前,行为是   实现定义的。

     

<强>返回

     

在   rename   如果操作成功,则函数返回零,如果失败则返回非零值,   269)   在   如果该文件先前存在,则该文件的原始名称仍为其所知。

(这是rename()的整个C标准规范。请阅读POSIX link以获取更多信息。)

那么如何在应用程序中观看文件时重命名文件?您的电影观看过程的打开文件描述符用于访问您rename()并未发生变化的文件的基础inode。

这就是为什么你可以在文件正在使用时unlink()(删除)文件的原因相同 - 你所做的就是删除指向的文件 inode - 链接之一到inode。在删除与inode的 last 链接之前,文件使用的空间不会被释放 - 并且打开的文件描述符将被视为链接。这也是为什么删除文件的目录条目的函数被称为unlink() - 这就是它的全部功能。是的,文件(inode)可以有多个指向它的链接。