|
#include<stdio.h>
#include<sys/types.h>
#include<sys/statvfs.h>
//该函数的 功能主要是得到文件系统的 管理信息,并计算出文件系统的空余空间率。
int main(int argc, char* argv[])
{
struct statvfs buf;
int stat;
float per;
sync();
stat = statvfs(argv[1], &buf);
if(stat != 0){
perror("statvfs");
return 1;
}
per = (float) buf.f_bfree/buf.f_blocks*100;
printf("free percent %4.1f%%\n", per);
printf("buf.f_bsize %ld\n", buf.f_bsize);
printf("buf.f_frsize %ld\n", buf.f_frsize);
printf("buf.f_namemax %ld\n", buf.f_namemax);
printf("buf.f_bfree %ld\n", buf.f_bfree);
printf("buf.f_favail %ld\n", buf.f_favail);
printf("buf.f_fsid %ld\n", buf.f_fsid);
printf("buf.f_files %ld\n", buf.f_files);
printf("buf.f_flag %ld\n", buf.f_flag);
printf("buf.f_blocks %ld\n", buf.f_blocks);
printf("buf.f_ffree %ld\n", buf.f_ffree);
printf("buf.f_bavail %ld\n", buf.f_bavail);
return 0;
}
有两个地方不是很明白:
1. sync()函数:就是 把内存中保存的 super block块写到硬盘上去,而super block存放的是分区也就 是文件系统的 全部管理信息。
在这个函数这个函数中先调用sync(),将文件系统管理信息写到磁盘上(其实不是这样,根据APUE2所描述,它只是将块缓冲区的内容放到写队列中,然后就返回,并不等待实际谢磁盘操作结束)。
问:(1)在后面调用statvfs函数得到管理信息,这个函数按照上面的分析,应该是从硬盘上读出文件系统管理信息的吧?而且信息是存放在文件系统的super block中,对吧?
(2)在这个函数中去掉sync(),并不影响程序的 结果,想不 明白?因为内存中的文件系统信息才是最新的,所以有必要在调用statvfs前调用一下sync().
2.DESCRIPTION
The function statvfs() returns information about a mounted file system.
path is the pathname of any file within the mounted filesystem. buf is
a pointer to a statvfs structure defined approximately as follows:
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 non-root */
fsfilcnt_t f_files; /* # inodes */
fsfilcnt_t f_ffree; /* # free inodes */
fsfilcnt_t f_favail; /* # free inodes for non-root */
unsigned long f_fsid; /* file system ID */
unsigned long f_flag; /* mount flags */
unsigned long f_namemax; /* maximum filename length */
};
能说说mounted file system 和 file system 的分别吗?
编译运行程序:./a.out 参数 1 ,问题:不管我 的参数是什么(当然是存在的目录或者文件),程序的结果都是一样的!!!!想不 明白?
|