gpt4 book ai didi

c - fclose 是否立即释放文件?

转载 作者:太空宇宙 更新时间:2023-11-03 23:39:09 24 4
gpt4 key购买 nike

我有两个函数。第一个函数是以写入模式打开一个文件并写入一些内容,然后关闭它。

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

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

FILE *fp = fopen("file.txt", "r");
//parsing logic
fclose(fp);

main 中,我依次调用 function1function2

int main()
{
function1();
function2();
return 1;
}

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

所以我怀疑文件在fclose 后没有立即释放。 sleep 不是正确的解决方案。谁能建议如何解决这个问题?我在这里给出的例子是一个用例,实际代码是在线程环境中运行的。

最佳答案

C11 的 N1570 草案如 7.21.5.1 所述 fclose 函数

A successful call to the fclose function causes the stream pointed to by stream to be flushed and the associated file to be closed. Any unwritten buffered data for the stream are delivered to the host environment to be written to the file; any unread buffered data are discarded. Whether or not the call succeeds, the stream is disassociated from the file and any buffer set by the setbuf or setvbuf function is disassociated from the stream (and deallocated if it was automatically allocated).

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

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

  • 结束部分:

    ...
    fclose(fp)
    sync(); // forces synchronization of io buffers to disk
  • 重新打开部分

    ntries = ...;   // number of open tries
    while (ntries-- > 0) {
    fp = fopen(...);
    if (fp != NULL) break; // open was successful
    // optionaly add a delay
    }

关于c - fclose 是否立即释放文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50255784/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com