【发布时间】:2016-04-26 13:21:49
【问题描述】:
在 linux 上,在 ext4 分区上有电影,如果我打开电影并观看它,然后我会移动或重命名电影。
之前的缓存用完后,需要从原文件中读取更多的缓存,还是可以的。
问题是:
文件系统和inode是如何实现的?
【问题讨论】:
标签: linux filesystems inode
在 linux 上,在 ext4 分区上有电影,如果我打开电影并观看它,然后我会移动或重命名电影。
之前的缓存用完后,需要从原文件中读取更多的缓存,还是可以的。
问题是:
文件系统和inode是如何实现的?
【问题讨论】:
标签: linux filesystems inode
在同一文件系统中的文件上使用rename() 只会更改指向inode 的名称。您甚至可以使用 rename() 将该名称移动到另一个目录中 - 只要它位于同一文件系统中:
rename() 函数将更改文件的名称。老人 参数指向要重命名的文件的路径名。新的 参数指向文件的新路径名。 ...
请注意,rename() 的 POSIX 规范比 C 标准 rename() 规范更具体:
7.21.4.2
rename函数概要
#include <stdio.h> int rename(const char *old, const char *new);说明
重命名函数导致文件名是指向的字符串 to by
old从此以字符串给出的名称为人所知 由new指向。名为old的文件不再可通过以下方式访问 那个名字。如果存在new指向的字符串命名的文件 在调用rename函数之前,行为是 实现定义。退货
rename如果操作成功,函数返回零,如果失败则返回非零, 269) 在 在这种情况下,如果该文件以前存在,则仍以其原始名称为人所知。
(这是 rename() 的完整 C 标准规范。请阅读 POSIX link 了解更多信息。)
那么,如何在应用程序中观看文件时重命名文件?您的电影观看进程的打开文件描述符用于访问您刚刚rename()'d 的文件的底层 inode 不会更改。
这与您可以unlink()(删除)正在使用的文件的原因相同 - 您所做的只是删除 指向 inode 的条目 - 链接到inode。在删除指向 inode 的 last 链接之前,文件使用的空间不会被释放 - 并且打开的文件描述符算作链接。这也是为什么删除文件目录条目的函数被称为unlink() - 这就是它的全部作用。是的,一个文件(inode)可以有多个指向它的链接。
【讨论】: