linux下,读/写从不同的工艺相同的文件,读取过程得到了一些意想不到的数据

问题描述:

场景:linux下,读/写从不同的工艺相同的文件,读取过程得到了一些意想不到的数据

  1. 过程(A)打开文件,r+模式。过程(B)使用r+模式打开相同的文件。过程(A)将一些数据写入其中,并且fflush()。过程(A)通知过程(B)读取数据。 (B)读取数据。 < ----这是问题所在。

在头部有一些意想不到的字节(0000 0000 ...),左边的字节是正确的

PS:数据大小约为16k,我用一个fwrite()/fread()调用写入/读取它。

我也做了一个测试,也就是说,如果程序(B)在读取数据前调用fflush(),结果是正确的。

我的问题是,

  1. 什么是确保工艺(B)总是能够得到 更新数据的正确方法是什么? (A)已经调用了fflush(),为什么进程(B)在读取数据之前还需要 来fflush()?
+0

所有文件处理函数都读写* buffered *。如果文件的某些部分已经在缓冲区中,则不会再从磁盘读取,而是从缓冲区中返回 - 如果从另一个进程写入同一文件,缓冲区只会在fflush()后更新,该文件。你可能想要谷歌的*文件锁定*机制。 – tofro

+0

发布您的代码。你会得到真正的答案,而不是猜测。 –

每个一定会被冲洗以确保流准备用于I/O。当你在方法(a)打开你的流时,您将使用类似于:

FILE *fpA = fopen (filename, "r+"); 

,然后在过程(B)你做同样的事情:

FILE *fpB = fopen (filename, "r+"); 

两个fpAfpB是分开的数据流为filename。 (A)的流只对流程(B)的流中的流程没有影响,反之亦然。所以正确的方法是确保每个流都被刷新并准备好进行额外的I/O。

+0

不是。这可能有助于*一点点,但是想象**两个**过程都以相同(毫秒/微秒)的速度冲洗。如果没有特定的锁定机制,那么总会有一小部分的不确定性,其中部分文件已被写入,部分不存在,读取过程读取半更新的文件。 – tofro

+0

谢谢大家,我认为大卫是对的,而且,我需要一个锁定机制。 – user1482337