Chinaunix首页 | 论坛 | 博客
  • 博客访问: 272126
  • 博文数量: 40
  • 博客积分: 589
  • 博客等级: 中士
  • 技术积分: 549
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-10 16:03
文章分类

全部博文(40)

文章存档

2013年(6)

2012年(34)

我的朋友

分类: LINUX

2012-11-13 17:08:06

    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中对应文件生成具体的内容,从而对其进行操作。

阅读(2880) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~