2017-03-17 83 views
0

如果在fopen()和fgets()之間覆蓋文件會發生什麼?我有一個程序,與以下堆棧跟蹤失敗:當文件流文件被覆蓋時會發生什麼

0x00007f9d63629850 (Linux) 
0x00007f9d6253e8ab (/lib64/libc-2.11.3.so) __memchr 
0x00007f9d62523996 (/lib64/libc-2.11.3.so) _IO_getline_info_internal 
0x00007f9d6252d0cd (/lib64/libc-2.11.3.so) __GI_fgets_unlocked 

我有理由相信該文件中讀取可能會被覆蓋fopen()和與fgets()之間。這有多合理?

我們在SUSE 11.4上使用glibc 2.11.3,並將所有更新和補丁應用於glibc。

+0

什麼被覆蓋? 'FILE *'對象,或者磁盤上的文件? –

+0

我覺得磁盤上的文件。 –

回答

0

這取決於文件在磁盤上的覆蓋方式。

  1. 如果文件被覆蓋到位(相同的inode),您的程序將讀取新數據。 fopen在第一次讀取之前不會自動填充緩衝區,所以fgets將填充緩衝區並獲取新數據(併發更新後)。
    • 這主要適用於本地文件系統。大多數網絡文件系統都具有優化功能,如果沒有文件鎖定,則可能會返回舊數據。
    • 沒有文件鎖定,併發修改可能導致讀取操作觀察中間狀態。
  2. 如果文件被替換(刪除並重新創建,或使用重命名操作),舊數據將被讀取。
+0

這使得Sense。謝謝! –