对这一块的操作涉及到的函数系列:setmntent(),getmntent(),endmntent(),stavfs()
在linux下man setmntent
#include <stdio.h>
#include <mntent.h>
FILE *setmntent(const char *filename, const char *type); //打开包含挂载点项目的文件
struct mntent *getmntent(FILE *fp); //读取整个文档,传回指向struct mntent结构的指针
int addmntent(FILE *fp, const struct mntent *mnt);
int endmntent(FILE *fp); //关闭文件
struct mntent {
char *mnt_fsname; /* name of mounted filesystem */
char *mnt_dir; /* filesystem path prefix */
char *mnt_type; /* mount type (see mntent.h) */
char *mnt_opts; /* mount options (see mntent.h) */
int mnt_freq; /* dump frequency in days */
int mnt_passno; /* pass number on parallel fsck */
};
--------------------------------------------------------------------------------------------
#include <sys/statvfs.h>
int statvfs(const char *path, struct statvfs *buf);
int fstatvfs(int fd, struct statvfs *buf);
struct statvfs {
unsigned long f_bsize; /* file system block size */文件系统块大小
unsigned long f_frsize; /* fragment size */碎片大小
fsblkcnt_t f_blocks; /* size of fs in f_frsize units */
fsblkcnt_t f_bfree; /* # free blocks */空闲的块
fsblkcnt_t f_bavail; /* # free blocks for unprivileged users */用户级的空闲节点
fsfilcnt_t f_files; /* # inodes */节点
fsfilcnt_t f_ffree; /* # free inodes */空闲的节点
fsfilcnt_t f_favail; /* # free inodes for unprivileged users */用户级的空闲节点
unsigned long f_fsid; /* file system ID */
unsigned long f_flag; /* mount flags */
unsigned long f_namemax; /* maximum filename length */
};
Linux中的/etc/fstab、/etc/mtab、/proc/mounts文件区别
/etc/fstab文件:/etc/fstab文件记录静态文件系统信息
该文件记录计算机硬盘分区相关信息,启动Linux、mount挂载分区等命令执行都,都会用到fstab信息,看页面示例也是带有:
/etc/mtab文件:
/etc/mtab该文件也是记载当前系统已经装载的文件系统,包括一些操作系统虚拟文件,这跟/etc/fstab有些不同。/etc/mtab文件在mount挂载、umount卸载时都会被更新, 时刻跟踪当前系统中的分区挂载情况。
/proc/mounts文件:
其实还有个/proc/mounts,这个文件也记录当前系统挂载信息,通过比较,/etc/mtab有的内容,/proc/mounts也有,只是序有所不同,另外还多了一条根文件系统信息:
1,对EMMC容量检查
int nandflash_capacity_detect()
{
char *table = "/proc/mounts"; //这个可以根据自己的情况修改
struct mntent *mnt;
struct statvfs statbuf;
uchar available_capacity = 0;
FILE *fp;
fp = fopen(table,"r");
if(NULL == fp)
{
return 0;
}
while((mnt = getmnetent(fp)))
{
if(strncmp(mnt->mnt_dir,"/mnt/mmcblk0p4",strlen("/mnt/mmcblk0p4")));
{
continue;
}
if(statvfs(mnt->mnt_dir,&statbuf) < 0)
{
break;
}else{
availble_capacity = (statbuf.f_bavail * ((uchar)statbuf.f_bsize) + 1024 / 2) / 1024; //单位为M
break;
}
}
endmntent(fp);
return availble_capacity ;
}