2014-09-24 53 views
2

我正在使用stdio.h中提供的rename()函数移动文件的Linux环境中使用C/C++系统。如何将文件同步到存储?

移动后,我需要功能将其同步到底层存储以使更改永久。如果我有一个文件描述符,我可以使用fsync()或fdatasync()。

有没有一个这样做的优雅方式?或者我必须做这样的事情:

rename(old_path, new_path); 
int fd = open(new_path, O_APPEND | O_WRONLY); 
fdatasync(fd); 
close(fd); 

即使工作?

+1

是的,它可以工作,尽管rename()不会对文件中的数据做任何事情,只会处理元数据。为了保持元数据的一致性,你还需要fsync()rename()影响的目录。 http://stackoverflow.com/questions/3764822/how-to-durably-rename-a-file-in-posix – nos 2014-09-24 10:54:05

回答

1

可能您正在寻找void sync(void);功能。

sync函数只是将所有已修改的块缓冲区排队等待写入和返回,它不会等待磁盘写入发生。

函数sync通常从 系统守护进程(通常称为update)周期性地调用(通常每30秒)。

保证定期翻转内核的块缓冲区。

+0

即使不是全部,操作系统也不能保证“sync”不能保证任何东西。 'sync'可能会加速写入一些延迟的写入。 – Art 2014-09-24 12:17:42

+0

你有没有可靠的消息来源,其中指出'sync'不能保证什么? – deimus 2014-09-24 12:44:16

+0

是的,我。我在操作系统中编写了'sync'的代码。 'sync'是无用的,因为当它返回时,你对文件系统的状态一无所知。不管奇怪的操作系统行为,即一个脏缓冲区的完成写入操作可能触发新的写操作,即使“sync”可以保证每个缓冲区都排队等待写入(不能),你仍然不知道它们什么时候会结束如果他们将被写入成功(POSIX说“同步()函数不应该返回一个值”,这意味着即使我们想要,也没有办法报告错误)。 – Art 2014-09-24 12:54:18