FILE *fopen(const char *path, const char *mode);
當mode是“a”時,表示“打開文件,用於追加 (在文件尾寫)。如果文件不存在就創建它。流被定位於文件的末尾”。這一點沒什麼問題,但是按照我之前的理解,我認爲當我打開文件後,如果不操作的話文件的偏移量不變,那麼如果當有兩個進程或者線程同時追加內容,應該是會發生覆蓋的。
例如,進程A以“a”的形式打開文件test.txt,但是不寫入,這時候進程B也以“a”的形式打開文件test.txt並寫入一行數據;那麼如果進程A再寫入內容,會把B進程寫入的內容覆蓋掉。
但實際上經過測試,發現並非這樣,測試代碼很簡單
int main()
{
FILE *fp = fopen("test.txt", "a");
if (!fp) return -1;
setbuf(fp, NULL);
while (1)
{
getchar();
fprintf(fp, "%d\n", getpid());
}
}
開啓兩個這個程序,進程A和進程B,然後通過回車分別執行A和B,A->B->A->B這樣執行,按照前面的設想,B進程的寫應該把A覆蓋,但實際上並不是這樣的:
43748
29534
43748
29534
通過上面的測試,說明“a”參數是真正意義上的在文件末尾添加內容,如果在中間有其他進程寫入信息,那麼下一次的寫會寫到這些信息的後面。所以參數“a”的定位並非是固定的偏移量,而是寫入時文件的末尾。
當然,上面的說法也有可能並不正確,目前我也不是特別瞭解,只是把我現在測試發現的現象記錄一下