1.功能描述编辑
查询文件系统相关的信息
2.用法
#include <sys/vfs.h> /* 或者 <sys/statfs.h> */
int statfs(const char *path, struct statfs *buf);
int fstatfs(int fd, struct statfs *buf);
3.参数
path: 需要查询信息的文件系统的文件路径名。
fd: 需要查询信息的文件系统的文件描述词。
buf:以下结构体的指针变量,用于储存文件系统相关的信息
struct statfs {
long f_type; /* 文件系统类型 */
long f_bsize; /* 经过优化的传输块大小,单位B*/
long f_blocks; /* 文件系统数据块总数 */
long f_bfree; /* 可用块数 */
long f_bavail; /* 非超级用户可获取的块数 */
long f_files; /* 文件结点总数 */
long f_ffree; /* 可用文件结点数 */
fsid_t f_fsid; /* 文件系统标识 */
long f_namelen; /* 文件名的最大长度 */
};
4.返回说明
成功执行时,返回0。失败返回-1,errno被设为以下的某个值
EACCES: (statfs())文件或路径名中包含的目录不可访问
EBADF : (fstatfs()) 文件描述词无效
EFAULT: 内存地址无效
EINTR : 操作由信号中断
EIO : 读写出错
ELOOP : (statfs())解释路径名过程中存在太多的符号连接
ENAMETOOLONG:(statfs()) 路径名太长
ENOENT:(statfs()) 文件不存在
ENOMEM: 核心内存不足
ENOSYS: 文件系统不支持调用
ENOTDIR:(statfs())路径名中当作目录的组件并非目录
EOVERFLOW:信息溢出
5.例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/statfs.h>
int main(int argc, char *argv[])
{
char buf[]="/home";
struct statfs stStatfs;
int lSts;
int percentage; /*已用百分比*/
memset(&stStatfs, 0, sizeof(struct statfs));
lSts = 0;
lSts = statfs(buf, &stStatfs);
if (0 != lSts)
{
printf("获取失败\n");
goto OUT;
}
percentage = (stStatfs.f_blocks - stStatfs.f_bfree) * 100 /(stStatfs.f_blocks - stStatfs.f_bfree + stStatfs.f_bavail) + 1;
printf("文件系统%20s 1k-块%5s 已用%5s 可用 已用%%%5s 挂载点\n", "", "", "", "", "", "");
printf("%ld %ld %ld %ld %%%d\n", stStatfs.f_type, 4*stStatfs.f_blocks, 4*(stStatfs.f_blocks - stStatfs.f_bfree), 4*stStatfs.f_bavail, percentage);
system("df /home");
OUT:
return 0;
}
6.例:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/vfs.h>
int main()
{
struct statfs diskInfo;
statfs("/", &diskInfo);
unsigned long long totalBlocks = diskInfo.f_bsize;
unsigned long long totalSize = totalBlocks * diskInfo.f_blocks;
size_t mbTotalsize = totalSize>>20;
unsigned long long freeDisk = diskInfo.f_bfree*totalBlocks;
size_t mbFreedisk = freeDisk>>20;
printf ("/ total=%dMB, free=%dMB\n", mbTotalsize, mbFreedisk);
statfs("/boot", &diskInfo);
totalBlocks = diskInfo.f_bsize;
totalSize = totalBlocks * diskInfo.f_blocks;
mbTotalsize = totalSize>>20;
freeDisk = diskInfo.f_bfree*totalBlocks;
mbFreedisk = freeDisk>>20;
printf ("/boot total=%dMB, free=%dMB\n", mbTotalsize, mbFreedisk);
statfs("/dev/shm", &diskInfo);
totalBlocks = diskInfo.f_bsize;
totalSize = totalBlocks * diskInfo.f_blocks;
mbTotalsize = totalSize>>20;
freeDisk = diskInfo.f_bfree*totalBlocks;
mbFreedisk = freeDisk>>20;
printf ("/dev/shm total=%dMB, free=%dMB\n", mbTotalsize, mbFreedisk);
}