通过编程获取Linux文件系统使用的详细信息_第1页
通过编程获取Linux文件系统使用的详细信息_第2页
通过编程获取Linux文件系统使用的详细信息_第3页
通过编程获取Linux文件系统使用的详细信息_第4页
通过编程获取Linux文件系统使用的详细信息_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

通过编程获取Linux文件系统使用的详细信息去年的操作系统课程设计,我做了一个基于linux到任务管理器。大部分需要到系统信息都是从linux下的一个伪文件系统/proc中读出的。大家都知道,此文件系统只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。比如说我想看一下系统cpu的信息,由于其信息存于/proc/cpuinfo中,所以我们在终端用输入如下命令:cat/proc/cpuinfo即可查看要查看到信息,如果要使用其中到某项信息则通过文件操作读出即可(当然要有一些处理)。其他像内存、进程等各项信息都能按照这种操作得到。可唯独在获取文件系统使用信息时遇到了问题,先来看一下我们这个项目中要做出的一个类似页面:500)this.width=500;"height="478"width="514"border="0">图中所显示的设备、目录等信息既是我们希望从系统中得到到信息,可/proc目录中记录文件信息的文件partitions记录的信息于我们想要得到到信息相差太远,changyan@changyan-fly:~$cat/proc/partitionsmajorminor#blocksname80244198584sda8138427448sda1821sda28563898506sda58661440561sda68710241406sda78846138648sda88921430678sda9810650601sda108111967931sda11看到了吧,里面的信息只有这几项,显然不行。后来,我又以为所需到信息可以从/dev下的文件中查找,可那里面到文件都是不可读的,我不停的在/proc下分析每个文件内容,可都没有我想要到内容,这个过程非常郁闷。可问题昨天晚上还是解决了,我通过系统调用实现的,在此,我将代码公开,一是让大家看一下,再一个就是如果哪位仁兄有能在文件中直接读出的方法,希望能告知一二,在此不胜感激。下面这个程序是我和同学不断讨论后设计出的一个非常巧妙的解决方案,具体代码如下://读出系统文件系统的使用情况,并打印输出//};intmain(){DiskInfo*disk_info;structstatfsfs_info;structmntent*mnt_info;FILE*fh;floatpercent;//用于存储设备使用百分比longtotal_free=0;//用于存储linux下尚余磁盘空间if((fh=setmntent("/etc/mtab","r"))==NULL){printf("Cannotopen\'/etc/mtab\'!\n");return-1;}while((mnt_info=getmntent(fh))!=NULL){if(statfs(mnt_info->mnt_dir,&fs_info)<0){continue;}if((disk_info=(DiskInfo*)malloc(sizeof(DiskInfo)))==NULL){continue;}//通过判断找到要找的格式if(strcmp(mnt_info->mnt_type,"proc")&&strcmp(mnt_info->mnt_type,"devfs")&&strcmp(mnt_info->mnt_type,"usbfs")&&strcmp(mnt_info->mnt_type,"sysfs")&&strcmp(mnt_info->mnt_type,"tmpfs")&&strcmp(mnt_info->mnt_type,"devpts")&&strcmp(mnt_info->mnt_type,"fusectl")&&strcmp(mnt_info->mnt_type,"debugfs")&&strcmp(mnt_info->mnt_type,"binfmt_misc")&&strcmp(mnt_info->mnt_type,"fuse.gvfs-fuse-daemon")&&strcmp(mnt_info->mnt_type,"securityfs")){if(fs_info.f_blocks!=0){percent=(((float)fs_info.f_blocks-(float)fs_info.f_bfree)*100.0/(float)fs_info.f_blocks);}else{percent=0;}}else{continue;}//将系统中的各项信息存于结构体相对应到变量中strcpy(disk_info->type,mnt_info->mnt_type);strcpy(disk_info->device,mnt_info->mnt_fsname);strcpy(disk_info->mntpnt,mnt_info->mnt_dir);longblock_size=fs_info.f_bsize/1024;disk_info->blocks=fs_info.f_blocks*block_size/1024;disk_info->bfree=fs_info.f_bfree*block_size/1024;disk_info->available_disk=fs_info.f_bavail*block_size/1024;disk_info->bused=(fs_info.f_blocks-fs_info.f_bfree)*block_size/1024;disk_info->bused_percent=(int)percent;printf("块大小:%dB\n",fs_info.f_bsize);//经测试每块大小不一定一样,根据分区格式确定的//将各项信息打印输出printf("设备号:%s目录:%s文件类型:%s总数:%ldMB空闲:%ldMB可用:%ldMB已用:%ldMB已用百分比:%d\n\n\n",disk_info->device,disk_info->mntpnt,disk_info->type,disk_info->blocks,disk_info->bfree,disk_info->available_disk,disk_info->bused,disk_info->bused_percent);if((strcmp(disk_info->mntpnt,"/")==0)||(strcmp(disk_info->mntpnt,"/boot")==0)){total_free+=disk_info->available_disk;}};printf("\nlinux下总的磁盘可用空间:%ldMB\n",total_free);printf("\nSuccess!\n");return0;运行过程:changyan@changyan-fly:~/桌面/gcc$gcc-cfile2.c-ofile2.ochangyan@changyan-fly:~/桌面/gcc$gccfile2.o-ofile2changyan@changyan-fly:~/桌面/gcc$./file2块大小:4096B设备号:/dev/sda9目录:/文件类型:ext4总数:20599MB空闲:17203MB可用:16157MB已用:3396MB已用百分比:16块大小:4096B设备号:/dev/sda10目录:/boot文件类型:ext4总数:625MB空闲:579MB可用:547MB已用:45MB已用百分比:7块大小:4096B设备号:/dev/sda1目录:/media/SYSTEM文件类型:fuseblk总数:37526MB空闲:21136MB可用:21136MB已用:16390MB已用百分比:43块大小:32768B设备号:/dev/sda5目录:/media/SOURCE文件类型:vfat总数:62385MB空闲:35201MB可用:35201MB已用:27184MB已用百分比:43块大小:4096B设备号:/dev/sda6目录:/media/Study文件类型:fuseblk总

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论