fclose 是否立即释放文件?

Aru*_*run 5 c fopen fclose

我有2个功能。第一个功能是以写入模式打开一个文件并向其中写入一些内容,然后关闭它。

FILE *fp = fopen("file.txt", "w");
//writing itnot file using fwrite
fclose(fp);
Run Code Online (Sandbox Code Playgroud)

第二个函数以读取模式打开文件,解析内容,然后关闭文件。

FILE *fp = fopen("file.txt", "r");
//parsing logic
fclose(fp);
Run Code Online (Sandbox Code Playgroud)

在 中main,我依次调用function1function2

int main()
{
    function1();
    function2();
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

有时,function1 fopen会失败并显示错误号 13,即权限被拒绝。我只是有时观察到这一点。我在 2 秒后引入了一个sleepin ,它开始正常工作,没有任何问题。function1fclose

所以我怀疑文件没有立即发布fclose。睡眠并不是正确的解决办法。谁能建议如何解决这个问题?我在这里给出的示例是一个用例,实际代码在线程环境中运行。

Ser*_*sta 2

C11 的草案 N1570 表示为 7.21.5.1 fclose 函数

成功调用 fclose 函数会导致刷新该流所指向的流并关闭关联的文件。流中任何未写入的缓冲数据都会传送到主机环境以写入文件;任何未读的缓冲数据都将被丢弃。无论调用是否成功,流都会与文件解除关联,并且由 setbuf 或 setvbuf 函数设置的任何缓冲区都会与流解除关联(如果是自动分配的,则释放该缓冲区)。

它不假设主机环境级别发生的情况,即函数仅在整个操作完成时返回,还是在请求排队后立即返回。

由于您的环境中可能会发生竞争条件,因此您应该多次重试失败的打开,最终在两次尝试之间存在延迟。如果可移植性不是问题并且您的系统支持 POSIXsync功能,您还可以在关闭文件后强制进行磁盘同步:

  • 我认为你的文件描述符在“fclose”之后无效 (2认同)