第十一章系统信息显示实验_第1页
第十一章系统信息显示实验_第2页
第十一章系统信息显示实验_第3页
第十一章系统信息显示实验_第4页
第十一章系统信息显示实验_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

1、第十一章第十一章 系统信息显示实验系统信息显示实验11.1 11.1 实验目的实验目的11.2 11.2 准备知识准备知识11.2.1 proc 文件系统简介文件系统简介 由于Linux内核版本的不同,/proc文件系统内的文件集合略有差异,本实验使用的是2.6版本的内核。Proc文件系统中一般包括以下信息(文件):文件包括:driver、modules、execdomains、mounts、fb、mtrr、filesystems、fs、partitions、interrupts、schedstat、iomem、ioports、irq、slabinfo、kallsyms、stat、acp、kc

2、ore、swaps、keys、sys、buddyinfo、key-users、sysrq-trigger、kmsg、sysvipc、cmdline、loadavg、cpuinfo、lockdep、uptime、crypto、lockdep_stats、version、devices、locks、vmcore、diskstats、mdstat、vmstat、dma、meminfo、xen、dri、zoneinfo子目录包括:net、scsi、self、asound、bus、tty、misc和进程id为名的子目录。11.2.2 proc11.2.2 proc中的硬件信息中的硬件信息一一CPU信息信

3、息 /proc/cpuinfo文件提供了有关CPU的多种信息。这些信息是从内核里对CPU的测试代码中得到的。文件列出了CPU的个数:processor;CPU制造商:vendor_id;CPU架构:model;CPU名称:model name;CPU时钟频率:cpu MHz;CPU缓存大小:cache size;CPU包含的指令集:flags。文件还包含了以bogomips表示的处理器速度,而且如果检测到CPU的多种特性或bug,文件还会包含相应的标志。该文件的每行包括一个域名称、一个冒号和一个值,格式如下:processor : 0vendor_id : GenuineIntelcpu fa

4、mily : 6model : 15model name : Intel(R) Xeon(R) CPU 3050 2.13GHzstepping : 2cpu MHz : 2133.451cache size : 2048 KBphysical id : 0siblings : 2core id : 0cpu cores : 2fdiv_bug : nohlt_bug : nof00f_bug : nocoma_bug : nofpu : yesfpu_exception : yescpuid level : 10wp : yesflags : fpu vme de pse tsc msr p

5、ae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc arch_perfmon pebs bts pni monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr lahf_lmbogomips : 4269.39clflush size : 64processor : 1vendor_id : GenuineIntelcpu family : 6model : 15二存储器信息二存储器信息 /pro

6、c/meminfo文件给出了内存状态的信息。它显示出系统中物理内存的总量:MemTotal;未使用的物理内存总量:MemFree;用作文件缓冲的物理内存总量:buffers;用作缓存的物理内存总量:Cached;活跃的内存大小:Active;不活跃的内存大小:Inactive;交换分区的总量:SwapTotal;交换分区未使用的总量:SwapFree等信息。MemTotal: 2074988 kBMemFree: 1496184 kBBuffers: 154600 kBCached: 242168 kBSwapCached: 4828 kBActive: 259856 kBInactive:

7、203580 kBHighTotal: 1179392 kBHighFree: 888172 kBLowTotal: 895596 kBLowFree: 608012 kBSwapTotal: 4194296 kBSwapFree: 4017528 kBDirty: 8 kBWriteback: 0 kBAnonPages: 65532 kBMapped: 18488 kBSlab: 94788 kBSReclaimable: 78164 kBSUnreclaim: 16624 kBPageTables: 4452 kBNFS_Unstable: 0 kBBounce: 0 kBCommitL

8、imit: 5231788 kBCommitted_AS: 517688 kBVmallocTotal: 114680 kBVmallocUsed: 4908 kBVmallocChunk: 109368 kBHugePages_Total: 0HugePages_Free: 0HugePages_Rsvd: 0HugePages_Surp: 0Hugepagesize: 4096 kB三其他硬件信息三其他硬件信息p /proc/partitions文件包含了磁盘的分区状况。它显示了磁盘分区的主要编号、次要编号、该分区所占的块大小、以及该分区的分区名。/proc/devices:该文件列出了字

