Linux
fsync 如何處理目錄連結?
fsync 手冊頁中以下語句的含義是什麼
呼叫 fsync() 不一定確保包含該文件的目錄中的條目也已到達磁碟。為此,還需要在目錄的文件描述符上顯式 fsync()。
這是否意味著當我在文件上呼叫 fsync 時 fsync 不會更新目錄元數據?
同一問題的另一個引用是(來自 Robert Love 的 Linux 系統程式之書):
這兩個函式都不能保證包含該文件的任何更新的目錄條目都會同步到磁碟。這意味著如果文件的連結最近已更新,則文件的數據可能會成功到達磁碟但無法到達關聯的目錄條目,從而導致文件無法訪問。
為什麼文件的數據需要到達目錄連結?如果我錯了,請糾正我,但目錄只包含該文件的文件名和 inode 號。實際數據在文件中。“數據將到達文件而不是目錄連結”是什麼意思?
它的意思是:
如果文件的連結最近已更新
文件的數據可能會成功到達磁碟,但
關聯的目錄條目可能無法成功到達磁碟
使文件無法訪問。
創建新文件時,這可能是一個問題。
我會忽略對“文件連結”的概括,除非您知道正在創建硬連結。
這是否意味著當我在文件上呼叫 fsync 時 fsync 不會更新目錄元數據?
是的。或者更確切地說,你不能依賴它。(有些實現可能總是在 fsync 返回之前更新它。)