计算机操作系统-课设.docx

上传人:wux****ua 文档编号:8919276 上传时间:2020-04-01 格式:DOCX 页数:43 大小:2.84MB
返回 下载 相关 举报
计算机操作系统-课设.docx_第1页
第1页 / 共43页
计算机操作系统-课设.docx_第2页
第2页 / 共43页
计算机操作系统-课设.docx_第3页
第3页 / 共43页
点击查看更多>>
资源描述
课 程 设 计 报 告课程名称: 操作系统课程设计 专业班级: 班 学 号: 姓 名: 指导教师: 报告日期: 2016.3.16 计算机科学与技术学院目录课程设计任务书11课程设计目的32课程设计环境搭建32.1整体环境32.2更改root登陆32.3获取内核包32.4安装GTK环境43实验一:熟悉和理解Linux编程环境53.1编一个C程序,其内容为实现文件拷贝的功能53.1.1实验分析53.1.2实验过程63.1.3实验结果63.2分窗口显示三个并发进程运行83.2.1实验分析83.2.2实验过程83.2.3实验结果104实验二:掌握系统调用实现过程114.1实验要求114.2实验分析114.3实验过程114.4实验结果185实验三:掌握增加设备驱动的方法195.1实验要求195.2实验分析195.3实验过程195.4实验结果246实验四:使用GTK/QT实现系统监控器256.1实验要求256.2实验分析256.3实验过程286.4实验结果387课设总结41课程设计任务书一、 课设目的1. 掌握Linux操作系统的使用方法;2. 了解Linux系统内核代码结构;3. 掌握实例操作系统的实现方法。二、 课设内容1. 掌握Linux操作系统的使用方法,包括键盘命令、系统调用;掌握在Linux下的编程环境。a) 编一个C程序,其内容为实现文件拷贝的功能(使用系统调用open/read/write.);b) 编一个C程序,其内容为分窗口同时显示三个并发进程的运行结果。要求用到Linux下的图形库。(gtk/Qt)2. 掌握系统调用的实现过程,通过编译内核方法,增加一个新的系统调用。另编写一个应用程序,调用新增加的系统调用。a) 内核编译、生成,用新内核启动;b) 新增系统调用实现:文件拷贝或P、V操作。3. 掌握增加设备驱动程序的方法。通过模块方法,增加一个新的设备驱动程序,其功能可以简单(实现字符设备的驱动)。4. 了解和掌握/proc文件系统的特点和使用方法(一) 了解/proc文件的特点和使用方法;(二) 监控系统状态,显示系统中若干部件使用情况;(三) 用图形界面实现系统监控状态。5. 设计并实现一个模拟的文件系统(选做)a) 基于一大文件(10M或100M),模拟磁盘;b) 格式化,建立文件系统管理数据结构;c) 基本操作,实现文件、目录相关操作。三、 设计说明实验环境 windows +虚拟机linux或单独Linux分区 linux系统版本 Fedora 5.0 6.0 ubuntu 9.0 10.04 14.04. 内核版本linux-2.6 Linux-2.31 . 四、 考核要求1. 必须独立完成课程设计内容,不分小组不能有相同的拷贝;2. 上机考试:学生根据老师提出的要求,演示所完成的系统;并回答老师的问题;3. 课程设计报告,内容包括:实验目的、实验内容、实验设计、实验环境及步骤、调试记录和程序清单(附注释)。4. 成绩 完成、6065完成、 6575完成、/5 75以上五、 参考资料i. Linux的“man”帮助ii. Linux内核2.4版源代码分析大全iii. Linux内核源代码分析iv. Linux编程白皮书v. 参考网站 www.csdn.net 、www.google.com1 课程设计目的1. 掌握Linux操作系统的使用方法;2. 了解Linux系统内核代码结构;3. 掌握实例操作系统的实现方法。2 课程设计环境搭建2.1 整体环境Windows 10上,使用虚拟机Vmware Workstation软件搭建的Linux平台: Ubuntu kylin 14.04(安装包:ubuntukylin-14.04.2-desktop-amd64.iso) Linux使用内核:linux-3.9.42.2 更改root登陆在现阶段Ubuntu的系统中,是不允许直接以root身份登录系统的,但是在做课设的过程中,需要大量的使用root权限来进行命令的操作。如果以普通用户登录ubuntu,会连编辑一个文件都非常周折。为此,我找到了一种修改系统文件,以达到直接使用root身份登录的方法:开始的时候,只能以普通用户登录,用Ctrl+Alt+T打开终端:初始化/修改root密码sudo passwd root设置登录面板,使其实现root登录进入 /usr/share/lightdm/lightdm.conf.d/编辑: 50-unity-greeter.con添加如下代码,保存退出user-session=ubuntugreeter-show-manual-login=trueall-guest=false然后保存退出,重启系统。之后就可以输入root用户登录。2.3 获取内核包 直接进入网页https:/www.kernel.org/pub/ 进入文件夹/linux/kernel/v3.x 找到安装包linux-3.9.4.tar.xz,并下载 解压命令:tar xjvf linux-source-3.0.0.tar.bz2 C /usr/src 解压后,在/usr/src目录下得到内核文件夹linux-source-3.9.42.4 安装GTK环境 安装gcc/g+/gdb/make 等基本编程工具apt-get install build-essential 如果提示由于依赖项不能安装,需要使用apt的强化版aptitude,这个工具可以自动分析软件包依赖,系统一般不自带,需要先安装,具体过程是:apt-get install aptitudeaptitude install build-essentialaptitude这个工具很强大,对于解决软件包安装时的依赖问题很有帮助。 安装 libgtk2.0-dev libglib2.0-dev 等开发相关的库文件:apt-get install gnome-core-devel 安装GTK核心组件: apt-get install libgtk2.0-dev3 实验一:熟悉和理解Linux编程环境3.1 编一个C程序,其内容为实现文件拷贝的功能3.1.1 实验分析文件拷贝的C程序主要用到如下几个函数:open:打开文件close:关闭文件read:读操作write:写操作open函数有两个形式.如下:int open(const char *pathname,int flags); int open(const char *pathname,int flags,mode_t mode);其中pathname是我们要打开的文件名(包含路径名称,缺省是认为在 当前路径下面),flags可以去下面的一个值或者是几个值的组合,组合使用时候用竖线“|”隔开。flags:O_RDONLY:以只读的方式打开文件. O_WRONLY:以只写的方式打开文件. O_RDWR:以读写的方式打开文件. O_APPEND:以追加的方式打开文件. O_CREAT:创建一个文件. /创建一个不存在的文件。O_TRUNC:如果文件已经存在,则删除文件的内容. mode:S_IRUSR (可读)S_IWUSR (可写)S_IXUSR(可执行)S_IRWXU (可读、写、执行)S_IRGRP (组可以读)S_IROTH (其他人可以读)read、write函数形式如下:read(int fd, const void *buf, size_t length)write(int fd, const void *buf, size_t length)3.1.2 实验过程设置缓冲区:#define BUF_SIZE 1024 /缓冲区大小进行拷贝过程:/* 系统调用创建并打开目标文件 */ if (fin = open( argv1, O_RDONLY) = -1) printf(Error in oen source file!); return -1; /* 系统调用创建并打开目标文件 */ if (fout = open( argv2,O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR) = -1) printf(Error in open target file!); return -1; while(copy_count=read(fin,buf,BUF_SIZE) /* 拷贝文件 */ if (copy_count = -1 | write(fout,buf,copy_count) = -1) printf(Error in copy file!); return -1; 3.1.3 实验结果编译copy.c生成可执行文件copy,执行copy前,源文件source.txt内容如图3-1。图 31文件test.txt见图3-2。图 32执行./copy source.txt test.txt命令后,test.txt内容见图3-3。由图知,文件source.txt的内容正确得完成了拷贝。图 333.2 分窗口显示三个并发进程运行3.2.1 实验分析通俗的讲,程序是一个包含可以执行代码的文件 ,是一个静态的文件。而进程是一个开始执行但是还没有结束的程序的实例。一个程序可能有许多进程,而每一个进程又可以有许多子进程。依次循环下去,而产生子进程。为了区分各个不同的进程,系统给每一个进程分配了一个ID(就象我们的身份证)以便识别。为了充分的利用资源,系统还对进程区分了不同的状态,将进程分为新建,运行,阻塞,就绪和完成五个状态。当一个进程调用了fork以后,系统会创建一个子进程。这个子进程和父进程不同的地方只有他的进程ID和父进程ID,其他的都是一样,就像父进程克隆(clone)自己一样。当然创建两个一模一样的进程是没有意义的。为了区分父进程和子进程,我们必须跟踪fork的返回值. 当fork调用失败的时候(内存不足或者是用户的最大进程数已到)fork返回-1,否则fork的返回值有重要的作用.对于父进程fork返回子进程的ID,而对于fork子进程返回0.我们可以根据这个返回值来区分父子进程。在准备好GTK 2.0的环境之后,GTK程序与编译普通的C程序需要用到不同的命令。编译命令为:gcc xx.c -o xxx pkg-config cflags -libs gtk+-2.0。其中pkgconfig读取GTK附带的.pc文件来决定编译GTK程序需要的编译选项,pkgconfig -cflags gtk+-2.0列出include目录,pkgconfig -libs gtk+-2.0列出编译连接库。3.2.2 实验过程这里需要用到课程实验时的fork( )程序以及GTK的图形显示。 基本fork()程序,调用显示一个父进程和两个子进程的结构如下: if(pid_1=fork()=0) printf(Child 1# is running.n);/第一个子进程 Child 1#show(argc,argv,This is Child 1#);/调用函数显示窗口 else if(pid_2=fork()=0) printf(Child 2# is running.n);/第二个子进程 Child 2# show(argc,argv,This is Child 2#);/调用函数显示窗口 else printf(Parent # is running.n);/父进程 Parent # /由于父进程需要显示全部子进程PID,所以这里直接用参数画窗口 调用GTK显示窗体函数模块的结构:void show(int argc,char *argv ,char *title ) gtk_init (&argc, &argv); /初始化工具包并且获取命令行参数; window = gtk_window_new (GTK_WINDOW_TOPLEVEL); /创建新的窗口; /设定窗口的位置; gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);/监听窗口的destroy事件;g_signal_connect (G_OBJECT (window), destroy,G_CALLBACK (destroy_progress), NULL); gtk_window_set_title (GTK_WINDOW (window), title);/用来设定更改窗口标题; gtk_container_set_border_width (GTK_CONTAINER (window), 20);/设定宽度;/使用gtk_vbox_new函数建立纵向组装盒; /为了显示构件,必须将构件放入组装盒中,并将组装盒放在窗口内; vbox = gtk_vbox_new (FALSE, 10); gtk_container_set_border_width (GTK_CONTAINER (vbox), 100);/设定宽度; gtk_container_add (GTK_CONTAINER (window), vbox); gtk_widget_show (vbox); /使用gtk_box_pack_start函数将构件放到组装盒中; sprintf (id_char, %s ,My ID:%d, title,getpid ();/显示PID号 label = gtk_label_new (id_char); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 10); gtk_widget_show (label); sprintf (id_char, 父进程ID:%d, getppid ();/显示PPID号 label = gtk_label_new (id_char); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 10); gtk_widget_show (label); button = gtk_button_new_with_label (close);/关闭窗口按钮 /信号登记函数,监听按钮的clicked事件。/当窗口clicked时, gtk_widget_destroy 就会被调用。 /而 gtk_widget_destroy 函数又调用 gtk_main_quit() 结束程序运行。 g_signal_connect_swapped (G_OBJECT (button), clicked, G_CALLBACK (gtk_widget_destroy), window); gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 10); GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); gtk_widget_grab_default (button); /函数显示窗口中的组件 gtk_widget_show (button); gtk_widget_show (window); /准备将窗口和所有的组件显示在屏幕上,函数必须在GTK程序的最后调用. gtk_main ();3.2.3 实验结果图 344 实验二:掌握系统调用实现过程4.1 实验要求(1) 内核编译、生成,用新内核启动;(2) 新增系统调用实现:文件拷贝或P、V操作。4.2 实验分析在这一个部分,因为编译内核的原因,投入了比较多的时间。总结起来,主要有这么几个方面: linux内核版本的不同,linux2.X和linux3.X直接添加系统调用和重新编译内核的方法有差异,甚至linux2.X之间,内核文件也有变化。 相关资料的步骤和方法不尽相同,甚至还有互斥的步骤,这就使得这个推进比较漫长。我之前的Ubuntu版本是14.04,内核版本是3.18.0后来编译一遍之后,莫名原因行不通。只好换了一个和网上教程一样的低版本的内核3.9.4,经过自己的实际工作,下面是在运行成功之后,总结的一个过程。(环境和内核配置见本报告第二部分)4.3 实验过程进入内核文件夹/usr/src/linux-3.9.41) 修改Makefile文件,修改系统版本后缀:如下图4-1所示:这里加的是本人的姓名的首字母,以示区分。图 412) 添加系统调用函数,修改文件:/kernel/sys.c,在最后加入新的系统调用函数,拷贝函数实现。如下所示:asmlinkage int sys_zcycopyfile(const char* s_file, const char* t_file) const int BUF_SIZE = 512; int fin,fout; char bufBUF_SIZE; int copy_count; mm_segment_t fs; /段操作的初始化 fs = get_fs(); set_fs(get_ds();/* 系统调用打开源文件,若失败,返回-1 */ if (fin = sys_open(s_file,O_RDONLY,S_IRUSR) = -1) return -1; printk(Error in oen source file!); /* 系统调用创建并打开目标文件,若失败,返回-2 */ if (fout = sys_open(t_file,O_RDWR | O_CREAT | O_TRUNC,S_IRUSR | S_IWUSR) = -1) return -2; printk(Errod in open target file!); while(copy_count=sys_read(fin,buf,BUF_SIZE) /* 拷贝文件,若失败,返回-3 */ if (copy_count = -1 | sys_write(fout,buf,copy_count) = -1) return -3; printk(Error in copy file!); set_fs(fs); /* 段操作结束 */ return 0; 3) 添加系统调用号,修改文件:/arch/x86/syscalls/syscall_32.tbl,在最后加入自定义的系统调用号。如图4-2图 424) 添加声明到头文件,修改头文件:/include/linux/syscalls.h,如图4-3图 43当用户程序需要系统提供服务的时候,比如351号调用sys_zjxcopyfile,就会通过系统调用产生一个int 0x80的软中断,就会进入到系统调用的入口函数,找到这个调用函数表查找入口函数,也就是这里的sys_zjxcopyfile,进而在sys.c中找到具体的函数实现asmlinkage int sys_zcycopyfile(const char* s_file, const char* t_file) ,从而实现系统调用。Tips:内核编译过程由于实验中未截图,引用参考教程截图,链接:http:/www.linuxidc.com/Linux/2013-06/85335p3.htm、5) 配置内核:(先进入解压的内核包文件夹)a) 清除残留的.conf和.o文件:make mrproper图 44 make mrproperb) 安装ncurses环境: apt-get install libncurses5-devncurses是一个能提供基于文本终端窗口功能的动态库, 提供字符终端处理库,包括面板和菜单。c) 对内核选项进行配置make menuconfig执行命令之后,会弹出一个框,提示对内核裁剪或配置。这次用不到变化内核模块,直接用键盘方向键选项就行了。图 45 make menuconfigd) 确定依赖性make dep图 46 确认依赖性e) 删除配置时留下的一些不用文件make clean这一步一般没动作,除非是失败后再次编译内核时要用到。6) 编译内核:a) 编译内核文件bzImage:make bzImage j9这一步耗费的时间比较长,所以加了一个 -j9,这种方法使用多线程编程,实际使用时发现能很大的提高效率。(这个视CPU而定,要看CPU最多支持几个线程)b) 编译内核模块:make modules j9 图 47 make bzImage图 48 make modules7) 安装modulesmake moudules_install8) 建立载入ramdisk的映像文件mkinitramfs -o /boot/initrd-linux3.9.4.img 3.9.4图 49 载入ramdisk的映像文件9) 安装内核make install图 410 make install10) 配置grub引导程序图 411 配置grub11) 重启之后,按esc进入启动项引导界面,如图4-12:图 41212) 进入新系统之后,输入命令uname a / -r查看系统新版本:执行情况如下图4-13所示。可知已经成功的进入到修改后的新内核3.9.4.zjx13) 编写测试程序zcopy.c,如所示:#include #include int main(int argc,char*argv) if(argc!=3) printf(You need to input the file you want to copy!); return 0; int i = syscall(351,argv1,argv2); /*351为系统调用号*/ printf(Now copying.n); if( i = 0 ) printf(Successful!n); else printf(Error!n); return 1;4.4 实验结果编译运行结果如下:图 413 源文件source.txt图 414 待粘贴文件target.txt执行程序后:图 415图 416粘贴后的target.txt5 实验三:掌握增加设备驱动的方法5.1 实验要求掌握增加设备驱动程序的方法。通过模块方法,增加一个新的设备驱动程序,其功能可以简单。如:实现字符设备的驱动5.2 实验分析Linux内核中的设备驱动程序是一组常驻内存的具有特权的共享库,是低级硬件处理例程。对用户程序而言,设备驱动程序隐藏了设备的具体细节,对各种不同设备提供了一致的接口,一般来说是把设备映射为一个特殊的设备文件,用户程序可以象对其它文件一样对此设备文件进行操作。Linux支持3种设备:字符设备、块设备和网络设备。设备由一个主设备号和一个次设备号标识。主设备号唯一标识了设备类型,即设备驱动程序类型,它是块设备表或字符设备表中设备表项的索引。次设备号仅由设备驱动程序解释,一般用于识别在若干可能的硬件设备中,I/O请求所涉及到的那个设备。 一个典型的驱动程序,大体上可以分为这么几个部分: 1) 注册设备:在系统初启,或者模块加载时候,必须将设备登记到相应的设备数组,并返回设备的主设备号; 2) 定义功能函数:对于每一个驱动函数来说,都有一些和此设备密切相关的功能函数。以最常用的块设备或者字符设备来说,都存在着诸如 open()、read()这一类的操作。当系统调用这些调用时,将自动的使用驱动函数中特定的模块。来实现具体的操作;3) 卸载设备:在不用这个设备时,可以将它卸载,主要是从/proc 中取消这个设备的特殊文件。 5.3 实验过程1) 编写Makefile文件如下:ifneq ($(KERNELRELEASE),) #kbuild syntax.mymoudule-bojs := test.oobj-m := fzdriver.o else#PWD为当前目录、KVER为当前内核版本PWD :=$(shell pwd)KVER :=$(shell uname -r)KDIR :=/lib/modules/$(KVER)/buildall:#调用内核模块编译$(MAKE) -C $(KDIR) M=$(PWD)clean:#rm -f *.cmd *.o *.mod *.korm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions#$(MAKE) -C $(KDIR) M=$(PWD) cleanEndif调用Makefile文件之后,其具体过程如下:a) KERNELRELEASE是在内核源码的顶层Makefile中定义的一个变量,在第一次读取执行此Makefile时,KERNELRELEASE没有被定义,所以make将读取执行else之后的内容;b) 如果make的目标是clean,直接执行clean操作,然后结束。c) 当make的目标为all时,-C $(KDIR)指明跳转到内核源码目录下读取那里的Makefile;M=$(PWD) 表明然后返回到当前目录继续读入、执行当前的Makefile。d) 当从内核源码目录返回时,KERNELRELEASE已被定义,内核的build程序Kbuild也被启动去解析kbuild语法的语句,make将继续读取else之前的内容。e) else之前的内容为kbuild语法的语句,指明模块源码中各文件的依赖关系,以及要生成的目标模块名。2) 编写设备功能函数:(fzdriver.c)#include #include #include #include #include #include #define MY_MAJOR 666/定义设备号码char *s1;char *s2;/打开设备int fzdriver_open(struct inode *inode, struct file *filp) printk(.fzdriver_openn); return 0;/读数据ssize_t fzdriver_read(struct file *filp, char _user *buf, size_t count, loff_t *f_pos)sprintf(s2,%s,s1);if(count12)&(!copy_to_user(buf,s2,count) return 0;else if(!copy_to_user(buf,s2,strlen(s2) return 0;else return -1;/写数据ssize_t fzdriver_write(struct file *filp, char _user *buf, size_t count, loff_t *f_pos) if (count0) return -EINVAL; else if (s1=NULL) return -ENOMEM; else if (copy_from_user(s1, buf, count+1) return -EFAULT; else return count;/释放设备int fzdriver_release(struct inode *inode, struct file *filp) printk(.fzdriver_releasen); return 0;struct file_operations fzdriver_fops = .owner = THIS_MODULE, .open = fzdriver_open, .read = fzdriver_read, .write = fzdriver_write, .release = fzdriver_release,;/设备初始化static int fzdriver_init(void) int rc; /分配内存 s1 = (char *)kmalloc(32,GFP_KERNEL); s2 = (char *)kmalloc(64,GFP_KERNEL); printk(.Test fzdriver devn); rc = register_chrdev(MY_MAJOR, fzdriver, &fzdriver_fops); /注册设备 if(rc 0) printk(.register %s dev errorn, fzdriver); /失败返回错误 return -1; printk(.register fzdriver dev OKn); /成功注册 return 0;static void fzdriver_exit(void) unregister_chrdev(MY_MAJOR, fzdriver); /注销设备 printk(.Good Bye!n);MODULE_LICENSE(GPL);module_init(fzdriver_init);module_exit(fzdriver_exit);3) 设备加载,安装过程如下:a) 进入Makefile文件和zcydriver.c文件所在目录,清除make产生的残留文件。命令为:make clean b) 删除先前可能加载过的模块,命令为:rmmod /dev/zcydriverc) 卸载设备:rm /dev/zcydriverd) 编译设备文件,产生模块文件makee) 加载模块insmod zcydriver.kof) 加载设备,分配设别号mknod /dev/zcydriver c 240 0g) 更改用户对设备的操作权限为可读、可写chmod 666 /dev/zcydriver4) 编写测试程序(test.c)#include #include #include #include #include #define DEVICE /dev/fzdriver int main(void)int fd;char out33;char in34;fd = open(/dev/fzdriver, O_RDWR);/打开设备 if(fd = -1) printf(1.启动设备fzdriver失败!n); return -1; memset(out,0,sizeof(out); printf(1.启动设备成功!nn); read(fd,out,sizeof(out); printf(2.设备fzdriver中保存的信息是:n%snn,out); memset(out,0,sizeof(out); printf(3.请输入你想写入到fzdriver的信息:n); fgets(in,34,stdin); write(fd,in,sizeof(in); /将输入写入设备 read(fd,out,sizeof(out); /读出设备的信息并打印 printf(n4.设备fzdriver中的信息被更改为:%sn,out); close(fd);/释放设备图 51 编译过程5.4 实验结果运行测试程序,检验设备是否可读写:检测程序见报告附录的源代码,测试过程如下图5-2、5-3所示:图 52图 536 实验四:使用GTK/QT实现系统监控器6.1 实验要求(1) 了解/proc文件的特点和使用方法;(2) 监控系统状态,显示系统中若干部件使用情况;(3) 用图形界面实现系统监控状态。6.2 实验分析(1) /proc 文件特点: Linux的proc文件系统是进程文件系统和内核文件系统的组成的复合体,是将内核数据对象化为文件形式进行存取的一种内存文件系统,是监控内核的一种用户接口。它拥有一些特殊的文件(纯文本),从中可以获取系统状态信息。 /proc/cpuinfo保存CPU信息,包括名称、型号、数目、主频、Cache等; /proc/version保存操作系统信息,包括系统版本、内核型号、GCC版本等; /proc/stat保存CPU活动信息数据,用来测算CPU使用率; /proc/meminfo保存内存空间和交换空间实时大小,可用来计算内存和交换分区使用率,MemTotal表示内存空间总大小,MemFree表示内存剩余空间大小,SwapTotal表示交换分区总大小,SwapFree表示交换分区剩余空间大小。据此可以算出内存和交换分区的使用率。(2) myExplor结构/* main */*菜单栏*/void Menu_bar(GtkWidget *vbox);void ShowAbout(void);void ShutDown(void);/*状态栏*/gint State_bar(gpointer data);/* 1 */void CreatePageFour(GtkWidget *notebook);void DrawingCPU(void);gint refresh_cpu(gpointer data);static gboolean cpu_expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data);static gboolean cpu_configure_event(GtkWidget *widget, GdkEventConfigure *event, gpointer data);float getCpuUseRatio(int n);void GetCpuInfo();void GetInfo(char *path, char *name, char info);GtkWidget *draw_cpu;GtkWidget *window;GtkWidget *labelofcpu; /cpu rateGtkWidget *infolabel; /cpu infomationGdkPixmap *cpu_graph;/* 全局变量 */static gint cpuPoints100;static gfloat cpu_rate = 0.0;float zuser = 0, ztotal = 0, zidle = 0;char cpuBuffer2000;/* 2 */typedef struct _proc_info_st char name256; char pid20; char state20; char vmsize20; char priority20; char ppid20;proc_info;/*进程信息*/void CreatePageTwo(GtkWidget *notebook);/*进程操作*/gint ShowProcInfo(gpointer data); /显示进程信息void ReadProc(proc_info *ft, const char* path); /读取进程void ReadLine(FILE *fp, char *buff, int bufflen, int line); /读取线程void SearchProcByPID(gpointer data); /PID号查找进程void KillProcess(gpointer data);void ProcessRun(gpointer data); /运行进程void SetEntryInfo(GtkWidget *clist, gint row, gint column, GdkEventButton *event, gpointer data);static GtkWidget *entry;GtkWidget *clist;/* 3 */void CreatePageThree(GtkWidget *notebook);void DrawingMM();void GetMmInfo();int GetValueFromString(char *string);void DrawingSWAP();gint refresh_mm();gint refresh_swap();GtkWidget *draw_mm;GtkWidget *window;GtkWidget *labelofmm;GtkWidget *mminfolabel;GdkPixmap *mm_graph;static gint mmPoints100;static gint swapPoints100;static gfloat mm_rate = 0.0;static gfloat swap_rate = 0.0;gdouble memUseRatio, swapUseRatio;char mmBuffer2000;GtkWidget *window_swap;GtkWidget *draw_swap;GdkPixmap *swap_graph;char swapBuffer200;typedef struct _mem char MemTotal20; char MemFree20; char Buffers20; char Cached20; char SwapCached20; char SwapTotal20; char SwapFree20;mem_info;mem_info memft;/* 4 */*系统信息*/void CreatePageOne(GtkWidget *notebook);/*获得系统时间*/void GetSysTime(char *runtime);gint UpdateSystime(gpointer data);/*/static GtkWidget *notebook;/*笔记本*/static GtkWidget *statusbar; /*状态栏*/6.3 实验过程1) 主体结构int main( int argc,char *argv ) GtkWidget *window; GtkWidget *main_vbox; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window), myExplor); gtk_window_set_default_size(GTK_WINDOW(window), 750, 550); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_widget_show(window); g_signal_connect_swapped(G_OBJECT(window),destroy,G_CALLBACK(gtk_main_quit), NULL); main_vbox = gtk_vbox_new(FALSE, 10); gtk_container_set_border_width(GTK_CONTAINER(main_vbox), 5); gtk_container_add(GTK_CONTAINER(window), main_vbox); gtk_widget_show(main_vbox); Menu_bar(main_vbox); /* 创建一个笔记本,将标签页放在顶部 */ gint context_id; notebook = gtk_notebook_new (); gtk_notebook_set_tab_pos(GtkNotebook *)notebook, GTK_POS_TOP); gtk_notebook_set_show_border(GtkNotebook *) notebook, FALSE); gtk_box_pack_start(GTK_BOX(main_vbox), notebook, TRUE, TRUE, 0); gtk_widget_show(notebook); /*创建一个状态栏*/ statusbar = gtk_statusbar_new(); gtk_box_pack_start(GTK_BOX(main_vbox), statusbar, TRUE, TR
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!