【发布时间】:2018-08-08 10:30:16
【问题描述】:
因此,安全、原子地替换文件内容的正常 POSIX 方法是:
-
fopen(3)同一卷上的临时文件 -
fwrite(3)临时文件的新内容 -
fflush(3)/fsync(2)确保内容写入磁盘 -
fclose(3)临时文件 -
rename(2)替换目标文件的临时文件
但是,在我的 Linux 系统(Ubuntu 16.04 LTS)上,这个过程的一个后果是目标文件的所有权和权限更改为临时文件的所有权和权限,默认为uid/@987654329 @ 和当前umask。
我想在覆盖之前将代码添加到目标文件stat(2),并在调用rename之前将代码添加到临时文件fchmod(2),但由于EPERM,这可能会失败。
是唯一能保证文件的uid/gid匹配覆盖文件的进程的当前用户和组吗?在这种情况下是否有安全的回退方式,还是我们必然会失去原子保证?
【问题讨论】:
-
这个答案unix.stackexchange.com/a/368641/92787 谈到了这个问题。看起来没有解决方案。您必须选择原子性或保留所有者和权限。
-
Linux 上的 ZFS 是否支持
rstchown选项?如果支持,那将是一个解决方案。 -
没有人会感谢您为此付出的努力。使用文件系统作为临时同步机制从来都不是一个好主意,在现代系统中是一个非常糟糕的主意。尽可能地,您希望您的代码在所有可能的环境中工作;依赖单一系统图像语义不利于这一点。
-
@mevets:你说得对,事实上我正在努力从文件系统中迁移出这种机制。但是,在替换系统到位之前,我想尽最大努力避免现有进程损坏文件,这些进程已经在不安全地操纵此文件中的共享状态,这就是最初提出这个问题的原因。
标签: c posix chmod file-rename chown