我有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,我依次调用function1和function2。
int main()
{
function1();
function2();
return 1;
}
Run Code Online (Sandbox Code Playgroud)
有时,function1 fopen会失败并显示错误号 13,即权限被拒绝。我只是有时观察到这一点。我在 2 秒后引入了一个sleepin ,它开始正常工作,没有任何问题。function1fclose
所以我怀疑文件没有立即发布fclose。睡眠并不是正确的解决办法。谁能建议如何解决这个问题?我在这里给出的示例是一个用例,实际代码在线程环境中运行。
C11 的草案 N1570 表示为 7.21.5.1 fclose 函数
成功调用 fclose 函数会导致刷新该流所指向的流并关闭关联的文件。流中任何未写入的缓冲数据都会传送到主机环境以写入文件;任何未读的缓冲数据都将被丢弃。无论调用是否成功,流都会与文件解除关联,并且由 setbuf 或 setvbuf 函数设置的任何缓冲区都会与流解除关联(如果是自动分配的,则释放该缓冲区)。
它不假设主机环境级别发生的情况,即函数仅在整个操作完成时返回,还是在请求排队后立即返回。
由于您的环境中可能会发生竞争条件,因此您应该多次重试失败的打开,最终在两次尝试之间存在延迟。如果可移植性不是问题并且您的系统支持 POSIXsync功能,您还可以在关闭文件后强制进行磁盘同步:
关闭部分:
...
fclose(fp)
sync(); // forces synchronization of io buffers to disk
Run Code Online (Sandbox Code Playgroud)重新打开部分
ntries = ...; // number of open tries
while (ntries-- > 0) {
fp = fopen(...);
if (fp != NULL) break; // open was successful
// optionaly add a delay
}
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
4704 次 |
| 最近记录: |