unlink
, fsync
, 和rename
唯一的定义是原子的吗?
编辑:原子意味着一个操作要么成功并且有效果,要么已经失败并且没有效果;操作不得失败并产生效果。
显然,如果内核崩溃,程序将无法处理操作失败的错误,但在这种情况下它必须考虑它确实失败了
unlink
, fsync
, 和rename
唯一的定义是原子的吗?
编辑:原子意味着一个操作要么成功并且有效果,要么已经失败并且没有效果;操作不得失败并产生效果。
显然,如果内核崩溃,程序将无法处理操作失败的错误,但在这种情况下它必须考虑它确实失败了
这是一篇列出一些原子文件操作的文章:
http://rcrowley.org/2010/01/06/things-unix-can-do-atomically.html
mv
, link
,symlink
和mkdir
一些打开文件的方式是原子的。
我不确定fsync(2)
是原子的;如果一个文件在缓冲区缓存中有 100 兆字节的脏数据,则需要几秒钟才能将这些数据写出,并且内核可能会在传输到磁盘的过程中崩溃。也许板上的 DMA 引擎只能处理 4 兆字节的写入。也许没有 DMA 支持,CPU 必须通过 512 字节块安排每次写入。
“原子”是什么意思?
mkdir
可能是“原子的”,或者目录存在于磁盘上并链接到父目录,或者目录数据结构尚未链接到父目录,因此无法访问 --> 不存在。
同样可能适用mount(2)
:很难找到mount(2)
中途完成的,如果失败,则整个安装失败:文件系统要么已安装,要么没有。
umount(2)
好笑,可以懒惰做,但是一旦卸载,就不能用于open(2)
或creat(2)
调用。
所以,我想它归结为,你所说的“原子”是什么意思?:)