我想安全地编写一个文件,我不想理解fsync的正确使用/位置。
https://linux.die.net/man/2/fsync
在读完那篇文章之后,我对如何有效地使用它感到困惑。
问题:我是否:
fs.write('temp/file.txt','utf-8',function(error){
if(error){fs.unlink('temp/file.txt',function(){cb(error,undefined);});}
else{
fs.rename('temp/file.txt','real/file.txt',function(){
fs.fsync('real/file.txt',function(){
cb(undefined,true);
});
});
}
});我正在编写执行许多文件更改的东西。我看过编写原子的模块,但是我想了解这个过程。
发布于 2020-07-25 13:01:39
fsync是其中一个非常少见需要使用它的函数。
所有操作系统都通过缓存、读取和写入来掩盖存储设备速度慢的事实。当您写入一个文件时,它不会立即写到实际的存储介质;它会在缓存中捕获它,告诉您的程序写已经完成,然后将内容写到后台的存储设备中。但是,操作系统将保持所有内容的一致性;如果另一个应用程序从该文件中读取内容,它将看到新的内容,因为操作系统将从缓存中提供内容。
请注意,这不是通用的;我认为Windows禁用了可移动存储设备的缓存,以防止人们拔出驱动器时数据丢失。还有一些标志可以传递给open()来禁用缓存。
对于几乎所有的用例,您都不需要关心这种情况的发生。对你来说,唯一的结果就是你的程序可以更快地继续下去。不过,在有些情况下,这是有问题的:
例如,需要它的例子是数据库。运行更新查询时,数据库通常会更新其内存中的状态,并将突变写入事务日志。但是,对于数据库来说,可靠性是件好事,因此在响应用户之前,它将写入事务日志并对该文件执行fsync操作(或者将事务日志作为未缓冲的形式打开),因此可以在一定程度上保证事务被持久化。
在您的示例中,fsync将确保重命名已经实际发生并已被刷新到磁盘。
https://stackoverflow.com/questions/63088496
复制相似问题