0

我每隔几秒钟从 procfs 读取一些文件,并显示信息。我不是每次都打开和关闭文件,而是维护打开的文件句柄并在完成时关闭它们。问题是我一直在获取旧数据。从第一次读取收集的信息会在后续读取中返回,并且我已经确认 procfs 文件确实在更改。

我发现的唯一解决方法是在读取数据时在 rewind() 之前执行 fflush()。这有效,但我不明白为什么。我知道如果我有两个程序读取和写入同一个文件,则需要在生产者端使用 fflush() 以允许消费者看到这些更改。在这里,我在消费者端做了一个 fflush() 并且它有效。生产者和消费者不是有不同的文件句柄,所以消费者中的 fflush() 不会 fflush() 生产者写入的数据吗?

任何想法为什么我在没有 fflush() 的情况下获得陈旧数据,以及使用 fflush() 获得最新信息?

4

2 回答 2

1

我不知道确切的答案,但我想你观察到的行为的原因是消费者端缓存。它以块的形式读取文件,很可能比您一次处理的文件大,因此当您要求“更多”时,缓冲区的“其余部分”会被提供给您。fflush()在给你数据之前确保缓存被销毁

于 2012-07-15T21:49:40.510 回答
1

文件流通常是缓冲的,这意味着它们在读取之前被复制到内存中,以避免将它们与其他进程锁定。您必须确保您的 Stream 没有缓冲,以便不断地从硬盘中检索信息。为此,请setbuf (stream,NULL );确保清除缓冲区。您可以在此处阅读有关 setbuf 的信息: http ://www.cplusplus.com/reference/clibrary/cstdio/setbuf/

我假设您的流被缓冲的原因是因为fflush(stream)清除了缓冲流。你可以在这里阅读: http ://www.cplusplus.com/reference/clibrary/cstdio/fflush/

于 2012-07-15T21:58:53.840 回答