#include <sys/vfs.h>
#include <mntent.h>#include <iostream>
#include <string>
#include <list> 
using namespace std;struct mount_entry {
char *me_devname; /* Device node pathname, including "/dev/". */
char *me_mountdir; /* Mount point directory pathname. */
char *me_type; /* "nfs", "4.2", etc. */
dev_t me_dev; /* Device number of me_mountdir. */
unsigned int me_dummy : 1; /* Nonzero for dummy filesystems. */
unsigned int me_remote : 1; /* Nonzero for remote fileystems. */
int me_totalspace;//此分区总空间
int me_usedspace;//此分区使用空间
int me_freespace;//剩余空间
float me_usage; //利用率
};typedef list<mount_entry*> mount_entry_list;
typedef mount_entry_list::iterator mount_entry_list_iter;int main(int argc, char* argv[]) { mount_entry_list listMount;
//打开系统描述文件
FILE *pMntFile = setmntent(MOUNTED, "r");
if (pMntFile == NULL)
return -1; mntent *pMntent = NULL;
while ((pMntent=getmntent(pMntFile))) {

mount_entry* pCurMount = new mount_entry();//(mount_entry*)malloc(sizeof(mount_entry));
pCurMount->me_devname = strdup(pMntent->mnt_fsname);
pCurMount->me_mountdir = strdup(pMntent->mnt_dir);
pCurMount->me_type = strdup(pMntent->mnt_type);
//加入列表
struct statfs fsInfo;
statfs(pCurMount->me_devname, &fsInfo);
pCurMount->me_totalspace = fsInfo.f_blocks*(fsInfo.f_bsize/1024);  //转换为兆
pCurMount->me_freespace = fsInfo.f_bavail*(fsInfo.f_bsize/1024); ////转换为兆
pCurMount->me_usedspace = pCurMount->me_totalspace-pCurMount->me_freespace;

pCurMount->me_usage = pCurMount->me_totalspace==0 ? 0 : (float)pCurMount->me_usedspace/pCurMount->me_totalspace*100;

cout << "Disk: " << pCurMount->me_devname << endl;
cout << "Dir: " << pCurMount->me_mountdir << endl;
cout << "Total: " << pCurMount->me_totalspace << endl;
cout << "Free: " << pCurMount->me_freespace << endl;
cout << "Used: " << pCurMount->me_usedspace<< endl;
cout << "Usage: " << pCurMount->me_usage<< endl << endl;

listMount.push_front(pCurMount);
}
//关闭文件描述句柄
endmntent(pMntFile); //释放资源
mount_entry_list_iter itBegin = listMount.begin();
mount_entry_list_iter itEnd = listMount.end();
for(mount_entry_list_iter item=itBegin; item!=itEnd; item++)
{
delete *item;//free(*item);
}
listMount.clear();

return 0;
}