rename() 是原子的么
对一个文件做修改, 通常认为 直接 open-seek-write-write-close 不是原子的.
1. write 本身 不一定是原子的:
https://blogs.msdn.microsoft.com/adioltean/2005/12/28/how-to-do-atomic-writes-in-a-file/
2. 多次write, 在中间fail(app/os crash), 则修改肯定不是原子的.
一般通过 拷贝tmp文件 - 直接rename tmp到原文件来实现.
rename通过来说, 直接修改 file system metadata, 如inode信息. 在posix里, rename一定是原子的, 即:
* rename成功, 原文件名 指向 temp 文件; 原文件内容被删除.
* rename失败, 原文件名 仍指向原来的文件内容.
http://pubs.opengroup.org/onlinepubs/009695399/functions/rename.html
That specification requires that the action of the function be atomic.
那么, windows系统呢? 对应的函数应该是 MoveFileEx.
https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/449bb49d-8acc-48dc-a46f-0760ceddbfc3/movefileexmovefilereplaceexisting-ntfs-same-volume-atomic?forum=windowssdk
Q: This question arises often when atomic modifications to files are required, but my searching the internet didn't yield any conclusive results. Some people claim that MoveFileEx can *never* provide atomic behaviour, no matter what circumstances, but usually without any references/proof. Other people claim it can, but again without references/proof.
A: I would guess that all major filesystems (including NTFS and FAT) implement rename-within-the-same-directory as a single metadata operation. Metadata operations are always atomic (they either happen, do not happen, or corrupt the filesystem).
rename() 是原子的么的更多相关文章
- redis 持久化与备份策略 【转载】
本文转载自 http://blog.csdn.net/is_zhoufeng/article/details/10210353 持久化(persistence) 本文是 Redis 持久化文档 的中文 ...
- Redis学习-持久化
Redis 提供了多种不同级别的持久化方式: RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot). AOF 持久化记录服务器执行的所有写操作命令 ...
- Redis之持久化(RDB AOF)
Redis 提供了 RDB 和 AOF 两种持久化方案: RDB:生成指定时间间隔内的 Redis 内存中数据快照,是一个二进制文件 dumpr.rdb AOF:记录 Redis 除了查询以外的所有写 ...
- Redis持久化persistence
一.前言 由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据. R ...
- 解密Redis的持久化和主从复制机制
Redis持久化 Redis 提供了多种不同级别的持久化方式: RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot). AOF 持久化记录服务器执 ...
- Redis持久化(persistence)
Redis 持久化 Redis 提供了多种不同级别的持久化方式: RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot). AOF 持久化记录服务器 ...
- redis 持久化与备份策略
持久化(persistence) 本文是 Redis 持久化文档 的中文翻译. 这篇文章提供了 Redis 持久化的技术性描述,推荐所有 Redis 用户阅读. 要更广泛地了解 Redis 持久化,以 ...
- redis学习笔记——RDB和AOF持久化一
为防止数据丢失,需要将 Redis 中的数据从内存中 dump 到磁盘,这就是持久化.Redis 提供两种持久化方式:RDB 和 AOF.Redis 允许两者结合,也允许两者同时关闭. RDB 可以定 ...
- [动图演示]Redis 持久化 RDB/AOF 详解与实践
Redis 是一个开源( BSD 许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件.它支持的数据类型很丰富,如字符串.链表.集 合.以及散列等,并且还支持多种排序功能. 什么叫持 ...
随机推荐
- jquery 点击事件
bind() 向匹配元素附加一个或更多事件处理器 blur() 触发.或将函数绑定到指定元素的 blur 事件 change() 触发.或将函数绑定到指定元素的 change 事件 click() 触 ...
- eclipse报错 :java was started but returned exit code=13
一个礼拜没打开自己电脑上的eclipse,一打开居然报错,错误提示如下: cdm运行一下Java -version和javac 运行javac时报错,错误提示如下: 然后发现jdk的bin下没有dt. ...
- phpexcel简单用法
<?php /*php生成excel完整实例代码现求:php生成excel完整实例代码最好能说明如何调用!谢谢java_sunhui4 | 浏览 8131 次 2014-09-24 14:502 ...
- sqlserver同步后在不重新初始化快照的情况下新增表
在已有事务复制中,时长需要新增表.索引,这些变更时不会同步到从库中.如果采用默认的设置,每次都需要重新初始化快照,从库重新应用快照和未执行的同步命令,这显然是无法在线上实践的方法.另一种 ...
- Java获取系统时间
Java可以通过SimpleDateFormat格式化类对Date进行格式话获取时间. import java.util.*; import java.text.*; public class Tes ...
- 自定义控件EditText
public class defineEditText extends EditText { Context context; Drawable d; public defineEditText(Co ...
- VC++ 控制外部程序,向外部程序发送一个消息的方法
这里需要考虑两部分的内容: 发送端: 查找对应的窗体,找到CWnd的值 向窗体发送消息 举例: CWnd* wnd = FindWindow(NULL, _T("选择题做题过程中" ...
- Allegro16.3约束设置 (转载)
原文地址:http://blog.chinaunix.net/uid-21198646-id-3212383.html 差分对的约束设置 第一步,差分对的设置 差分对的设置有很多方法,下面介绍两种最常 ...
- Lambda表达式的语法格式
Lambda表达式的语法格式: 参数列表 => 语句或语句块 “Lambda表达式”是委托的实现方法,所以必须遵循以下规则: 1)“Lambda表达式”的参数数量必须和“委托”的参数数量相同: ...
- C语言-------多文件编译
(1)前段时间,学长讲解宏的一些知识 也提起了那个多文件编译,同过看别人的博客,自己也懂了一些,现在来总结一下这个多文件编译,其实和java里面的那个class的调用好像有联系 其定义即可以理解成: ...