![](/img/trans.png)
[英]Can a sudo user read the command file for which sudo access is enabled?
[英]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 的内容(而不是在写入之间)? 我认为许多操作系统使用单独的密钥进行读写,所以我不确定这个过程( mv
与cat
并行)是否安全。
我的另一个问题是 - 如果并行运行mv
和cat
不安全,那么我该怎么做才能确保安全? 我是否需要自己明确使用锁定文件(使用 fcntl 或其他东西)?
同时调用mv
和cat
是安全的, cat
总是会看到mv
之前或之后的b.txt
的内容。
mv
使用rename(2)
系统调用:
mv 实用程序应执行与 rename() 函数等效的操作 [...]
rename(2)
保证原子性:
如果新参数命名的链接存在,则应将其删除并将旧的重命名为新的。 在这种情况下,一个名为 new 的链接在整个重命名操作期间对其他线程保持可见,并且在操作之前引用 new 或 old 引用的文件。
该规范要求函数的操作是原子的。
通过cat
的open(2)
调用的这种保证,它变得原子化:
open() 函数应建立文件和文件描述符之间的连接
也就是说,一旦建立了连接, cat
就不会再看到另一个文件了。 POSIX 不保证读取已重命名的文件不会失败,但实际上,包括 Linux 在内的 POSIX 实现不会导致读取失败。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.