考慮這個例子:是「文件數據」和「文件大小」提交到磁盤一起或單獨
FILE* stream = fopen("my_file", "w");
fputs("hello", stream);
如果電源的fputs的執行(過程中丟失會發生什麼)?
之後,我能否找到非零大小的「my_file」,但第一個字節不是'h'? 如果是,它保證爲零,還是可以包含任意值?
當然,假設沒有其他人觸摸我們的文件。
編輯:還假定目標磁盤驅動器/設備是能夠保持足夠長的時間足以寫入所有已在內部緩衝的數據的類型。
POSIX對此有什麼要說的嗎? Linux? Windows?
編輯:我不打算專注於如何實現STDIO流API的細節。假設POSIX,這裏是我真正的意思是:
int fd = open("my_file", O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
write(fd, "hello", 5);
編輯:POSIX認爲大小爲文件元數據,因此問題很可能被改寫爲:可以將文件數據和元數據,該文件作爲上述代碼的結果,它們會在不同的階段被提交到磁盤上?
編輯:http://www.sqlite.org/atomiccommit.html發現這一點:
7.5文件系統具有安全附加語義
在SQLite的版本中引入的另一個優化3.5.0利用的基本盤的「安全附加」行爲 。回想一下, SQLite假定當數據被附加到文件(特別是回滾日誌的 )時,首先增加文件大小 ,並且內容被寫入第二個。因此,如果在文件大小增加但寫入內容爲 之前電源丟失 ,則文件將保留包含無效的「垃圾」數據。但是,VFS的xDeviceCharacteristics方法可能會指示 文件系統實現「安全附加」語義。此 表示在文件大小增加 之前寫入內容,以便在斷電或系統崩潰時無法將 引入回滾日誌。
這似乎提供了至少部分答案。
[SQLite如何處理原子提交](http://www.sqlite.org/ atomiccommit.html)可能是有趣的。 – user786653
良好的鏈接 - 謝謝! –