之前在一家公司做linux嵌入式,有一个需求就是获取当前设备的总内存大小以及剩余内存大小。
我们知道我们可以从/proc/meminfo文件中查看这两个信息大小,运行如下命令:
上面内存的信息量很多,我们并不需要这么多信息,我们要的也就其中的一行,为此我们可以再进行一些过滤,再使用下grep命令,运行如下命令,然后就可以得到我们需要的那一行:
其实除了grep命令,我们还可以使用awk命令来过滤,运行如下,也能达到同样的效果,$1代表第一列,也就是显示第一列为MemTotal的行。
我们得到了我们需要的行,接下来就是从这行分离出来我们需要的那一列,可以接着使用awk命令,我们需要的那个数值是在第2列,可以继续提取,运行结果如下,就得到了我们想要的那个值:
这里我们仅仅是用命令获得了我们想要的数据,如果我们用C语言实现呢?其实也不难,使用
popen函数打开上述命令,获得流数据,然后
fread读取就可以了,代码如下:
#include <unistd.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
/* 获取linux系统下内存信息 */
int get_mem_info( const char *name, int index )
{
FILE *stream;
char tmp[128];
char info[64];
int info_int = -1;
//sprintf( tmp, "cat /proc/meminfo | awk '$1 ~/%s/' | awk '{print $%d}'", name, index );
sprintf( tmp, "cat /proc/meminfo | grep %s | awk '{print $%d}'", name, index );
stream = popen( tmp, "r" );
if ( fread( info, 1, sizeof(info), stream ) > 0 ) {
info_int = atoi( info );
}
pclose( stream );
return info_int;
}
int main()
{
int total_size = get_mem_info( "MemTotal", 2 );
int free_size = get_mem_info( "MemFree", 2 );
printf( "%d %d\n", total_size, free_size );
exit(0);
}