2017-03-17 82 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。谢谢! –