如果文件已经打开,fopen 是否返回 NULL 指针?

Raj*_*esh 1 c file-handling mingw32

我假设如果文件已经打开则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;
}
Run Code Online (Sandbox Code Playgroud)

编辑:增加了额外的代码来写一些数据都fp1fp2和看到的行为。如果执行,file1.txt包含数据BMS和似乎是正确的行为,fp1fp2如预期独立移动。首先AMS利用被写入fp1,然后A被替换B使用fp2和最终产量BMS

Aco*_*orn 6

根据 C 标准 (7.19.3.8),它是实现定义的:

打开附加(非临时)文件的函数需要一个文件名,它是一个字符串。组成有效文件名的规则是实现定义的。同一个文件是否可以同时打开多次也是实现定义的。

最重要的是,由于其他原因,不鼓励这样做,例如参见SEI CERT C 编码标准的 FIO24-C 建议

某些实现不允许同时打开同一文件的多个副本。因此,可移植代码不能依赖于如果违反此规则会发生什么。即使在不完全无法打开已打开文件的实现上,也存在 TOCTOU(检查时间,使用时间)竞争条件,其中第二次打开可能对与第一个不同的文件进行操作,原因是正在移动或删除的文件(有关 TOCTOU 竞争条件的更多详细信息,请参阅 FIO45-C。在访问文件时避免 TOCTOU 竞争条件)。