随笔: 分享一个c语言文件操作的坑(win)

30 阅读1分钟

情况是我在频繁执行文件操作的时候,不定时的报异常,因为我在一些读写操作前后加了一些保护性质的判断,例如通过access函数来判断一下文件是否存在,在决定是否允许读或者新建文件成功与否。但是我发现这样做没用,比如先做了判断文件存在,再进行remove操作,结果还是会返回-1,这个时候程序退出后,可以发展对应的文件目录下原本不存在的文件又出现了。又或者文件明明存在,但是fread却失败,errno显示没有权限。

因为我是在测试服务器功能的时候发展的问题,场景比较复杂,同样的请求逻辑顺序,报错位置不同,我也没能抓出一个能稳定复现的场景。

猜测可能和i/o操作的缓存有关,也就是说文件读写操作并不是你执行了fwrite/remove就立马生效,而且也不是单纯的队列排队执行。

后面为验证假设,取消了一些比较严格的判断条件,比如必须access判断文件存在才能remove(猜测可能是文件存在,但是没有remove权限,不过顶着报错执行remove后不管他,后续还是能在缓存中移除该文件?),或者fread返回Null的话就无限重试(超时终止),当然前提是在逻辑上保证文件应该存在。

执行的结果符合预期。

我不清楚是不是windows系统的问题,有谁在linux系统上也遇到过类似的问题或者知道具体的原理细节,欢迎指教,谢谢。