我每隔几秒从 procfs 读取一些文件,并显示信息。我不是每次都打开和关闭文件,而是维护打开的文件句柄并在完成后关闭它们。问题是我一直在获取旧数据。从第一次读取中收集的信息会在后续读取中返回,我已确认 procfs 文件确实在发生变化。
我发现的唯一解决方法是在读取数据时在 rewind() 之前执行 fflush()。这行得通,但我不明白为什么。我知道如果我有两个程序读取和写入同一个文件,则生产者端需要一个 fflush() 以允许消费者看到这些更改。在这里,我在消费者端执行 fflush() 并且它有效。生产者和消费者不是有不同的文件句柄,因此消费者中的 fflush() 不会产生生产者写入的 fflush() 数据吗?
为什么我在没有 fflush() 的情况下获得陈旧数据,而使用 fflush() 获得最新信息,有什么想法吗?
最佳答案
文件流通常是缓冲的,这意味着它们在读取之前被复制到内存中,以避免其他进程锁定它们。您必须确保您的 Stream 未被缓冲以持续从硬盘检索信息。为此,请使用 setbuf (stream,NULL );
确保您的缓冲区已清除。
您可以在此处阅读有关 setbuf 的信息:
http://www.cplusplus.com/reference/clibrary/cstdio/setbuf/
我假设您的流被缓冲的原因是因为 fflush(stream)
清除缓冲流。
你可以在这里阅读:
http://www.cplusplus.com/reference/clibrary/cstdio/fflush/
关于c - 从文件指针获取旧数据(生产者和消费者问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11495872/