linux - 最近创建的随后删除的文件的 block 是否会被写回光盘?

标签 linux file-io filesystems

假设我有一个进程创建一个文件,向其中写入一些数据,然后在经过少量处理(通过自身或另一个进程)后,将其删除并关闭所有剩余的文件描述符。

我在这里假设有足够的 ram 来将页面保存在内存中,直到文件被删除,并且在此期间没有人调用 sync()。

现在删除的文件的 block 是否会被写回磁盘,或者它们会立即从脏列表中删除?

还是取决于文件系统? xfs 和 ext4 等文件系统具有“延迟分配”功能,如果实现的话,可能会支持此功能。

最佳答案

在经典的 Unix 文件系统中,答案是“否”(也就是说,创建和删除文件的数据不一定会进入磁盘),尽管一些目录元数据(修改时间)可能还会改变。因此,发生的情况在一定程度上取决于所使用的文件系统。

请注意,即使调用 sync() 也不能保证它们已被写入;它只安排将数据写回磁盘。因此,在关闭系统之前输入两次 sync 命令的古老禁令 - 这样做给了计算机足够的时间来完成写入,因为它可以比您输入 sync< 更快地写入磁盘 两次(尤其是当您碰巧使用 110 波特率的真实电传打字机时)。


POSIX 标准说(sync() 命令使用的 sync() 函数):

The sync() function shall cause all information in memory that updates file systems to be scheduled for writing out to all file systems.

The writing, although scheduled, is not necessarily complete upon return from sync().

如果 Linux 更改了它的定义以向您保证“所有数据都写入磁盘”,那么这是一个有效且有用的扩展。但这不是典型的行为 - 请注意将 Linux 专业知识转化为其他系统。

还有其他函数,例如 fsync(),可以提供不同的、更严格的 promise :

The fsync() function shall request that all data for the open file descriptor named by fildes is to be transferred to the storage device associated with the file described by fildes. The nature of the transfer is implementation-defined. The fsync() function shall not return until the system has completed that action or until an error is detected.

还有一些文件描述符选项再次给出其他 promise :O_SYNC、O_DSYNC、O_RSYNC。在 POSIX 标准 (open()) 中查找它们。

关于linux - 最近创建的随后删除的文件的 block 是否会被写回光盘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/705628/

相关文章:

c++ - 如何使用 Visual Studio 调试适用于 Raspberry Pi 的 Linux TUI 应用程序

linux - 打开的文件太多 - KairosDB

linux - 删除重复的行

c++ - 我的日志记录模块线程安全吗?

linux - 软件 RAID 有什么特别之处可以带来更好的 IO 性能

linux - Linux 中的 Java7 安装

ruby - 我如何确定文件已写入?

linux - 在 linux 中删除打开的文件时内部会发生什么

Azure 云服务文件系统访问

用于显示用于引导/根分区的文件系统名称的 Linux 命令