操作系统课程设计_第1页
操作系统课程设计_第2页
操作系统课程设计_第3页
操作系统课程设计_第4页
操作系统课程设计_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

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

文档简介

课程实验报告课程名称:操作系统原理课程设计专业班级:学号:姓名指导教师:报告日期:计算机科学与技术学院

目录TOC\o"1-3"\h\u1.实验目的 22.实验环境 23.实验内容 23.1实验一 23.2实验二 23.3实验三 23.4实验四 24.实验设计 34.1实验一 34.1.1文件拷贝 34.1.2并发进程分窗口显示 34.2实验二 3

34.3实验三 34.4实验四 45.实验步骤 45.1实验一 45.1.1文件拷贝 45.1.2并发进程分窗口显示 55.2实验二 95.3实验三 95.4实验四 116.调试记录 147.心得体会 158.程序清单 168.1实验一 168.1.1文件拷贝 168.1.2并发进程窗口显示 168.2实验二 218.3实验三 228.4实验四 24

1.实验目的〔1〕掌握Linux操作系统的使用方法;〔2〕了解Linux系统内核代码结构;〔3〕掌握实例操作系统的实现方法。实验环境本次课程设计采用的操作系统环境是Windows7、Ubuntu双系统,Ubuntu系统版本为15.04,内核版本是Linux3.19。实验内容3.1实验一1)编写一个C程序,用fread、fwrite等库函数实现文件拷贝功能。2)编写一个C程序,使用基于文本的终端图形编程库(curses)或图形界面(QT/GTK〕,分窗口显示三个并发进程的运行(一个窗口实时显示当前时间,一个窗口实时监测CPU的利用率,一个窗口做1到100的累加求和,刷新周期分别为1秒,2秒和3秒)。3.2实验二采用编译内核的方法,添加一个新的系统调用实现文件拷贝功能编写一个应用程序,测试新加的系统调用3.3实验三采用模块方法,添加一个新的字符设备的驱动程序,实现翻开/关闭、读/写等根本操作,编写一个应用程序,测试添加的驱动程序。3.4实验四1)了解/proc文件的特点和使用方法。2)监控系统状态,显示系统部件的使用情况。3)用图形界面监控系统状态,包括CPU和内存利用率、所有进程信息等(可自己补充、添加其他功能)。实验设计4.1实验一4.1.1文件拷贝实现文件拷贝功能需要使用的函数是fopen、fgetc、fputc,由命令行参数获取2个文件名,根据其文件名和路径分别翻开该2个文件,设置循环,使用fgetc和fputc函数每次从源文件复制1个字节到目的文件,直到源文件指针到文件尾,实现文件拷贝操作。4.1.2并发进程分窗口显示使用图形界面GTK实现窗口的显示,使用fork〔〕创立三个并发进程:pid=fork():创立子进程。返回值:0从子进程返回>0从父进程返回exit进程自我终止,进入僵死状态wait()等待进程终止(由父进程调用)exec()执行一个可执行程序(文件)。4.2实验二不同的Linux内核版本编译内核和添加系统调用的方法不尽相同,在网上查阅了资料之后找到适合3.19版本内核的编译方法。所谓系统调用,即Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用,用户可以通过系统调用命令在自己的应用程序中调用它们。其调用机制为:使用存放器中适当的值跳转到内核中事先定义好的代码中执行:跳转到系统调用的总入口system_call,检查系统调用号,再查找系统调用表sys_call_table,调用内核函数,最后返回。实验二目的是更改内核中系统调用模块,增加自定义函数实现文件拷贝功能。

