读取 /proc 时刷新流缓冲区

5
我正在读取/proc/pid/task/stat以追踪线程的CPU使用情况。 在/proc/pic/task/stat上打开fopen 从流中获取一个字符串 对该字符串进行sscanf
然而,我遇到了问题,即无法更新流缓冲区。 如果我fget 1024个字符,它会刷新,但如果我只fget 128个字符,则永远不会更新,并且我始终获取相同的统计信息。 在读取之前,我倒回流并尝试了fsync。
我经常这样做,所以我宁愿不要每次重新打开文件。 正确的方法是什么?
1个回答

4
并非每个程序都适合使用缓冲I/O。
在您的情况下,我认为我只需要使用read(2)1。这样,您可以:
  • 消除所有陈旧的缓存问题2
  • 通过消除双重缓冲而更快地运行
  • 可能使用更少的内存
  • 肯定简化实现
对于您所描述的情况,效率提高可能对今天极为强大的CPU无关紧要。但是,我会指出像cp(2)和其他重型数据移动器之类的程序不使用缓冲I/O包。

1. 即open(2)read(2)lseek(2)close(2)
2. 或许截取一个参数,在与此相关的问题上,有人通常会提供类似于fflush(stdin)的“有用”建议,然后另一个人会准确地指出fflush()仅在输出流上由C99定义,而且通常依赖于特定实现的行为通常是不明智的。


1
明天我打算尝试从fopen切换到open。希望那样会更好。 - Brian Makin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接