Linux下使用Sigar 获取磁盘信息
2015-06-15 14:31
429 查看
linux 下我们经常要对磁盘进行监控,那就需要获取磁盘的容量等信息,使用sigar 库可以很轻松的完成这些功能.
不同的linux 系统上文件系统目录各有差异,首先我们要知道当前系统下的目录有哪些.
和文件系统相关的结构体是sigar_file_system_t,我们看一下该结构体中包含了哪些信息:
结构体中包含了目录名,设备名等一些其他信息,我们要做的就是在代码中获取这些信息.
光有sigar_file_system_t还不够,我们还需要一个sigar_file_system_list_t 结构体,这个结构体是做什么的呢?
这个结构体代表了文件系统的列表,这个列表中包含了文件系统的所有信息,要想获得这个列表,我们使用函数sigar_file_system_list_get就可以了:
好了,根据以上的介绍,接下来看代码,看看如何获得所有文件系统的目录:
最后我们将获取的结果打印出来看看:
可以看到所有文件系统的目录和以及磁盘之间的对应关系,比如根目录”/”对应的磁盘是/dev/sda8.
现在已经能获取系统的目录结构,那怎样获得磁盘的容量信息呢?
和磁盘容量相关的是结构体sigar_file_system_usage_t,从它的函数原型可以看到和磁盘相关的一些参数,包括总容量,可用容量,剩余容量等.
同样的,要获取这个结构体信息,也要用到相关的函数sigar_file_system_usage_get,和上面获取系统目录列表的方式是不是很相似?其实,sigar 中大部分的信息都是以这种方式获取的.
其中这个dirname就是目录的名字,我们这里以根目录”/”为例.
下面看代码:
看一下打印的结果和使用命令“df -h”的结果是否一致:
看,结果是不是很准确.
下面附上程序源码供大家做个参考:
不同的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 socket 初步
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程
- [原创]java局域网聊天系统
- 基于 Linux 集群环境上 GPFS 的问题诊断
- 谁是桌面王者?Win PK Linux三大镇山之宝
- vivi下重新调整分区
- Linux VS Unix:Linux欲一统天下 Unix不死
- linux下设定环境变量