当文件流文件被覆盖时会发生什么
问题描述:
如果在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。
答
这取决于文件在磁盘上的覆盖方式。
- 如果文件被覆盖到位(相同的inode),您的程序将读取新数据。
fopen
在第一次读取之前不会自动填充缓冲区,所以fgets
将填充缓冲区并获取新数据(并发更新后)。- 这主要适用于本地文件系统。大多数网络文件系统都具有优化功能,如果没有文件锁定,则可能会返回旧数据。
- 没有文件锁定,并发修改可能导致读取操作观察中间状态。
- 如果文件被替换(删除并重新创建,或使用重命名操作),旧数据将被读取。
+0
这使得Sense。谢谢! –
什么被覆盖? 'FILE *'对象,或者磁盘上的文件? –
我觉得磁盘上的文件。 –