第二次从Proc-FS文件读取时使用lseek()是否安全

Han*_*olo 8 linux cpu-usage seek procfs

  1. 是否可以安全使用lseek(fd,0)然后再read(fd,buf)使用/proc/stat文件而不是重新打开它以便下次获取此文件的更新内容?
  2. mmap()打开这个文件后的调用真的如何(见下文)?

我遇到的问题是顶级报告CPU使用率太低(软件中断为10%对比100%).strace表示top不会重新打开此文件,而是lseeks开始并再次读取它.不知何故,下次从这个文件读取的内容与我/proc/stat单独运行cat for file 时的内容不匹配.

另外如果我同时/proc/stat在循环中运行top和cat ,那么top会开始报告正确的CPU使用率.

我发现的另一个区别是top mmap()在打开/proc/stat文件后立即使用call ,而cat不是那样做.我不确定这是否也与我的问题有关(因为filesdes=-1这里):

mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f7b37649000
Run Code Online (Sandbox Code Playgroud)

我正在使用带有2.6.32-27服务器映像的Ubuntu 10.04.1桌面版.CPU是Intel Q6600.

web*_*bbi 4

你问的问题非常有趣......我开始检查我的机器,但我没有看到 cat /proc/stat 和执行顶部之间的差异。不管怎样,我在工作,并没有完全“自由”地进行测试。

您描述的“刷新”打开的文件以读取新数据的方式是正确的......在 [f|l]seek() 调用到文件末尾然后调用文件开头的情况下,将更新 EOF 和新数据将读取数据。

我不认为 mmap() 调用会导致您提到的问题,它可以使读取速度更快,但没有别的(我不是 100% 确定)。

我建议你用 C 语言制作一个小应用程序,打开 /proc/stat,阅读它,查找它并再次阅读它以查看它是如何更新的,如果你要做一些压力测试也可能很有用。

现在,回答您的真实问题:

  1. 是的,据我所知,这是肯定的,因为您将“等待”文件上的新数据,这应该比一直打开和关闭文件更好。

  2. 它将文件映射到进程地址空间,以下是一些信息和示例:

http://www.gnu.org/s/libc/manual/html_node/Memory_002dmapped-I_002fO.html http://www.linuxquestions.org/questions/programming-9/mmap-tutorial-cc-511265/