4.3实验三Linux设备驱动程序是一组常驻内存的具有特权的共享库,是低级硬件处理例程,每个设备文件有两个设备号,主设备号标识驱动程序,从设备号表示使用同一个设备驱动程序的不同硬件设备。设备驱动程序的功能包括:对设备初始化和释放,把数据从内核传送到硬件和从硬件读取数据,读取应用程序传给设备文件的数据和回送应用程序请求的数据,检测和处理设备出现的错误。Linux支持的设备包括三种:字符设备、块设备和网络设备。添加设备驱动程序大致需要以下几个步骤:注册设备定义功能函数卸载设备4.4实验四proc文件系统特点:1.进程文件系统和内核文件系统组成的复合体2.将内核数据对象化为文件形式进行存取的一种内存文件系统3.监控内核的一种用户接口,拥有一些特殊的纯文本文件,从中可以获取系统状态信息4.系统信息:与进程无关,随系统配置的不同而不同5.进程信息:系统中正在运行的每一个用户级进程的信息其中各个文件保存的信息如下:/proc/cmd/line:内核启动的命令行/proc/cpuinfo:CPU信息/proc/stat:CPU的使用情况、磁盘、页面、交换、所有的中断、最后一次的启动时间等/proc/meminfo:内存状态的有关信息利用/proc文件获取系统状态信息,并通过GTK图形化编程将系统信息以及通过这些信息计算得出的如CPU利用率、内存使用等通过窗口显示出来。实验步骤5.1实验一5.1.1文件拷贝文件拷贝主要是利用文件指针操作,在源文件和目的文件之间进行字符的复制,拷贝之前要判断源文件是否存在以及能否翻开,这需要设置一个判断语句,同时也要设置判断语句判断目的文件是否存在,假设不存在需要能够创立一个目的文件,最后执行循环拷贝。步骤如下:1.在Linux终端使用编译命令:gccmycopy.c-omycopy产生可执行文件。2.创立源文件wangzihao目的文件shaochongjun。3.编辑源文件:4.翻开可执行程序:./mycopywangzihaoshaochongjun5.查看目的文件发现已经实现拷贝:6.假设源文件不存在会报错:5.1.2并发进程分窗口显示使用fork〔〕函数创立三个进程,使用exec函数族实现程序的调用:调用创立窗口函数init_window(),将进程中的信息在窗口中显示:分别创立三个程序实现显示系统时间、CPU利用率、累加求和功能:运行结果如下:5.2实验二原内核版本:3.19.0编译新内核版本:下载内核并解压系统调用函数实现:修改kernel/sys.c文件,在文件的最后添加新的系统调用函数:sys_mycall(char*sourceFile,char*destFile)设置系统调用号:修改arch/x86/syscalls/syscall_32.tbl,在最后一行添加新的系统调用号添加系统调用声明到头文件

:~$viinclude/asm-generic/syscalls.h在#endif前添#ifndefsys_mycallasmlinkage

long

sys_mycall(long

number);#endif安装根本编译套件:apt-getinstallbuild-essentialkernal-packagelibncurses5-devfakeroot配置内核:makemenuconfig编译内核:make-j4安装内核:makemodules_installmakeinstall重启进入新的内核编写测试程序测试新的系统调用:测试结果如下:5.3实验三编写Makefile文件:编写设备功能函数:(见程序清单)设备加载:makecleanmake加载模块:insmodwzhdriver.ko输入cat/proc/devices得设备驱动的主设备号为:加载设备,分配设备号:mknod/dev/wzhdriverc2480更改操作权限:chmod666/dev/wzhdriver4.运行测试程序,结果:5.4实验四1系统信息页:2进程信息页:3内存资源页:调试记录在编译gtk程序时,需要添加`pkg-config--cflags--libsgtk+-3.0`.参数。实验一程序过于简单,健壮性不大。由于一开始没有参加刷新函数,导致实验一显示窗口数据不变化,在同学帮助下改正。编译内核占用大量时间后来发现在make后添加-j4可以大大提升速度。

心得体会本次课程设计主要目的是熟悉Linux系统,掌握Linux操作系统的使用方法,了解Linux系统内核代码结构,掌握实例操作系统的实现方法。由于刚开始接触Linux,实验的开始遇到了不少困难,GTK的安装和使用花费了我不少时间,并行程序是操作系统课程学过的内容,主要难点是图形化界面的设计。实验二是消耗时间最多的,由于每个版本的内核编译方式不同,消耗了大量时间查找编译内核的方法,同时编译一次内核需要一个小时以上,不过皇天不负有心人最后我成功添加了系统调用。添加设备驱动比拟简单,主要是了解了Linux设备驱动的原理,熟悉设备驱动的安装过程。分析/proc文件主要是搭建图形化界面,在借鉴了网上资源设计的窗口之后,我设计了简单的监控系统图形界面,其中CPU利用率以及占用曲线等需要计算。通过本次实验我学到了很多东西,熟悉了Linux系统的使用方法,对Linux系统内核代码结构有了大致的了解,掌握了图形化界面GTK的使用,总而言之本次试验我获益匪浅。

