我每隔几秒钟从procfs读取一些文件,并显示信息。我没有每次打开和关闭文件,而是在我完成时保持打开文件句柄并关闭它们。问题是我一直在获取旧数据。从第一次读取中收集的信息在后续读取中返回,我已经确认procfs文件确实在变化。
我发现的唯一解决方法是在读取数据时在倒带()之前执行fflush()。这有效,但我不明白为什么。我知道如果我有两个程序读取和写入同一个文件,那么生产者方面需要fflush()以允许消费者看到这些更改。在这里,我正在消费者方面做一个fflush()并且它有效。生产者和消费者不具有不同的文件句柄,因此消费者中的fflush()不会生成()生成器写入的数据吗?
为什么我在没有fflush()的情况下获取陈旧数据,以及使用fflush()获取最新信息?
答案 0 :(得分:1)
我不知道确切的答案,但我认为您观察到的行为的原因是消费者端缓存。它以块的形式读取文件,最有可能大于您一次处理的文件,因此当您要求“更多”时,缓冲区的“休息”将被提供给您。 fflush()
确保在提供数据之前销毁缓存
答案 1 :(得分:1)
文件流通常是缓冲的,这意味着它们在读取之前会被复制到内存中,以避免将它们从其他进程中锁定。您必须确保您的Stream未缓冲,以便不断从硬盘检索信息。为此,请使用setbuf (stream,NULL );
确保清除缓冲区。
你可以在这里阅读有关setbuf的内容:
http://www.cplusplus.com/reference/clibrary/cstdio/setbuf/
我假设您的流被缓冲的原因是因为fflush(stream)
清除了缓冲流。
你可以在这里阅读:
http://www.cplusplus.com/reference/clibrary/cstdio/fflush/