Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1300266
  • 博文数量: 548
  • 博客积分: 7597
  • 博客等级: 少将
  • 技术积分: 4224
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-15 13:21
个人简介

嵌入式软件工程师&&太极拳

文章分类

全部博文(548)

文章存档

2014年(10)

2013年(76)

2012年(175)

2011年(287)

分类: 嵌入式

2012-02-06 17:56:43

fstatfs/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;  /* 文件名的最大长度 */
};

相关的文件系统类型有:
      ADFS_SUPER_MAGIC      0xadf5
      AFFS_SUPER_MAGIC      0xADFF
      BEFS_SUPER_MAGIC      0x42465331
   BFS_MAGIC             0x1BADFACE
   CIFS_MAGIC_NUMBER     0xFF534D42
   CODA_SUPER_MAGIC      0x73757245
      COH_SUPER_MAGIC       0x012FF7B7
   CRAMFS_MAGIC          0x28cd3d45
      DEVFS_SUPER_MAGIC     0x1373
      EFS_SUPER_MAGIC       0x00414A53
   EXT_SUPER_MAGIC       0x137D
   EXT2_OLD_SUPER_MAGIC  0xEF51
   EXT2_SUPER_MAGIC      0xEF53
   EXT3_SUPER_MAGIC      0xEF53
   HFS_SUPER_MAGIC       0x4244
   HPFS_SUPER_MAGIC      0xF995E849
   HUGETLBFS_MAGIC       0x958458f6
   ISOFS_SUPER_MAGIC     0x9660
   JFFS2_SUPER_MAGIC     0x72b6
   JFS_SUPER_MAGIC       0x3153464a
      MINIX_SUPER_MAGIC     0x137F /* orig. minix */
   MINIX_SUPER_MAGIC2    0x138F /* 30 char minix */
   MINIX2_SUPER_MAGIC    0x2468 /* minix V2 */
      MINIX2_SUPER_MAGIC2   0x2478 /* minix V2, 30 char names */
   MSDOS_SUPER_MAGIC     0x4d44
   NCP_SUPER_MAGIC       0x564c
   NFS_SUPER_MAGIC       0x6969
   NTFS_SB_MAGIC         0x5346544e
   OPENPROM_SUPER_MAGIC  0x9fa1
     PROC_SUPER_MAGIC      0x9fa0
   QNX4_SUPER_MAGIC      0x002f
      REISERFS_SUPER_MAGIC  0x52654973
   ROMFS_MAGIC           0x7275
   SMB_SUPER_MAGIC       0x517B
   SYSV2_SUPER_MAGIC     0x012FF7B6
   SYSV4_SUPER_MAGIC     0x012FF7B5
      TMPFS_MAGIC           0x01021994
   UDF_SUPER_MAGIC       0x15013346
   UFS_MAGIC             0x00011954
    USBDEVICE_SUPER_MAGIC 0x9fa2
   VXFS_SUPER_MAGIC      0xa501FCF5
   XENIX_SUPER_MAGIC     0x012FF7B4
   XFS_SUPER_MAGIC       0x58465342
   _XIAFS_SUPER_MAGIC    0x012FD16D
 
   
返回说明:  
成功执行时,返回0。失败返回-1,errno被设为以下的某个值  
 
EACCES: (statfs())文件或路径名中包含的目录不可访问
EBADF : (fstatfs()) 文件描述词无效
EFAULT: 内存地址无效
EINTR : 操作由信号中断
EIO    : 读写出错
ELOOP : (statfs())解释路径名过程中存在太多的符号连接
ENAMETOOLONG:(statfs()) 路径名太长
ENOENT:(statfs()) 文件不存在
ENOMEM: 核心内存不足
ENOSYS: 文件系统不支持调用
ENOTDIR:(statfs())路径名中当作目录的组件并非目录
EOVERFLOW:信息溢出

 

一个简单的例子:

#include
#include

int main()
{
    struct statfs diskInfo;
    statfs("/",&diskInfo);
    unsigned long long blocksize = diskInfo.f_bsize;// 每个block里面包含的字节数
    unsigned long long totalsize = blocksize * diskInfo.f_blocks;//总的字节数
    printf("TOTAL_SIZE == %lu MB/n",totalsize>>20); // 1024*1024 =1MB  换算成MB单位

    unsigned long long freeDisk = diskInfo.f_bfree*blocksize; //再计算下剩余的空间大小
    printf("DISK_FREE == %ld MB/n",freeDisk>>20);

 return 0;
}

 

http://blog.csdn.net/hbuxiaoshe/article/details/6561914

 

 

先说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("/home", &sfs);
    int percent = (sfs.f_blocks - sfs.f_bfree ) * 100 / (sfs.f_blocks - sfs.f_bfree + sfs.f_bavail) + 1;
    printf("/dev/sda11            %ld    %ld  %ld   %d%% /home\n",
                           4*sfs. f_blocks, 4*(sfs.f_blocks - sfs.f_bfree),      4*sfs.f_bavail, percent);
    system("df /home ");
    return 0;

}

执行结果:

leave@LEAVE:~/test$ gcc -o df df.c
leave@LEAVE:~/test$ ./df
/dev/sda11            42773008    540356  40059864   2% /home
文件系统           1K-块        已用     可用 已用% 挂载点
/dev/sda11            42773008    540356  40059864   2% /home
leave@LEAVE:~/test$

-----------------------------------------busybox 中使用的挂载分区获取使用率-----------------------------

#include
#include

#include


extern int get_free_rate(char *path)
{
 struct statfs str_diskatr;
 long blocks_percent_used=0;
 long blocks_used=0;
 memset( &str_diskatr, 0x00, sizeof(str_diskatr) );

 if ( 0x00 == statfs( path, &str_diskatr ) )
 {
  if ( (str_diskatr.f_blocks != 0x00) ){
   blocks_used = str_diskatr.f_blocks - str_diskatr.f_bfree;
   blocks_percent_used = (((long long) blocks_used) * 100
     + (blocks_used + str_diskatr.f_bavail)/2
     ) / (blocks_used + str_diskatr.f_bavail);
   return blocks_percent_used;
  }
  else
   return -1;
 }
 else if(-1 == statfs( path, &str_diskatr ))
 {
  if(errno == ENOENT)
  {
   return 0;
  }
 }
 else
 {return -1;}

 return -1;
}

上端程序裁剪自busybox,使用

#define IDEDIR  "/mnt/ide/"   //挂载目录

(int )ide_useage = get_free_rate(IDEDIR);


----------------------------------计算文件夹占用空间大小-----------------------------------------------

#include
#include
#include
#include
#include

static unsigned int total = 0;

int sum(const char *fpath, const struct stat *sb, int typeflag)
{

    total += sb->st_size;
    return 0;

}


int main(int argc, char **argv)
{

    if (!argv[1] || access(argv[1], R_OK)) {

        return 1;

    }

    if (ftw(argv[1], &sum, 1)) {

        perror("ftw");

        return 2;

    }

    printf("%s: %u\n", argv[1], total);

    return 0;

}
lm@LM:/home/lm/tmpfs/c_c++> gcc -o du  du.c            11-03-24 10:06
lm@LM:/home/lm/tmpfs/c_c++> ./du /home/lm/音乐         11-03-24 10:22
/home/lm/音乐: 726629477
lm@LM:/home/lm/tmpfs/c_c++>                            11-03-24 10:22


(2010.6.29修正 添加busybox中的系统算法)

(2011.3.24修正 添加获取文件夹的大小)

 

阅读(945) | 评论(0) | 转发(0) |
0

上一篇:书本

下一篇:linux下USB驱动移植心得

给主人留下些什么吧!~~