9、符设备和块设备以及它们的主设备号、设备名称。/proc/ioports:该文件列出了端口地址范围以及使用该端口地址的设备。/proc/iomem:该文件列出了内存地址范围以及该段内存的用途,内容如下:00000000-0009ffff : System RAM000a0000-000bffff : Video RAM area000c0000-000c8fff : Video ROM000c9000-000c9fff : Adapter ROM000ca000-000cb7ff : Adapter ROM p /proc/interrupts:这个文件的每一行都有一个保留的中断。每行中的域有中

10、断号、该中断发生的次数、该中断所对应的中断类型以及登记使用这个中断的驱动程序名称。 CPU0 CPU1 0: 8985 0 IO-APIC-edge timer 1: 2 0 IO-APIC-edge i8042 4: 2 0 IO-APIC-edge 8: 3 0 IO-APIC-edge rtc 9: 0 0 IO-APIC-fasteoi acpi 12: 4 0 IO-APIC-edge i8042 14: 64 3666722 IO-APIC-edge libata 11.2.3 proc11.2.3 proc中的软件信息中的软件信息qsortqsort( ) (#include (

11、 ) (#include ) void qsort(void *array,size_t count,size_t size,comparision_fn_t compare)strtokstrtok( ) (#include( ) (#include) 定义:char *strtok(char *s,const char *delim)strdupstrdup( ) (#include( ) (#include) 定义:char *strdup(const char *s)getenvgetenv( ) (#include( ) (#include) 定义:char *getenv(cons

12、t char *name)getoptgetopt( ) (#include( ) (#include) 定义:int getopt(int argc,char * const argv ,const char * optstring)selectselect()() FD_ZERO(fd_set *fdset); FD_SET(int fd, fd_set *fdset): FD_CLR(int fd, fd_set *fdset); FD_ISSET(int fd, fdset *fdset) int select(int nfds, fd_set *readset, fd_set *wr

13、iteset, fd_set *exceptset, struct timeval *timeout);11.2.4 11.2.4 实验中使用的库函数实验中使用的库函数11.2.5 11.2.5 实验中使用的编程技术实验中使用的编程技术一一termcap终端终端1. termcap的基本概念的基本概念 termcap库是termcap数据库所提供的API,该库可以在/etc/termcap中找到,库函数可以进行如下工作:(详细情况参考screen.c)获得当前终端的描述:int tgetent(char *bp,char *name);在描述中查找信息:int tetnum(char fd2)

