我当时假设fopen
回报NULL
指针(如果文件已打开)。但看起来fopen
不返回NULL
如果文件已在以下位置打开"w"
模式。下面是我用来尝试此操作的代码,但没有收到任何错误。我尝试使用 mingw32 以及 TDM-GCC-64 编译器。如果我没记错的话,如果文件已经打开,C++ 会给出错误。
#include<stdio.h>
int main()
{
FILE *fp1, *fp2;
fp1 = fopen("file1.txt", "w");
fp2 = fopen("file1.txt", "w");
if(fp2 == NULL)
{
printf("Error in opening file\n");
return(0);
}
// Edit: added following code to check the behavior if write operation
// is performed simultaneously
fputc('A', fp1);
fputc('M', fp1);
fputc('S', fp1);
fputc('B', fp2);
fclose(fp1);
fclose(fp2);
return 0;
}
编辑:添加了额外的代码以向两者写入一些数据fp1
and fp2
并查看行为。如果执行的话,file1.txt
包含数据BMS
似乎是正确的行为fp1
and fp2
按预期独立移动。第一的AMS
是用写成的fp1
进而A
被替换为B
using fp2
最终输出是BMS
.
根据 C 标准 (7.19.3.8),它是实现定义的:
打开附加(非临时)文件的函数需要一个文件名,该文件名是一个字符串。组成有效文件名的规则是实现定义的。同一个文件是否可以同时打开多次也是由实现定义的。
最重要的是,由于其他原因而不鼓励这样做,例如参见SEI CERT C 编码标准的 FIO24-C 推荐:
某些实现不允许同时打开同一文件的多个副本。因此,可移植代码不能依赖于违反此规则会发生什么。即使在打开已打开文件时并非完全失败的实现中,也存在 TOCTOU(检查时间、使用时间)竞争条件,其中第二个打开操作可能会在与第一个打开的文件不同的文件上进行操作,因为正在移动或删除的文件(有关 TOCTOU 竞争条件的更多详细信息,请参阅 FIO45-C。访问文件时避免 TOCTOU 竞争条件)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)