2011-01-21 150 views
5

我正在读取/ proc/pid/task/stat以跟踪线程中的cpu使用情况。 的fopen上的/ proc/PIC /任务/ STAT fget从流 sscanf的对我有但得到的流缓存更新的问题串读取/ proc时刷新流缓冲区

的字符串。 如果我fget 1024个字符,如果更换,但如果我fget 128个字符,那么它永远不会更新,我总是得到相同的统计数据。 我在读取之前回滚流并尝试了fsync。

我这样做很频繁,所以我宁愿不重新打开文件每次。 什么是正确的方法来做到这一点?

回答

4

并非每个程序都从使用缓冲I/O中受益。

在你的情况,我想我只会用read(2) 。这样一来,您:

  • 消除一切陈旧缓冲问题
  • 可能运行通过消除双缓冲
  • 快可能使用较少的内存
  • 绝对简化实现

对于您所描述的情况,效率增益可能不会影响当今功能非常强大的CPU。但我会指出,诸如cp(2)和其他重型数据移动器的程序不使用缓冲I/O软件包。


1。也就是说,open(2)read(2)lseek(2),和close(2)
2.也许要拦截一个论点,在与这个问题有关的问题上,某人通常会沿着fflush(stdin)提供一个“有帮助”的建议,然后另一个人来精确指出fflush()由C99在输出流上定义只有依靠实现特定的行为通常是不明智的。

+1

我打算尝试从fopen转换到明天打开。希望这会更好。 – 2011-01-21 01:11:47