14、; char *tgetstr(char fd2,char *area);终端特定格式编码数字参数:char tgoto(char *cap,int cd,int row);计算并执行填充:int tputs(char *str,int offset,int(*putc)( );2. 终端的操作终端的操作 对终端的操作通过设置函数tcgetattr( )和函数tcsetattr( )来实现。其中函数tcgetattr( )是用来初始化一个termios数据结构,并设置用来表示该终端特性和设置的值,可以操纵有函数tcgetattr( )返回的数据结构来查询和改变这些设置,当完成这些操作时,就使用

15、tesetattr( )函数用新值来更新终端。函数tcgetattr( )和tcsetattr( )的调用形式如下:int tcgetattr(int fd,struct termios *p);int tcsetattr(int fd,int action,struct termios *tp);二、二、信号信号1. 信号的基本概念信号的基本概念程序的执行通常是同步进行的,每一步操作都紧跟在前一步操作之后,有时,需要立即中断这种执行流程而执行其它操作,这可能是终止程序的请求,也可能是处理一些新操作的请求。信号是异步的软件中断。信号的异步特性会在信号到达时阻止应用程序抢先运行,信号一定要在信号

16、到达之前进行注册。信号会挂起程序的执行,然后,信号处理过程将调用已注册的函数或操作。2. 信号相关函数信号相关函数int sigemptyset(sigset_t *set); /将信号集合清空。int sigfillset(sigset_t *set); /将信号集合设置成包含所有的信号。在对信号进行操作以 前一定要对信号集进行初始化。int sigaction(int signo, const struct sigaction *act, struct sigaction *oact); /该函数用来为进程安装信号处理器,struct sigaction数据是 用来保存信号处理器的相关信息

17、。int sigaddset(sigset_t *set, int signo); /向信号集中加入signo对应的新信号。int sigdelset(sigset_t *set, int signo); /从信号集中删除signo对应的一个信号。int sigismember(const sigset_t *set, int signo); /判断某个信号是否在信号集中。返回1则在,0则不在。int sigprocmask(int how,const sigset_t *set, sigset_t *oset); 用来设置进程的信号屏蔽码。11.3 11.3 实验内容实验内容11.4 11.

18、4 实验指导实验指导11.4.1 11.4.1 系统信息显示实验系统信息显示实验一实验设计思想 Linux系统信息是通过访问/proc目录获取得的,从/proc/cpuinfo、/proc/meminfo、/proc/partitions、/proc/ioports、/proc/interrupts文件中可以分别得到CPU信息、内存信息、磁盘分区状态、端口信息、中断信息;/proc/version、/proc/fs、/proc/modules、/proc/locks可以分别得到内核信息、文件系统信息、模块信息、打开文件被加锁的信息;可以从/proc/$process_id/status得到该进

19、程的信息,其中$process_id表示进程id。设计的Linux系统信息获取的软件,只显示了几个常用和典型的CPU、存储器、磁盘、进程等信息。软件的界面使用GTK+制作的。Linux系统信息显示软件的整体框架结构如图11-1所示。图11-1 系统获取软件结构图二流程设计1. 主体框架的流程 要实现上述功能,采用图形用户界面设计实现Linux系统信息显示软件的主体框架的流程,如图11-2所示。图11-2 信息查看软件流程图2. 系统信息获取流程系统信息获取流程图11-3 系统信息获取流程图3. 进程信息获取流程图进程信息获取流程图图11-4进程信息获取流程图三、实现代码u 主体框架的实现/*初

20、始化gtk*/ gtk_init(&argc,&argv);/*创建窗口*/ mainWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);/*收到delete_event信息号,关闭窗口*/ g_signal_connect(G_OBJECT(mainWindow),delete_event,G_CALLBACK(delete_event),NULL);/*设置窗口的边*/ gtk_container_set_border_width(GTK_CONTAINER(mainWindow),10); /*调用buildTable函数创建布局表*

21、/ layoutTable = buildTable();/*把创建的表添加到窗口里*/ gtk_container_add(GTK_CONTAINER(mainWindow),layoutTable);/*显示表*/ gtk_widget_show(layoutTable); u 页面布局的实现为hardware_notebook添加页/*调用添加页面的函数为hardware_notebook添加页面*/add_hardware_page_type2(infoNotebook,处理器信息,1); add_hardware_page_type2(infoNotebook,存储器信息,2);/*

22、add_hardware_page_type1函数不为信息格式作转换*/ add_hardware_page_type1(infoNotebook,磁盘分区,/proc/partitions); add_hardware_page_type1(infoNotebook,设备信息,/proc/devices);add_hardware_page_type2(infoNotebook,端口信息,3);add_hardware_page_type2(infoNotebook,设备使用内存地址表,4); add_hardware_page_type2(infoNotebook,中断表,5); 为软件信

23、息notebook添加页 /*为软件信息的notebook控件添加页面*/add_software_page(infoNotebook,内核信息,1);add_software_page(infoNotebook,加载的文件系统,3);add_software_page(infoNotebook,加载的模块,4);add_software_page(infoNotebook,当前被内核加锁的文件,5);/ add_software_page(infoNotebook,其他信息,6);/*添加进程信息*/ add_process_page(infoNotebook);3. CPU信息显示信息显示

24、为CPU信息定义一个结构体,包括的信息有CPU个数、CPU缓存、CPU时钟频率、CPU速度、CPU制造商、CPU型号、CPU停机bug、CPU包含的指令集、CPU是否具有浮点运算单元,然后将对应信息显示在窗口中。typedef struct intcpu_number; intcpu_cache; floatcpu_speed; floatcpu_bogomips; charcpu_vendor20; charcpu_model40; char cpu_hlt_bug5; charcpu_flag120; charcpu_fpu5;cpu; cpu cpuinfo; char *cant_me

