對fopen使用“a”參數的新的認識

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”的定位並非是固定的偏移量,而是寫入時文件的末尾。

當然,上面的說法也有可能並不正確,目前我也不是特別瞭解,只是把我現在測試發現的現象記錄一下

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章