8
  1. 使用lseek(fd,0)然后read(fd,buf)for/proc/stat文件而不是重新打开它以获取该文件的更新内容是否安全?
  2. 打开这个文件后的mmap()调用究竟做了什么(见下文)?

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

此外,如果我同时在循环中运行 top 和 cat /proc/stat,则 top 开始报告正确的 CPU-Usage。

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

mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f7b37649000

我正在使用带有 2.6.32-27-server 映像的 Ubuntu 10.04.1 桌面版。CPU是英特尔Q6600。

4

1 回答 1

4

你问的问题很有趣......我开始检查我的机器,但我没有看到 cat /proc/stat 和执行 top 之间的区别。无论如何,我在工作,我并不是完全“自由”地进行测试。

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

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

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

现在,回答你真正的问题:

  1. 是的,AFAIK 可以肯定,因为您将“等待”文件中的新数据,它应该比一直打开和关闭文件要好。

  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/

于 2011-01-25T13:22:42.030 回答