25、ssage = Can not open /proc/cpuinfo!; char *full_message = Buffer array is full!; /*以只读的方式打开/proc/cpuinfo文件*/ fp = fopen(/proc/cpuinfo,r); /*把cpuinfo的内容读取到buffer字符数组内*/bytes_read = fread(buffer,1,sizeof(buffer),fp);/*关闭文件*/ fclose(fp);/*如果没读到数据,返回不能打开文件信息*/ if(bytes_read = 0)return cant_message;/*如果字

26、符数组满,返回字符数组满信息*/ else if(bytes_read = sizeof(buffer)return full_message;/*为读取到的信息末尾处添加字符串结束符*/ bufferbytes_read = 0;/*获取cpu个数信息*/ match = strstr(buffer,processor); if(match = NULL)cpuinfo.cpu_number = 0;/*使用sscanf函数获取指定位置的信息*/ sscanf(match,processor : %d,&cpuinfo.cpu_number); *获取cpu指令集信息*/*查找字符数

27、组内是否有flags字串*/ match = strstr(buffer,flags);/*如果没有查找到该字串,返回无法获取指令集*/ if(match = NULL) strcpy(cpuinfo.cpu_flag,cannt get cpu flags!);/*再查找一次,除去字符“:”以免读到指令集信息内*/ match1 = strstr(match,:); match = strstr(match1, ); strcpy(strpt,match);/*应为sscanf函数是只读空格之间的子串,所以选用一个字符一个字符的复制*/ i = 0; while(strpti != n) c

28、puinfo.cpu_flagi = strpti; i+; cpuinfo.cpu_modeli = 0; i = 0; while(cpuinfo.cpu_modeli != 0) cpuinfo.cpu_modeli = cpuinfo.cpu_modeli+1; i+; /*对信息进行格式设置*/strcpy(strpt,处理器个数tt:t);/*把cpu数量转换为字符*/ gcvt(float)cpuinfo.cpu_number+1,1,strchange);/*把cpu数量连接到包含cpu信息的strpt字符串内*/ strcat(strpt,strchange); strcat

29、(strpt,n); strcat(strpt,处理器制造商t:t); strcat(strpt,cpuinfo.cpu_vendor); strcat(strpt,n); /*为strpt字符串添加结束符*/ strcat(strpt,0);通过软件获取的CPU信息如下图11-5所示。图11-5CPU信息显示2. 系统端口信息显示系统端口信息显示读取端口信息从/proc/ioports文件中获取,实现代码如下: char *cant_message = Can not open /proc/ioports!; char *full_message = Buffer array is full

