statfs函数使用

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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值