程序清单8.1实验一8.1.1文件拷贝#include<stdio.h>intmain(intargc,char*argv[]){if(argc!=3){ printf("Errorinargc!\n"); return0;}FILE*fsource=NULL;FILE*ftarget=NULL;if((fsource=fopen(argv[1],"rb"))==NULL){ printf("Failtoopensourcefile!\n"); return0;}if((ftarget=fopen(argv[2],"wb"))==NULL){ printf("Failtoopentargetfile!\n"); return0;}intc;while((c=fgetc(fsource))!=EOF){ fputc(c,ftarget);}fclose(fsource);fclose(ftarget);return0;}8.1.2并发进程窗口显示主函数:#include<sys/types.h>#include<stdio.h>#include<unistd.h>intmain(){ pid_ttime; pid_tcpu; pid_tsum; if((time=fork())==-1) { printf("forkerror\n"); return-1; } if(time==0) { execlp("./time",0); }else { if((cpu=fork())==-1)//createcpu { printf("forkerror\n"); return-1; } if(cpu==0) { execlp("./cpu",0); }else { if((sum=fork())==-1)//createsum { printf("forkerror\n"); return-1; } if(sum==0) { execlp("./sum",0); }else//fatherprocess { wait(&time); wait(&cpu); wait(&sum); } } } }系统时间:#include<time.h>#include<gtk/gtk.h>#include<unistd.h>#include<pthread.h>chart[50];GtkWidget*label;gettime(){time_ttimep;time(&timep);sprintf(t,"%s",ctime(&timep));}void*thread(void*argc){while(1){gettime();gtk_label_set_text(GTK_LABEL(label),t);sleep(1);}}intmain(intargc,char*argv[]){pthread_tid;inti,ret;ret=pthread_create(&id,NULL,(void*)thread,NULL);GtkWidget*vbox; //定义一个组装盒;GtkWidget*window;/*初始化整个GTK+程序,是每一个GTK+程序必不可少的局部*/gtk_init(&argc,&argv);/*这里生成了一个窗口构件——GtkWindow,GTK_WINDOW_TOPLEVEL包含窗口的标题栏和边框,同意用窗口管理器来进行管理*/window=gtk_window_new(GTK_WINDOW_TOPLEVEL);gtk_window_set_title(GTK_WINDOW(window),"time");gtk_window_set_default_size(GTK_WINDOW(window),300,200);gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);label=gtk_label_new(t);gtk_container_add(GTK_CONTAINER(window),label);gtk_widget_show(label);/*开始显示窗口*/gtk_widget_show(window);gtk_main();return0;}CPU利用率:#include<gtk/gtk.h>#include<pthread.h>#include<string.h>GtkWidget*label;//theuserateofcpucharc[5];floatcpu();void*thread(void*arg){ floatusage; while(1) { sleep(2); usage=cpu(); sprintf(c,"theusageofcpuis%f%%",usage); gtk_label_set_text(GTK_LABEL(label),c); }}floatcpu(){ FILE*fp; charbuf[128]; charcpu[5]; longintuser,nice,sys,idle,iowait,irq,softirq; longintall1,all2,idle1,idle2; floatusage; fp=fopen("/proc/stat","r"); if(fp==NULL) printf("error\n"); fgets(buf,sizeof(buf),fp); sscanf(buf,"%s%ld%ld%ld%ld%ld%ld%ld",cpu,&user,&nice,&sys,&idle,&iowait,&irq,&softirq); all1=user+nice+sys+idle+iowait+irq+softirq; idle1=idle; rewind(fp); //second sleep(1); memset(buf,0,sizeof(buf)); cpu[0]='\0'; user=nice=sys=idle=iowait=irq=softirq=0; fgets(buf,sizeof(buf),fp); sscanf(buf,"%s%ld%ld%ld%ld%ld%ld%ld",cpu,&user,&nice,&sys,&idle,&iowait,&irq,&softirq); all2=user+nice+sys+idle+iowait+irq+softirq; idle2=idle; usage=(float)(all2-all1-(idle2-idle1))/(all2-all1)*100; returnusage;}intmain(intargc,char*argv[]){pthread_tid;inti,ret;ret=pthread_create(&id,NULL,(void*)thread,NULL);GtkWidget*window;/*初始化整个GTK+程序,是每一个GTK+程序必不可少的局部*/gtk_init(&argc,&argv);/*这里生成了一个窗口构件——GtkWindow,GTK_WINDOW_TOPLEVEL包含窗口的标题栏和边框,同意用窗口管理器来进行管理*/window=gtk_window_new(GTK_WINDOW_TOPLEVEL);gtk_window_set_title(GTK_WINDOW(window),"cpu");gtk_window_set_default_size(GTK_WINDOW(window),300,200);gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);label=gtk_label_new(c);gtk_container_add(GTK_CONTAINER(window),label);gtk_widget_show(label);/*开始显示窗口*/gtk_widget_show(window);gtk_main();return0;}求和:#include<time.h>#include<gtk/gtk.h>#include<unistd.h>#include<pthread.h>chars[1000];GtkWidget*label;void*thread(void*argc){inti,j,sum;for(i=1,sum=0,j=1;i<=100;i++){sleep(3);sum=sum+j;j+=1;sprintf(s,"%d",sum);gtk_label_set_text(GTK_LABEL(label),s);}}intmain(intargc,char*argv[]){pthread_tid;inti,ret;ret=pthread_create(&id,NULL,(void*)thread,NULL);GtkWidget*vbox; //定义一个组装盒;GtkWidget*window;/*初始化整个GTK+程序,是每一个GTK+程序必不可少的局部*/gtk_init(&argc,&argv);/*这里生成了一个窗口构件——GtkWindow,GTK_WINDOW_TOPLEVEL包含窗口的标题栏和边框,同意用窗口管理器来进行管理*/window=gtk_window_new(GTK_WINDOW_TOPLEVEL);gtk_window_set_title(GTK_WINDOW(window),"sum");gtk_window_set_default_size(GTK_WINDOW(window),300,200);gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);label=gtk_label_new(s);gtk_container_add(GTK_CONTAINER(window),label);gtk_widget_show(label);/*开始显示窗口*/gtk_widget_show(window);gtk_main();return0;}8.2实验二系统调用函数:asmlinkageintsys_mycall(char*sourceFile,char*destFile){intsource=sys_open(sourceFile,O_RDONLY,0);intdest=sys_open(destFile,O_WRONLY|O_CREAT|O_TRUNC,0600);charbuf[4096];mm_segment_tfs;fs=get_fs();set_fs(get_ds());inti;if(source>0&&dest>0){do{i=sys_read(source,buf,4096);sys_write(dest,buf,i);}while(i);}else{printk("Error!");}sys_close(source);sys_close(dest);set_fs(fs);return10;}测试程序:#include<stdio.h>#include<linux/unistd.h>#include<asm/unistd.h>intmain(intargc,char**argv){inti=syscall(359,argv[1],argv[2]);printf("the%d",i);return1;}8.3实验三设备驱动:#include<linux/module.h>#include<linux/init.h>#include<linux/fs.h>#include<asm/uaccess.h>MODULE_LICENSE("GEL");MODULE_AUTHOR("wangzihao");#defineDEV_NAME"wzhdriver"staticssize_tGlobalRead(structfile*,char*,size_t,loff_t*);staticssize_tGlobalWrite(structfile*,constchar*,size_t,loff_t*);staticintchar_major=0;staticintGlobalData=123456;structfile_operationsglobalchar_fops={.read=GlobalRead,.write=GlobalWrite};staticint__initGlobalChar_init(void){intret;ret=register_chrdev(char_major,DEV_NAME,&globalchar_fops);if(ret<0){printk(KERN_ALERT"GlobalCharRegFail!\n");}else{printk(KERN_ALERT"GloblaCharRegSuccess!\n");char_major=ret;printk(KERN_ALERT"Major=%d\n",char_major);}return0;}staticvoid__exitGlobalChar_exit(void){unregister_chrdev(char_major,DEV_NAME);printk(KERN_ALERT"GlobalCharDevisdeadnow!\n");return;}staticssize_tGlobalRead(structfile*filp,char*buf,size_tlen,loff_t*off){//GlobalData-=1;if(copy_to_user(buf,&GlobalData,sizeof(int))){return-EFAULT;}returnsizeof(int);}staticssize_tGlobalWrite(structfile*filp,constchar*buf,size_tlen,loff_t*off){if(copy_from_user(&GlobalData,buf,sizeof(int))){return-EFAULT;}returnsizeof(int);}module_init(GlobalChar_init);module_exit(GlobalChar_exit)测试程序:#include<sys/types.h>#include<sys/stat.h>#include<stdio.h>#include<fcntl.h>#defineDEV_NAME"/dev/wzhdriver"intmain(){intfd,num=9999;fd=open(DEV_NAME,O_RDWR,S_IRUSR|S_IWUSR);if(fd<0){printf("OpenDeviceFailed!\n");return-1;}read(fd,&num,sizeof(int));printf("Thewzhdriveris%d\n",num);printf("inputanumberwrittentowzhdriver:");scanf("%d",&num);write(fd,&num,sizeof(int));read(fd,&num,sizeof(int));printf("Thecharyouinputis%d\n",num);close(fd);return0;}8.4实验四#include<stdio.h>#include<stdlib.h>#include<string.h>#include<gtk/gtk.h>#include<fcntl.h>#include<sys/types.h>#include<sys/stat.h>#include<unistd.h>#include<sys/vfs.h>#include<sys/time.h>#include<dirent.h>char*txt_pid=NULL;char*txt_pid2=NULL;char*meminfo_read(); /*内存使用情况*/char*stat_read(); /*cpu使用率*/char*procsum_read(); /*进程数*/gintmem_refresh(gpointermem_label); /*内存使用情况刷新*/gintcpu_refresh(gpointercpu_label); /*cpu使用率刷新*/gintprocess_refresh(gpointerprocess_label); /*进程数刷新*/gbooleancpu_record_callback(GtkWidget*widget,GdkEventExpose*event,gpointerdata);gbooleanmem_record_callback(GtkWidget*widget,GdkEventExpose*event,gpointerdata);voidcpu_record_draw(GtkWidget*widget);voidmem_record_draw(GtkWidget*widget);staticchartemp_process[50]; /*进程数*/staticchartemp_cpu[50]; /*cpu使用率*/staticchartemp_mem[50]; /*内存使用*/staticlongidle,total; /*计算cpu时的数据*/staticintflag=0; /*计算cpu使用率时启动程序的标志*/staticintflag1=0; /*计算单个进程cpu使用率时使用的标志*/staticlongmem_total; /*内存总大小*/staticlongmem_free; /*空闲内存*/staticlonglongustime[32768]; /*前一次记录的用户态和核心态的总时间*/staticlongmtime[32768]; /*前一次记录的时刻*/staticfloatcpu_used_percent=0; /*cpu使用率*/staticintcpu_start_position=15; /*绘制cpu移动的线条*/staticfloatcpu_data[66]; /*cpu历史数据*/staticintflag2=0; /*初始化cpu_data数组中数据的标志*/staticintcpu_first_data=0; /*第一个数据,既最早的数据,下一个要淘汰的数据*/staticfloatmem_data[66]; /*cpu历史数据*/staticintflag3=0; /*初始化cpu_data数组中数据的标志*/staticintmem_first_data=0; /*第一个数据,既最早的数据,下一个要淘汰的数据*/staticintmem_start_position=15; /*绘制内存移动的线条*/staticGtkWidget*cpu_record_drawing_area;staticGtkWidget*mem_record_drawing_area;staticGtkWidget*notebook; /*笔记本*//////////////////////////////////////////////voidkill_proc(void){charbuf[20]; sprintf(buf,"kill-9%s",txt_pid);system(buf);}gintdelete_event(GtkWidget*widget,GdkEvent*event,gpointerdata){gtk_main_quit();returnFALSE;}char*get_cpu_name(char*_buf1){ FILE*fp; inti=0; char*buf1=_buf1; fp=fopen("/proc/cpuinfo","r"); for(i=0;i<5;i++){ fgets(buf1,256,fp); } for(i=0;i<256;i++){ if(buf1[i]==':')break; } i+=2; buf1+=i; buf1[31]='\0'; fclose(fp); returnbuf1;}char*get_cpu_type(char*_buf2){ FILE*fp; inti=0; char*buf2=_buf2; fp=fopen("/proc/cpuinfo","r"); for(i=0;i<2;i++){ fgets(buf2,256,fp); } for(i=0;i<256;i++){ if(buf2[i]==':')break; } i+=2; buf2+=i; buf2[12]='\0'; fclose(fp); returnbuf2;}char*get_cpu_f(char*_buf3){ FILE*fp; inti=0; char*buf3=_buf3; fp=fopen("/proc/cpuinfo","r"); for(i=0;i<7;i++){ fgets(buf3,256,fp); } for(i=0;i<256;i++){ if(buf3[i]==':')break; } i+=2; buf3+=i; buf3[8]='\0'; fclose(fp); returnbuf3;}char*get_cache_size(char*_buf4){ FILE*fp; inti=0; char*buf4=_buf4; fp=fopen("/proc/cpuinfo","r"); for(i=0;i<8;i++){ fgets(buf4,256,fp); } for(i=0;i<256;i++){ if(buf4[i]==':')break; } i+=2; buf4+=i; buf4[10]='\0'; fclose(fp); returnbuf4;}char*get_system_type(char*_buf1){ FILE*fp;inti=0; char*buf1=_buf1;//fp=fopen("/proc/version","r");fp=fopen("/etc/issue","r");fgets(buf1,256,fp);for(i=0;i<256;i++){ if(buf1[i]=='\\')break; }buf1[i]='\0';fclose(fp);returnbuf1;}char*get_system_version(char*_buf2){ FILE*fp;inti=0;intj=0; char*buf2=_buf2;fp=fopen("/proc/version","r");fgets(buf2,256,fp);for(i=0,j=0;i<256&&j<2;i++){ if(buf2[i]=='')j++; }buf2+=i;for(i=0;i<256;i++){ if(buf2[i]==')')break; }buf2[i+1]='\0';fclose(fp);returnbuf2;}char*get_gcc_version(char*_buf3){ FILE*fp;inti=0;intj=0; char*buf3=_buf3;fp=fopen("/proc/version","r");fgets(buf3,256,fp);for(i=0,j=0;i<256&&j<6;i++){ if(buf3[i]=='')j++; }buf3+=i;for(i=0;i<256;i++){ if(buf3[i]==')')break; }buf3[i+1]='\0';fclose(fp);returnbuf3;}voidget_proc_info(GtkWidget*clist,int*p,int*q,int*r,int*s){DIR*dir;structdirent*ptr;inti,j;FILE*fp;charbuf[1024];char_buffer[1024];char*buffer=_buffer;char*buffer2;charproc_pid[1024];charproc_name[1024];charproc_stat[1024];charproc_pri[1024];charproc_takeup[1024];chartext[5][1024];gchar*txt[5];gtk_clist_set_column_title(GTK_CLIST(clist),0,"PID");gtk_clist_set_column_title(GTK_CLIST(clist),1,"名称"); gtk_clist_set_column_title(GTK_CLIST(clist),2,"状态"); gtk_clist_set_column_title(GTK_CLIST(clist),3,"优先级"); gtk_clist_set_column_title(GTK_CLIST(clist),4,"占用内存");gtk_clist_set_column_width(GTK_CLIST(clist),0,50);gtk_clist_set_column_width(GTK_CLIST(clist),1,100);gtk_clist_set_column_width(GTK_CLIST(clist),2,50);gtk_clist_set_column_width(GTK_CLIST(clist),3,50);gtk_clist_set_column_width(GTK_CLIST(clist),4,55);gtk_clist_column_titles_show(GTK_CLIST(clist));dir=opendir("/proc");while(ptr=readdir(dir)){if((ptr->d_name)[0]>=48&&(ptr->d_name)[0]<=57){(*p)++;sprintf(buf,"/proc/%s/stat",ptr->d_name); fp=fopen(buf,"r");fgets(buffer,1024,fp);fclose(fp);for(i=0;i<1024;i++){ if(buffer[i]=='')break;}buffer[i]='\0';strcpy(proc_pid,buffer);i+=2;buffer+=i;for(i=0;i<1024;i++){ if(buffer[i]==')')break;}buffer[i]='\0';strcpy(proc_name,buffer);i+=2;buffer2=buffer+i;buffer2[1]='\0';strcpy(proc_stat,buffer2);for(i=0,j=0;i<1024&&j<15;i++){ if(buffer2[i]=='')j++;}buffer2+=i;for(i=0;i<1024;i++){ if(buffer2[i]=='')break;}buffer2[i]='\0';strcpy(proc_pri,buffer2);for(j=0;i<1024&&j<4;i++){ if(buffer2[i]=='')j++;}buffer2+=i;for(i=0;i<1024;i++){ if(buffer2[i]=='')break;}buffer2[i]='\0';strcpy(proc_takeup,buffer2);if(!strcmp(proc_stat,"R"))(*q)++;if(!strcmp(proc_stat,"S"))(*r)++; if(!strcmp(proc_stat,"Z"))(*s)++;sprintf(text[0],"%s",proc_pid);sprintf(text[1],"%s",proc_name);sprintf(text[2],"%s",proc_stat);sprintf(text[3],"%s",proc_pri); sprintf(text[4],"%s",proc_takeup); txt[0]=text[0]; txt[1]=text[1]; txt[2]=text[2]; txt[3]=text[3]; txt[4]=text[4];gtk_clist_append(GTK_CLIST(clist),txt);}}closedir(dir);}voidget_module_info(GtkWidget*clist2){ FILE*fp;inti;char_buffer[1024];char*buffer=_buffer;char*buffer2;charmod_name[1024];charmod_takeup[1024];charmod_times[1024]; chartext[3][1024];gchar*txt[3];gtk_clist_set_column_title(GTK_CLIST(clist2),0,"模块名称"); gtk_clist_set_column_title(GTK_CLIST(clist2),1,"占用内存"); gtk_clist_set_column_title(GTK_CLIST(clist2),2,"使用次数"); gtk_clist_set_column_width(GTK_CLIST(clist2),0,150); gtk_clist_set_column_width(GTK_CLIST(clist2),1,150); gtk_clist_set_column_width(GTK_CLIST(clist2),2,150); gtk_clist_column_titles_show(GTK_CLIST(clist2)); fp=fopen("/proc/modules","r");fgets(buffer,1024,fp);while(!feof(fp)){ for(i=0;i<1024;i++){ if(buffer[i]=='')break; } buffer[i]='\0'; strcpy(mod_name,buffer); i++; buffer+=i; for(i=0;i<1024;i++){ if(buffer[i]=='')break; } buffer[i]='\0'; strcpy(mod_takeup,buffer); i++; buffer2=buffer+i; for(i=0;i<1024;i++){ if(buffer2[i]=='')break; } buffer2[i]='\0'; strcpy(mod_times,buffer2); sprintf(text[0],"%s",mod_name); sprintf(text[1],"%s",mod_takeup); sprintf(text[2],"%s",mod_times); txt[0]=text[0]; txt[1]=text[1]; txt[2]=text[2]; gtk_clist_append(GTK_CLIST(clist2),txt); fgets(buffer,1024,fp); } fclose(fp);} /*设置select_row信号的回调函数*/voidselect_row_callback(GtkWidget*clist,gintrow,gintcolumn,GdkEventButton*event,gpointerdata){ gtk_clist_get_text(GTK_CLIST(clist),row,column,&txt_pid); printf("%s\n",txt_pid);}voidselect_row_callback2(GtkWidget*clist,gintrow,gintcolumn,GdkEventButton*event,gpointerdata){ gtk_clist_get_text(GTK_CLIST(clist),row,column,&txt_pid2); printf("%s\n",txt_pid2);}voidrefresh(GtkWidget*clist){DIR*dir;structdirent*ptr;inti,j;FILE*fp;charbuf[1024];char_buffer[1024];char*buffer=_buffer;char*buffer2;charproc_pid[1024];charproc_name[1024];charproc_stat[1024];charproc_pri[1024];charproc_takeup[1024];chartext[5][1024];gchar*txt[5]; gtk_clist_clear(GTK_CLIST(clist));gtk_clist_set_column_title(GTK_CLIST(clist),0,"PID");gtk_clist_set_column_title(GTK_CLIST(clist),1,"名称"); gtk_clist_set_column_title(GTK_CLIST(clist),2,"状态"); gtk_clist_set_column_title(GTK_CLIST(clist),3,"优先级"); gtk_clist_set_column_title(GTK_CLIST(clist),4,"占用内存");gtk_clist_set_column_width(GTK_CLIST(clist),0,50);gtk_clist_set_column_width(GTK_CLIST(clist),1,100);gtk_clist_set_column_width(GTK_CLIST(clist),2,50);gtk_clist_set_column_width(GTK_CLIST(clist),3,50);gtk_clist_set_column_width(GTK_CLIST(clist),4,55);gtk_clist_column_titles_show(GTK_CLIST(clist));dir=opendir("/proc");while(ptr=readdir(dir)){if((ptr->d_name)[0]>=48&&(ptr->d_name)[0]<=57){sprintf(buf,"/proc/%s/stat",ptr->d_name); fp=fopen(buf,"r");fgets(buffer,1024,fp);fclose(fp);for(i=0;i<1024;i++){ if(buffer[i]=='')break;}buffer[i]='\0';strcpy(proc_pid,buffer);i+=2;buffer+=i;for(i=0;i<1024;i++){ if(buffer[i]==')')break;}buffer[i]='\0';strcpy(proc_name,buffer);i+=2;buffer2=buffer+i;buffer2[1]='\0';strcpy(proc_stat,buffer2);for(i=0,j=0;i<1024&&j<15;i++){ if(buffer2[i]=='')j++;}buffer2+=i;for(i=0;i<1024;i++){ if(buffer2[i]=='')break;}buffer2[i]='\0';strcpy(proc_pri,buffer2);for(j=0;i<1024&&j<4;i++){ if(buffer2[i]=='')j++;}buffer2+=i;for(i=0;i<1024;i++){ if(buffer2[i]=='')break;}buffer2[i]='\0';strcpy(proc_takeup,buffer2);sprintf(text[0],"%s",proc_pid);sprintf(text[1],"%s",proc_name);sprintf(text[2],"%s",proc_stat);sprintf(text[3],"%s",proc_pri); sprintf(text[4],"%s",proc_takeup); txt[0]=text[0]; txt[1]=text[1]; txt[2]=text[2]; txt[3]=text[3]; txt[4]=text[4];gtk_clist_append(GTK_CLIST(clist),txt);}}closedir(dir);}voidrefresh2(GtkWidget*clist2){ FILE*fp;inti;char_buffer[1024];char*buffer=_buffer;char*buffer2;charmod_name[1024];charmod_takeup[1024];charmod_times[1024]; chartext[3][1024];gchar*txt[3]; gtk_clist_clear(GTK_CLIST(clist2));gtk_clist_set_column_title(GTK_CLIST(clist2),0,"模块名称"); gtk_clist_set_column_title(GTK_CLIST(clist2),1,"占用内存"); gtk_clist_set_column_title(GTK_CLIST(clist2),2,"使用次数"); gtk_clist_set_column_width(GTK_CLIST(clist2),0,150); gtk_clist_set_column_width(GTK_CLIST(clist2),1,150); gtk_clist_set_column_width(GTK_CLIST(clist2),2,150); gtk_clist_column_titles_show(GTK_CLIST(clist2)); fp=fopen("/proc/modules","r");fgets(buffer,1024,fp);while(!feof(fp)){ for(i=0;i<1024;i++){ if(buffer[i]=='')break; } buffer[i]='\0'; strcpy(mod_name,buffer); i++; buffer+=i; for(i=0;i<1024;i++){ if(buffer[i]=='')break; } buffer[i]='\0'; strcpy(mod_takeup,buffer); i++; buffer2=buffer+i; for(i=0;i<1024;i++){ if(buffer2[i]=='')break; } buffer2[i]='\0'; strcpy(mod_times,buffer2); sprintf(text[0],"%s",mod_name); sprintf(text[1],"%s",mod_takeup); sprintf(text[2],"%s",mod_times); txt[0]=text[0]; txt[1]=text[1]; txt[2]=text[2]; gtk_clist_append(GTK_CLIST(clist2),txt); fgets(buffer,1024,fp); } fclose(fp);}intmain(intargc,char*argv[]){GtkWidget*window;GtkWidget*button1;GtkWidget*button2;GtkWidget*button3;GtkWidget*table;GtkWidget*notebook;GtkWidget*frame;GtkWidget*frame2;GtkWidget*frame3;GtkWidget*vbox;GtkWidget*hbox;GtkWidget*label;GtkWidget*clist,*clist2;GtkWidget*scrolled_window;GtkWidget*capability; /*内存资源*/GtkWidget*cpu_record; /*cpu曲线图*/GtkWidget*mem_record; /*内存曲线图*/GtkWidget*cpu_hbox; /*容纳cpu两个图*/GtkWidget*mem_hbox; /*容纳mem两个图*/GtkWidget*process_label; /*进程数*/GtkWidget*cpu_label; /*cpu使用率*/GtkWidget*mem_label; /*内存使用情况*/charbufferf1[1000];charbufferf2[1000];charbufferf3[1000];charbufferl[20];charbuf1[256],buf2[256],buf3[256],buf4[256];floattemp[3]={0.0,0.0,0.0};intp=0,q=0,r=0,s=0;gtk_init(&argc,&argv);window=gtk_window_new(GTK_WINDOW_TOPLEVEL);gtk_window_set_title(GTK_WINDOW(window),"sysmanage");gtk_widget_set_size_request(window,550,600);g_signal_connect(G_OBJECT(window),"delete_event", G_CALLBACK(delete_event),NULL);gtk_container_set_border_width(GTK_CONTAINER(window),10);table=gtk_table

温馨提示

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

评论

0/150

提交评论