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);

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

Linux下使用Sigar


可以看到所有文件系统的目录和以及磁盘之间的对应关系,比如根目录”/”对应的磁盘是/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”的结果是否一致:

Linux下使用Sigar


看,结果是不是很准确.

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

#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


以上是关于Linux下使用Sigar 获取磁盘信息的主要内容,如果未能解决你的问题,请参考以下文章

Linux下每天自动执行查看磁盘剩余空间的shell文件

如何在 Linux 上获取磁盘信息?

在linux下怎样将一个磁盘的剩余空间再分一个区

sigar在Centos和Windows下使用java系统软硬件配置信息

通过Java代码获取系统信息

利用Sigar获取系统信息