30、!; fp = fopen(/proc/ioports,r); read_bytes = fread(buffer,1,sizeof(buffer),fp); fclose(fp); if(read_bytes = 0) return cant_message; else if(read_bytes = sizeof(buffer) return full_message; bufferread_bytes = 0;/*添加信息的说明,调整信息的格式*/strcpy(ioports,i/o端口范围t登记的设备n);strcat(ioports,buffer);通过软件获取的端口信息如图11-6

31、所示。图11-6端口信息3. 当前进程信息显示当前进程信息显示为进程信息定义了一个结构体,包括进程号、进程占用的内存大小、进程名、进程状态,内容如下:typedef struct unsigned int process_id; unsigned int process_mem; char process_name30; char process_status;process_info; 获取当前进程信息的代码如下:/*遍历当前进程 */*获取该进程的进程号*/mpid = getpid(); sprintf(mname,%u,mpid);/*打开/proc目录*/ dir = opendir

32、(/proc);/*遍历/proc内的目录*/while(ptr = readdir(dir) != NULL) /*如果目录名不是数字,继续遍历*if(!(isdigit(ptr-d_name0) continue;/*如果目录名是当前进程名,继续遍历*/ if(strcmp(mname,ptr-d_name) = 0) continue;/*把数字字符的目录名转换为数字,也就是进程号*/ pname = atoi(ptr-d_name);/*进入该进程的目录,并把文件路径设置为/proc/pid/status*/ strcpy(dirpath,/proc/); strcat(dirpath

33、,ptr-d_name); strcpy(filepath,dirpath); strcat(filepath,/status);/*读取/proc/pid/status中的文件信息 */ cess_id = pname; fp = fopen(filepath,r); bytes_read = fread(buffer,1,sizeof(buffer),fp); fclose(fp); if(bytes_read = 0 | bytes_read = sizeof(buffer) return 0;bufferbytes_read = 0; match = strstr

34、(buffer,Name); if(match = NULL) return 0; sscanf(match,Name : %s,cess_name); /*读取进程使用内存的信息 */ strcpy(dirpath,/proc/); strcat(dirpath,ptr-d_name); strcpy(filepath,dirpath); strcat(filepath,/statm); fp = fopen(filepath,r); bytes_read = fread(buffer,1,sizeof(buffer),fp); fclose(fp); if(bytes

35、_read = 0 | bytes_read = sizeof(buffer) return 0; bufferbytes_read = 0; sscanf(buffer,%u,&(cess_mem);进程信息是使用GTK的TREE_VIEW来控制其显示内容与格式。/*转化进程的状态为中文*/if(cess_status = S) /*为树模型添加信息*/ gtk_list_store_append(store,&iter);/*添加进程号、进程名、进程状态、进程占用的内存信息*/ gtk_list_store_set(store,&

36、amp;iter,COL_ID,cess_id,COL_NAME,cess_name,COL_STATUS,睡眠,COL_MEM,cess_mem,-1); else if(cess_status = Z) gtk_list_store_append(store,&iter); gtk_list_store_set(store,&iter,COL_ID,cess_id,COL_NAME,cess_name, COL_STATUS,僵死,COL_ME

37、M,cess_mem,-1); 通过程序获取的当前进程信息如图11-7所示图11-7进程信息显示11.4.2 11.4.2 内存信息监测实验内存信息监测实验一、一、设计思想设计思想系统内存的监测进程内存的监测图11-8 内存监测框架图二、流程设计1. 系统内存信息监测算法流程图图11-9 系统内存信息监测流程图2. 进程内存信息监测算法流程图图11-10 进程内存信息的监测流程图3. 图形化界面监测内存信息算法流程图图11-11 图形界面内存监测流程图三程序实现1. 系统内存信息监测的实现n 读取相关信息meminfo=fopen(/proc/meminfo, r); /

38、* 打开 /proc/meminfo */ for(;) /* 循环进行,直到读到文件结束 */ fgets(buf,MAIN_BUFFER_LENGTH,meminfo); /*得到meminf信息,并将结果保留在buf中*/ if(feof(meminfo)!=0) break; /* 文件结束,退出循环*/ len=sscanf(buf, %s %ld, name, &val); /* 将buf字符串传递给name,字符串的数据量大小传递给val, 已经成功读取的数据个数存放在len */ if(len=2) /* 如果两个数据都成功读取,将进行下面的操作 */ if(strcm

39、p(name, MemTotal:)=0) MemTotal=val; continue; /*变量name与MemTotal进行比较,如果相等,就把数据量大小传递给val*/ if(strcmp(name, MemFree:)=0) MemFree=val; continue; if(strcmp(name, Buffers:)=0) Buffers=val; continue; if(strcmp(name, Cached:)=0) Cached=val; continue; fclose(meminfo); /* 关闭 /proc/meminfo */n 调整信息的显示格式if(show

40、BufferAdjustLine=1) /* 如果显示BUFFER ADJUST line */ printf(-/+ buffers/cache: %11qd%11qd%11qdn, MemTotal-(MemFree+Slab+Buffers+Cached), MemFree+RSlab+Buffers+Cached, Slab-RSlab); printf(Swap:%15qd%11qd%11qdn, /* 显示SWAP line */ SwapTotal, SwapTotal-SwapFree, SwapFree); n 进入程序时,选择不同分支,可以按照规定的要求进行显示while(

41、option=getopt(argc,argc,”bkmgtTohs:”)!=-1)switch(option) case “o” /* 不显示”-/+ buffers/cache” line */showBufferAdjustLine=0;break;2. 进程内存信息监测的实现p 读取相关信息void read_one_process(pid_t pid,process_state_t *stat) sprintf(buffer,”/proc/%d/stat”,pid); /* 读取单个进程的状态信息到buffer */fd=open(buffer,O_RDONLY); /* 以只读方式

42、打开buffer的内容 */len=read(fd,buffer,sizeof(buffer)-1); /* 返回read读出的字节数 */close(fd); /* 关闭文件描述符 */ p 在终端输入控制信息while(i=getopt(ac,av,”GLSIbinquvs:d:U:o”)=EOF) switch(i) case “I”: /* 显示idle*进程 */ps.idle=!ps.idle;break;p 进程信息显示时,在固定光标处输入命令/* 等待用户输入命令或者时间间隔到,然后执行进程信息的动态显示 */if(select(32,&readfds,(fd_set*)NULL,(fd_set)NULL,(fd_set*)NULL,&timeout)0) clear_message( ); /* 清空信息显示区域 */switch(change) /* 关于读取命令时错误的处理及转化格式请见源代码*/case CMD_delay: /* 设置每次更新进程信息的时间间隔 */new_message(MT_standout,”Seconds to delay:”);/* 显示提示信息*/if(i=readline(tempbuf1,8,Yes)-1) /*输入的时间

温馨提示

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

评论

0/150

提交评论