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