覆盖FILE流文件时会发生什么

时间:2017-03-17 22:59:10

标签: glibc fgets suse

如果文件被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。

1 个答案:

答案 0 :(得分:0)

这取决于文件在磁盘上的覆盖方式。

  1. 如果文件被覆盖(相同的inode),程序将读取新数据。 fopen在第一次读取之前不会自动填充缓冲区,因此fgets将填充缓冲区并获取新数据(在并发更新之后)。
    • 这主要适用于本地文件系统。大多数网络文件系统都有优化,在没有文件锁定的情况下,仍然可以返回旧数据。
    • 没有文件锁定,并发修改可能导致读取操作,从而观察到中间状态。
  2. 如果替换文件(删除并重新创建或重命名操作),将读取旧数据。