繁体   English   中英

您可以安全地读取作为 mv 命令目标的文件吗?

[英]Can you safely read a file which is target of mv command?

我听说 linux 中的 mv 命令是原子的。 但这是否意味着我们可以安全地读取文件? mv命令完成后我们会一直看到内容吗?

我有以下情况。 我有不同的进程负责写入和读取文件。 我有一个定期运行mv a.txt b.txt的进程和另一个定期运行cat b.txt的进程。 我的问题是, cat b.txt总是避免看到部分文件内容? 即它是否总是会在mv命令之前或之后看到 b.txt 的内容(而不是在写入之间)? 我认为许多操作系统使用单独的密钥进行读写,所以我不确定这个过程( mvcat并行)是否安全。

我的另一个问题是 - 如果并行运行mvcat不安全,那么我该怎么做才能确保安全? 我是否需要自己明确使用锁定文件(使用 fcntl 或其他东西)?

同时调用mvcat是安全的, cat总是会看到mv之前或之后的b.txt的内容。

mv 使用rename(2)系统调用

mv 实用程序应执行与 rename() 函数等效的操作 [...]

rename(2)保证原子性:

如果新参数命名的链接存在,则应将其删除并将旧的重命名为新的。 在这种情况下,一个名为 new 的链接在整个重命名操作期间对其他线程保持可见,并且在操作之前引用 new 或 old 引用的文件。

该规范要求函数的操作是原子的。

通过catopen(2)调用的这种保证,它变得原子化:

open() 函数应建立文件和文件描述符之间的连接

也就是说,一旦建立了连接, cat就不会再看到另一个文件了。 POSIX 不保证读取已重命名的文件不会失败,但实际上,包括 Linux 在内的 POSIX 实现不会导致读取失败。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM