先说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$
10-25 07:25