【问题标题】:What happens when the FILE stream file is overwrittenFILE 流文件被覆盖时会发生什么
【发布时间】:2017-03-17 22:59:09
【问题描述】:

如果文件在 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() 之间被覆盖。这有多合理?

我们使用带有 glibc 2.11.3 的 SUSE 11.4,所有更新和补丁都应用于 glibc。

【问题讨论】:

  • 什么被覆盖了? FILE * 对象,还是磁盘上的文件?
  • 我认为是磁盘上的文件。

标签: glibc fgets suse


【解决方案1】:

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

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

【讨论】:

  • 这是有道理的。谢谢!
猜你喜欢
  • 2015-01-15
  • 1970-01-01
  • 1970-01-01
  • 2012-07-31
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-05
相关资源
最近更新 更多