进程A中,在一个单独的线程里对收到的消息数据进行处理,并打开一个文件,写入数据,关闭文件。关闭文件后,执行CopyFile, 复制当前文件,生成一个新文件,再由另一个进程B对新生成的文件进行读取。
现在在fopen时,会频繁报错 open file error,但是具体的error原因,没有在code中打出来,目前也无法得知。
2018/04/26 10:28:44.222 I ThreadB Process message: src= 5
2018/04/26 10:28:44.223 I ThreadB Process message: src= 0
2018/04/26 10:28:44.482 I ThreadB Process message: src= 1
2018/04/26 10:28:44.482 E ThreadB Error Opening ** file: C:\writting.txt
2018/04/26 10:28:44.482 I ThreadB Process message: src= 2
2018/04/26 10:28:44.482 E ThreadB Error Opening ** file: C:\writting.txt
2018/04/26 10:28:44.482 I ThreadB Process message: src= 3
2018/04/26 10:28:44.482 E ThreadB Error Opening ** file: C:\writting.txt
从log中可以看到,起初的一段时间,是可以正常工作的,有三四个open error出现,基本在几个毫秒级别,然后又回复正常,然后会重复这种情况,间隔几秒,十几秒,或者几分钟会出现几个error,最后,会连续出现error,然后就无法恢复了。最后只有重启进程,删掉文件并重建。
对文件处理不是很了解,重开一贴顶上去,请大牛指教原因。
谢谢
文件被占用,你需要用互斥量让另一个进程等待,等文件写完了,再读取,或者可以用一个事务队列
因为实现读取的进程B,是第三方的,所以我们无法去修改,只能对进程A进行改动,目前需要提供一个解释。
有些时候,error出现之后,为什么会自行恢复,为什么到最后就无法恢复了。
copyfile、fopen、fclose这三个函数要在同一个线程里面,也是说这几个函数不能并行。你是这样吗?
频繁读写物理文件的效率是不是太低了?也许是物理读写速度太慢了。
你这人也是有点意思,之前那贴说那么多了,让你做进程间同步,你是没看见,还是不会做,原来都白说了是吧。
两个线程要同步,类似生产者和消费者关系
谢谢大家回复,fopen, fclose,copyfile都是在同一个线程里进行的,另外,对文件进行读操作是由第三方进程进行,所以没法做进程间同步,
写进程是由我们自己开发的,现在看到一些解决方案,但是对于现象产生的根本原因还是希望能得到进一步的解释, error为什么发生几次后,会自行恢复正常,又为什么到最后无法恢复了。
问题解决了么?原因你一个进程A在写,一个进程B在读。基于你的情况,可以尝试一下进程A写完文件后,rename而不是copy