您的位置:首页 > 运维架构 > Linux

Linux下使用Sigar 获取磁盘信息

2015-06-15 14:31 429 查看
linux 下我们经常要对磁盘进行监控,那就需要获取磁盘的容量等信息,使用sigar 库可以很轻松的完成这些功能.

不同的linux 系统上文件系统目录各有差异,首先我们要知道当前系统下的目录有哪些.

和文件系统相关的结构体是sigar_file_system_t,我们看一下该结构体中包含了哪些信息:

typedef struct {
char dir_name[SIGAR_FS_NAME_LEN];
char dev_name[SIGAR_FS_NAME_LEN];
char type_name[SIGAR_FS_INFO_LEN];     /* e.g. "local" */
char sys_type_name[SIGAR_FS_INFO_LEN]; /* e.g. "ext3" */
char options[SIGAR_FS_INFO_LEN];
sigar_file_system_type_e type;
unsigned long flags;
} sigar_file_system_t;


结构体中包含了目录名,设备名等一些其他信息,我们要做的就是在代码中获取这些信息.

光有sigar_file_system_t还不够,我们还需要一个sigar_file_system_list_t 结构体,这个结构体是做什么的呢?

typedef struct {
unsigned long number;   //文件系统目录个数
unsigned long size;
sigar_file_system_t *data;
} sigar_file_system_list_t;


这个结构体代表了文件系统的列表,这个列表中包含了文件系统的所有信息,要想获得这个列表,我们使用函数sigar_file_system_list_get就可以了:

SIGAR_DECLARE(int)
sigar_file_system_list_get(sigar_t *sigar,
sigar_file_system_list_t *fslist);


好了,根据以上的介绍,接下来看代码,看看如何获得所有文件系统的目录:

sigar_t *sigar_disk;
sigar_file_system_list_t list;

sigar_open(&sigar_disk);
sigar_file_system_list_get(sigar_disk,&list);

for(int i =0; i<list.number; ++i)
{
sigar_file_system_t t = list.data[i];

cout<<t.dir_name<<"-->"<<t.dev_name<<endl;

}

sigar_close(sigar_disk);


最后我们将获取的结果打印出来看看:



可以看到所有文件系统的目录和以及磁盘之间的对应关系,比如根目录”/”对应的磁盘是/dev/sda8.

现在已经能获取系统的目录结构,那怎样获得磁盘的容量信息呢?

和磁盘容量相关的是结构体sigar_file_system_usage_t,从它的函数原型可以看到和磁盘相关的一些参数,包括总容量,可用容量,剩余容量等.

typedef struct {
sigar_disk_usage_t disk;
double use_percent;
sigar_uint64_t total;
sigar_uint64_t free;
sigar_uint64_t used;
sigar_uint64_t avail;
sigar_uint64_t files;
sigar_uint64_t free_files;
} sigar_file_system_usage_t;


同样的,要获取这个结构体信息,也要用到相关的函数sigar_file_system_usage_get,和上面获取系统目录列表的方式是不是很相似?其实,sigar 中大部分的信息都是以这种方式获取的.

SIGAR_DECLARE(int)
sigar_file_system_usage_get(sigar_t *sigar,
const char *dirname,
sigar_file_system_usage_t *fsusage);


其中这个dirname就是目录的名字,我们这里以根目录”/”为例.

下面看代码:

const char *dirname = "/";

sigar_file_system_usage_t usage;

sigar_file_system_usage_get(sigar_disk,dirname,&usage);

uint64_t total = usage.total/1024;      //"Unit:MB"
uint64_t avail = usage.avail/1024;      //"Unit:MB"
double   used_percent = usage.use_percent;

cout<<"Total: "<<total<<endl;
cout<<"Avail: "<<avail<<endl;
cout<<"UsedPercent: "<<used_percent<<endl;


看一下打印的结果和使用命令“df -h”的结果是否一致:



看,结果是不是很准确.

下面附上程序源码供大家做个参考:

#include <iostream>
#include <cstdint>
#include <sigar.h>

using namespace std;

int main(int argc,char **argv)
{

sigar_t *sigar_disk;
sigar_file_system_list_t list;

sigar_open(&sigar_disk);
sigar_file_system_list_get(sigar_disk,&list);

for(int i =0; i<list.number; ++i)
{
sigar_file_system_t t = list.data[i];

cout<<t.dir_name<<"-->"<<t.dev_name<<endl;

}

const char *dirname = "/";

sigar_file_system_usage_t usage;

sigar_file_system_usage_get(sigar_disk,dirname,&usage);

uint64_t total = usage.total/1024;      //"Unit:MB"
uint64_t avail = usage.avail/1024;      //"Unit:MB"
double   used_percent = usage.use_percent;

cout<<"Total: "<<total<<endl;
cout<<"Avail: "<<avail<<endl;
cout<<"UsedPercent: "<<used_percent<<endl;

sigar_close(sigar_disk);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  系统 磁盘 linux