因此,正常的POSIX方式安全地,原子地替换文件的内容是:
fopen(3)
同一卷上的临时文件
fwrite(3)
临时文件的新内容
fflush(3)
/ fsync(2)
确保将内容写入磁盘
fclose(3)
临时文件
rename(2)
用于替换目标文件的临时文件
但是,在我的Linux系统(Ubuntu 16.04 LTS)上,此过程的一个后果是目标文件的所有权和权限更改为临时文件的所有权和权限,默认为uid
/ gid
和当前umask
.
我想我会stat(2)
在覆盖之前将代码添加到目标文件中,并且在调用之前将fchown(2)
//fchmod(2)
临时文件添加到目标文件中rename
,但是由于这个原因可能会失败EPERM
.
是唯一的解决方案,以确保文件的uid
/ gid
匹配当前用户和进程组覆盖文件?在这种情况下是否有一种安全的方法可以退回,还是我们必然会失去原子保证?