你好,游客 登录 注册 搜索
背景:
阅读新闻

在Linux下获取cpu的个数

[日期:2007-11-25] 来源:Linux公社  作者:CPU [字体: ]

     Linux下获得CPU个数一个简单方法就是查看/proc/cpuinfo文件。看出现processor字样的行数是多少条,即有多少个逻辑CPU(包括多核,超线程)。

因此cmd下输入下面命令即可:

    cat /proc/cpuinfo | grep processor | wc -l

因此c++程序中很自然的想到使用strstr函数查找processor关键词出现次数即可。但是发现使用下面代码获得文件长度时出错。

    FILE * pFile = fopen("/proc/cpuinfo", rb);
     if (!pFile)
         return -1;
     fseek(pFile, 0, SEEK_END);
     int iFileLen = ftell(pFile);
     fseek(pFile, 0, SEEK_SET);
     char * pBuff = new char[iFileLen];
     iFileLen = fread(pBuff, sizeof(char), iFileLen, pFile);

上面这段程序能打开该文件,但是获得文件长度时却为0。使用ll命令查看该文件,确实显示文件长度为0,而且/proc目录下很多文件为0。但是使用vi或cat查看该文件,确实是有内容的。

网上搜索了相关资料,才发现/proc这个目录是很特殊的。/proc是一个虚拟的文件系统,存在于内存中而不是硬盘上。该文件系统是让用户可以跟内核内部数据结构进行交互,获取有关进程信息。因此/proc是由内核控制的,默认是只读的。该文件系统也跟其他文件系统一样注册进VFS层,当通过vi或cat命令访问该文件系统中的节点(文件或目录)时,/proc文件系统才根据内核信息建立对应的文件和目录。

      因此根据上述资料,可以猜测调用fopen和fseek函数时,/proc文件系统只是显示文件,而没有生成具体的内容。这个使用ll命令查看文件的效果一样。接着我又做了个实验,即直接使用fread读入1024个字节,发现确实pBuff数据中确实有了数据,因此这也证明了上述猜测。只有对/proc目录下的文件进行编辑时,/proc文件系统才会去根据内核信息建立对应文件。因此最后代码改成如下形式,即可读入文件信息。

     FILE * pFile = fopen("/proc/cpuinfo", rb);
     if (!pFile)
         return -1;
     fseek(pFile, 0, SEEK_END);
     int iFileLen = 1024 * 1024; //缓存区置的大些
     char * pBuff = new char[iFileLen];
     iFileLen = fread(pBuff, sizeof(char), iFileLen, pFile);//返回文件长度


因此,对于特殊目录/proc中的文件读取时,fseek函数失效,需要一些特殊处理,使用fread来使得/proc中对应文件生成具体的内容,从而对其进行操作。

linux
相关资讯       Linux CPU 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款