首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >节点fs.fsync (何时使用?)

节点fs.fsync (何时使用?)
EN

Stack Overflow用户
提问于 2020-07-25 12:48:30
回答 1查看 365关注 0票数 1

我想安全地编写一个文件,我不想理解fsync的正确使用/位置。

https://linux.die.net/man/2/fsync

在读完那篇文章之后,我对如何有效地使用它感到困惑。

问题:我是否:

代码语言:javascript
复制
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);
                });
            });
        }
    });

我正在编写执行许多文件更改的东西。我看过编写原子的模块,但是我想了解这个过程。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-25 13:01:39

fsync是其中一个非常少见需要使用它的函数。

所有操作系统都通过缓存、读取和写入来掩盖存储设备速度慢的事实。当您写入一个文件时,它不会立即写到实际的存储介质;它会在缓存中捕获它,告诉您的程序写已经完成,然后将内容写到后台的存储设备中。但是,操作系统将保持所有内容的一致性;如果另一个应用程序从该文件中读取内容,它将看到新的内容,因为操作系统将从缓存中提供内容。

请注意,这不是通用的;我认为Windows禁用了可移动存储设备的缓存,以防止人们拔出驱动器时数据丢失。还有一些标志可以传递给open()来禁用缓存。

对于几乎所有的用例,您都不需要关心这种情况的发生。对你来说,唯一的结果就是你的程序可以更快地继续下去。不过,在有些情况下,这是有问题的:

  • 如果失去了电源,缓存的内容就会丢失,因此磁盘不会有文件的所有新内容。如果删除驱动器,则写入的
  • 也同样会丢失。对于可移动存储设备来说,这是非常典型的,我确信90%的人忽略了“安全删除”提示符;)。
  • --我认为直接从设备直接读取(即Linux中的/dev/sdX )将绕过这个缓存,但我不能100%肯定。

例如,需要它的例子是数据库。运行更新查询时,数据库通常会更新其内存中的状态,并将突变写入事务日志。但是,对于数据库来说,可靠性是件好事,因此在响应用户之前,它将写入事务日志并对该文件执行fsync操作(或者将事务日志作为未缓冲的形式打开),因此可以在一定程度上保证事务被持久化。

在您的示例中,fsync将确保重命名已经实际发生并已被刷新到磁盘。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63088496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档