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

如何在c中(f)同步linux下的目录,c,filesystems,fsync,C,Filesystems,Fsync,我有一些linux下的c应用程序。我正在用重命名重命名一些文件。。。 如何确保重命名永久写入参考底图磁盘 使用文件,我可以执行以下操作: FILE * f = fopen("foo","w"); ... fflush(f); fsync(fileno(f)); fclose(f); 如何在c中重命名后对目录进行fsync或类似操作?根据,在函数返回时,重命名已完成,返回0或发生错误返回-1,并设置errno以检查错误 如果希望系统仅在重命名后在此文件上应用潜在的挂起修改,可以执行以下操作: i

我有一些linux下的c应用程序。我正在用重命名重命名一些文件。。。 如何确保重命名永久写入参考底图磁盘

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

FILE * f = fopen("foo","w");
...
fflush(f);
fsync(fileno(f));
fclose(f);
如何在c中重命名后对目录进行fsync或类似操作?

根据,在函数返回时,重命名已完成,返回0或发生错误返回-1,并设置errno以检查错误

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

int fd = open(new_name, O_RDONLY);
syncfs(fd);
重命名在linux上是原子的,所以我认为您不必担心这一点

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

重命名操作中间的断电不会让文件系统处于“奇怪”状态,文件名由于其元数据已经损坏而无法到达。即,要么操作丢失,要么操作已提交

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


如果您确实希望安全,还可以在linux上刷新元数据,这样您就可以fsync目录和文件,以确保磁盘上存在该目录和文件。

这就是您可以执行所需操作的方法:

#include <fcntl.h>
int fd = open('/path/to/dir', O_RDONLY);
fsync(fd);
当然,当不再需要时,不要忘记关闭fd文件描述符


与一些误解相反,重命名的原子性并不保证文件将被持久保存到磁盘。原子性保证仅确保文件系统缓冲区中的元数据处于一致状态,而不确保元数据已持久化到磁盘。

在POSIX系统上是原子的。C标准对此只字不提。如何获取目录的文件句柄?@powerpete我想你可以像打开任何其他文件一样只读取modeopendir。。?打开fopen…?@powerpete您经常使用opendir打开文件吗?open或fopen将完成这项工作,我认为opendir不会被fsync接受,因为它有点特殊。