C 从文件指针获取旧数据(生产者和消费者问题)

C 从文件指针获取旧数据(生产者和消费者问题),c,linux,C,Linux,我每隔几秒钟从procfs读取一些文件,并显示信息。我不是每次打开和关闭文件,而是维护打开的文件句柄,并在完成后关闭它们。问题是我一直在获取旧数据。从第一次读取中收集的信息将在后续读取中返回,我已经确认procfs文件确实在更改 我发现的唯一解决方法是在读取数据时,在倒带()之前执行fflush()。这行得通,但我不明白为什么。我知道,如果我有两个程序读写同一个文件,那么生产者端需要一个fflush(),以便消费者能够看到这些更改。在这里,我在消费者端做了一个fflush(),它是有效的。生产者

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

我发现的唯一解决方法是在读取数据时,在倒带()之前执行fflush()。这行得通,但我不明白为什么。我知道,如果我有两个程序读写同一个文件,那么生产者端需要一个fflush(),以便消费者能够看到这些更改。在这里,我在消费者端做了一个fflush(),它是有效的。生产者和消费者是否有不同的文件句柄,因此消费者中的fflush()不包含生产者写入的fflush()数据


知道我为什么在没有fflush()的情况下获取陈旧数据,以及使用fflush()获取最新信息吗

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

文件流通常会被缓冲,这意味着它们在读取之前会复制到内存中,以避免从其他进程锁定它们。您必须确保您的流是非缓冲的,以不断地从硬盘检索信息。为此,请使用
setbuf(stream,NULL)
以确保缓冲区已清除。 您可以在此处阅读有关setbuf的信息:

我假设流被缓冲的原因是
fflush(stream)
清除缓冲流。 你可以在这里阅读: