繁体   English   中英

如何(f)在c中同步linux下的目录

[英]how to (f)sync a directory under linux in c

我在 linux 下有一些 c 应用程序。 我正在使用rename(...)重命名一些文件 如何确保重命名持久写入底层磁盘?

使用文件,我可以执行以下操作:

FILE * f = fopen("foo","w");
...
fflush(f);
fsync(fileno(f));
fclose(f);

如何在 c 中的rename()之后fsync (或类似)目录?

rename()是原子的(在 linux 上),所以我认为你不需要担心

原子性通常在涉及文件名处理的操作中得到保证; 例如,对于重命名,“规范要求函数的操作是原子的”——也就是说,当将文件从旧名称重命名为新名称时,在任何情况下都不应同时看到这两个文件。

在 rename() 操作中间断电不应使文件系统处于“奇怪”状态,文件名无法访问,因为其元数据已损坏。 (即操作丢失,或操作已提交。)

来源

所以,我认为你应该只担心错误值。


如果您真的想要安全, fsync()还会刷新元数据(在 linux 上),因此您可以fsync目录和要确保磁盘上存在的文件。

这是你可以做你想做的事情:

#include <fcntl.h>
int fd = open('/path/to/dir', O_RDONLY);
fsync(fd);

当然,不要忘记在不再需要时关闭fd文件描述符。

与一些误解相反, rename()的原子性并不能保证文件会持久化到磁盘。 原子性保证仅确保文件系统缓冲区中的元数据处于一致状态,而不是已持久化到磁盘。

根据手册,在函数返回时, rename已有效完成(返回 0)或发生错误(返回 -1)并errno以检查错误。

如果您希望系统在rename后仅在此文件上应用潜在的挂起修改,您可以执行以下操作:

int fd = open(new_name, O_RDONLY);
syncfs(fd);

暂无
暂无

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

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