如何检查mv
我的fs(ext4)上是否为原子原子?
操作系统是Red Hat Enterprise Linux Server 6.8版。
一般来说,我该如何检查?我环顾四周,没有找到我的操作系统是否是标准POSIX。
如何检查mv
我的fs(ext4)上是否为原子原子?
操作系统是Red Hat Enterprise Linux Server 6.8版。
一般来说,我该如何检查?我环顾四周,没有找到我的操作系统是否是标准POSIX。
Answers:
有趣的是,似乎答案可能是“取决于”。
要明确,mv
指定为
该
mv
实用程序将执行相当于行动rename()
功能
在重命名功能规范状态:
rename()
对于常规文件,此功能等效于ISO C标准定义的文件。它的包含将扩展该定义,以包括对目录的操作,并在新参数命名已存在的文件时指定行为。该规范要求函数的动作是原子的。
但最新的ISO C规格的rename()
状态:
7.21.4.2
rename
功能概要
#include <stdio.h> int rename(const char *old, const char *new);
描述
此
rename
函数使名称为指向的字符串的文件old
从此被称为指向的字符串给出的名称new
。该名称old
不再可以访问该文件。如果new
在调用该rename
函数之前存在一个由指向的字符串命名的文件,则该行为是实现定义的。退货
rename
如果操作成功,该函数将返回零;如果失败,则该函数将返回非零;在这种情况下,如果文件先前存在,则仍以其原始名称知道该文件。
令人惊讶地,请注意,原子性没有明确的要求。最新的公共C标准可能在其他地方要求它,但是我找不到它。如果有人可以找到这样的要求,那么欢迎您进行编辑和评论。
另请参见rename()是原子的吗?
根据Linux手册页:
如果
newpath
已经存在,它将被原子替换,这样就不会再有其他尝试访问的进程newpath
发现它丢失了。但是,可能会有一个窗口,其中oldpath
和都newpath
指向要重命名的文件。
Linux手册页声称该文件的替换将是原子的。
但是,如果这需要走多远,那么测试和验证原子性可能会非常困难。您不清楚“如何检查mv是否为原子”的含义。您是否需要原子性的要求/规范/文档,还是需要进行实际测试?
另请注意,以上假设两个操作数文件名位于同一文件系统中。我发现该mv
实用程序没有标准限制可以执行该操作。
rename
原子性一无所知是很奇怪的。
/
一个ext4 fs和/tmp
一个不同的ext4 fs,则您不能从一个原子原子到另一个原子原子mv。
除了检查系统调用及其原子性之外,也许inotify-tools
可以作为测试,尽管我不确定这是否可以保证原子性。
打开2个炮弹。观看其中之一的移动目标目录:
inotifywait -m target/
将文件移到另一个目录中:
mv foobar target/
本inotifywait
应只显示一行:
target/ MOVED_TO foobar
它相比于响应于似乎原子ls target/
和touch target/a
,从而产生像多行消息:
# the response to ls target/
target/ OPEN,ISDIR
target/ ACCESS,ISDIR
target/ CLOSE_NOWRITE,CLOSE,ISDIR
聚苯乙烯
我认为,至少它表明文件的异步多进程合作是安全的inotify
(实际上是原子的):无论如何,只有在inotify
操作后给出最终信号后,您才响应。例如,可以使用轻松,安全地实施生产者-消费者设置inotify
。
strace
吗?