Linux下使用Sigar 获取磁盘信息
Posted mb62de8abf75c00
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux下使用Sigar 获取磁盘信息相关的知识,希望对你有一定的参考价值。
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下使用Sigar 获取磁盘信息的主要内容,如果未能解决你的问题,请参考以下文章