>打开这个文件后mmap()调用了什么(见下文)?
我遇到的问题是顶级报告cpu使用率太低(10%对比软件中断100%). strace表示top不会重新打开此文件,而是lseeks开始并再次读取它.不知何故,下次从这个文件读取的内容与我单独为/ proc / stat文件运行cat时的内容不匹配.
另外如果我同时在循环中运行top和cat / proc / stat,那么top会开始报告正确的cpu使用率.
我发现的另一个区别是top在打开/ proc / stat文件后立即使用mmap()调用,而cat没有这样做.我不确定这是否也与我的问题有关(因为filesdes = -1):
mmap(NULL,4096,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,-1,0) = 0x7f7b37649000
我使用的是带有2.6.32-27服务器映像的Ubuntu 10.04.1桌面版. cpu是Intel Q6600.
解决方法
您描述“刷新”打开的文件以读取新数据的方式是正确的…如果[f | l] seek()调用结束然后到文件的开头将更新EOF和new数据将被读取.
我不认为mmap()调用会导致你提到的问题,它可以使读取更快,但没有别的(我不是100%肯定).
我建议你在C中打开一个小应用程序,打开/ proc / stat,读取它,寻找它并再次阅读它以查看它是如何更新的,如果你有一些压力测试可能会有用.
现在,回答你真正的问题:
>是的,AFAIK是肯定的,因为你将“等待”文件上的新数据,它应该比打开和关闭文件更好.
>它将文件映射到进程地址空间,以下是一些信息和示例:
http://www.gnu.org/s/libc/manual/html_node/Memory_002dmapped-I_002fO.htmlhttp://www.linuxquestions.org/questions/programming-9/mmap-tutorial-c-c-511265/