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

标签 c linux

我每隔几秒从 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/

相关文章:

c++ - SDL 1.3 : how to inplement simple scale-9-grid for image resize?

c - osx 和/或 linux 上进程范围的命名属性

c - 为什么在字符串开头没有空格时它不起作用?

c - asctime/localtime 输出错误

在c中创建按钮gtk数组

linux - 期望使用分离屏幕编写脚本

linux - 或RPM中的依赖性?

linux - 如何在 Linux bash 中提取带条件的 csv 文件的第 n 列?

由于未释放 Linux RAM 磁盘缓存导致的 Java OutOfMemoryError

c - 如何对已经类型定义的标识符进行类型定义?