2014-09-24 52 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

相關問題