2011-01-21 259 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