linux下,读/写从不同的工艺相同的文件,读取过程得到了一些意想不到的数据
场景:linux下,读/写从不同的工艺相同的文件,读取过程得到了一些意想不到的数据
- 过程(A)打开文件,
r+
模式。过程(B)使用r+
模式打开相同的文件。过程(A)将一些数据写入其中,并且fflush()
。过程(A)通知过程(B)读取数据。 (B)读取数据。 < ----这是问题所在。
在头部有一些意想不到的字节(0000 0000 ...),左边的字节是正确的。
PS:数据大小约为16k,我用一个fwrite()
/fread()
调用写入/读取它。
我也做了一个测试,也就是说,如果程序(B)在读取数据前调用fflush()
,结果是正确的。
我的问题是,
- 什么是确保工艺(B)总是能够得到 更新数据的正确方法是什么? (A)已经调用了
fflush()
,为什么进程(B)在读取数据之前还需要 来fflush()?
每个流一定会被冲洗以确保流准备用于I/O。当你在方法(a)打开你的流时,您将使用类似于:
FILE *fpA = fopen (filename, "r+");
,然后在过程(B)你做同样的事情:
FILE *fpB = fopen (filename, "r+");
两个fpA
和fpB
是分开的数据流为filename
。 (A)的流只对流程(B)的流中的流程没有影响,反之亦然。所以正确的方法是确保每个流都被刷新并准备好进行额外的I/O。
不是。这可能有助于*一点点,但是想象**两个**过程都以相同(毫秒/微秒)的速度冲洗。如果没有特定的锁定机制,那么总会有一小部分的不确定性,其中部分文件已被写入,部分不存在,读取过程读取半更新的文件。 – tofro
谢谢大家,我认为大卫是对的,而且,我需要一个锁定机制。 – user1482337
所有文件处理函数都读写* buffered *。如果文件的某些部分已经在缓冲区中,则不会再从磁盘读取,而是从缓冲区中返回 - 如果从另一个进程写入同一文件,缓冲区只会在fflush()后更新,该文件。你可能想要谷歌的*文件锁定*机制。 – tofro
发布您的代码。你会得到真正的答案,而不是猜测。 –