Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1371380
  • 博文数量: 198
  • 博客积分: 1629
  • 博客等级: 上尉
  • 技术积分: 2743
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-01 15:41
文章分类
文章存档

2023年(6)

2022年(20)

2021年(8)

2020年(3)

2018年(17)

2017年(3)

2016年(3)

2015年(9)

2014年(13)

2013年(17)

2012年(77)

2011年(22)

分类: LINUX

2018-10-29 11:20:32

先说statfs结构:

#include  

int statfs(const char *path, struct statfs *buf);
int fstatfs(int fd, struct statfs *buf);

参数:  
path: 位于需要查询信息的文件系统的文件路径名。    
fd: 位于需要查询信息的文件系统的文件描述词。
buf:以下结构体的指针变量,用于储存文件系统相关的信息

struct statfs {
   long    f_type;    
   long    f_bsize;   
   long    f_blocks;  
   long    f_bfree;   
   long    f_bavail;  
   long    f_files;   
   long    f_ffree;   
   fsid_t  f_fsid;    
   long    f_namelen; 
};

statfs结构中可用空间块数有两种f_bfree和 f_bavail,前者是硬盘所有剩余空间,后者为非root用户剩余空间,ext3文件系统给root用户分有5%的独享空间,所以这里是不同的地方。这里要强调的是每块的大小一般是4K。因此,要实现与df结果一致的就得在获得块数上乘以4,这样已用、可用、总块数就可以实现。如果还要实现百分比一致,那么要注意的是,df命令获得是整数百分比,没有小数,这里使用的进一法,而不是四舍五入法。所以在程序里直接+1取整。

下面是实现的一个例子:(home目录为一个独立分区)

#include
#include

int main()
{
    struct statfs sfs;
    int i = statfs("/data", &sfs);
    int percent = (sfs.f_blocks - sfs.f_bfree ) * 100 / (sfs.f_blocks - sfs.f_bfree + sfs.f_bavail) + 1;
    printf("/dev/sda1            %ld    %ld  %ld   %d%% /home\n",
                           4*sfs. f_blocks, 4*(sfs.f_blocks - sfs.f_bfree),      4*sfs.f_bavail, percent);
    system("df /data ");
    return 0;
}

执行结果:
root@localhost:~/test$ gcc -o df df.c
root@localhost:~/test$ ./df
/dev/sda1            42773008    540356  40059864   2% /data
Filesystem           1K-blocks        Used Available Use% Mounted on
/dev/sda1            42773008    540356  40059864   2% /data
root@localhost:~/test$
阅读(4702) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~