




已阅读5页,还剩27页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 课程设计目的 掌握linux操作系统的使用方法; 了解linux系统内核代码结构; 掌握实例操作系统的实现方法。 培养良好的自学习惯和能力。2 课程设计内容1 掌握linux操作系统的使用方法,包括键盘命令、系统调用;掌握linux下的编程环境。 编一个c程序,其内容为分窗口同时显示三个并发进程的运行结果。要求用到linux下的图形库。2 掌握linux下添加设备驱动程序的方法。以模块的方式,实现一个虚拟的字符设备驱动程序。 采用模块方法,添加一个新的设备驱动程序 要求添加字符设备的驱动 编写一个应用程序,测试添加的驱动程序3了解和掌握/proc文件的特点和使用方法 了解/proc文件的特点和使用方法; 监控系统状态,显示系统中若干部件使用情况; 用图形界面实现系统监控状态.3. 课程设计过程及源码1、 编一个c程序,其内容为分窗口同时显示三个并发进程的运行结果。要求用到linux下的图形库。程序说明:首先是主程序通过fork() 函数创建新进程,然后通过调用execv 打开新文件以达到并发执行三个程序的目的.子程序则使用了gtk 编程,在一个窗体中放置了一个进度条,加了个文字标签以改善视觉效果./proc1.c#include #include typedef struct _progressdata gtkwidget *window; gtkwidget *pbar; int timer; gboolean activity_mode;progressdata; /*更新进度条,使进度条的移动*/gint progress_timeout( gpointer data ) progressdata *pdata = (progressdata *)data; gdouble new_val; int v; char text20=0%; new_val=gtk_progress_bar_get_fraction(gtk_progress_bar(pdata-pbar)+ 0.01; if (new_val 1.0) new_val = 0.0; v=(int)(new_val*100); strcpy(text,); sprintf(text,%d,v); strcat(text, %); gtk_progress_bar_set_fraction(gtk_progress_bar(pdata-pbar),new_val); gtk_progress_bar_set_text(gtk_progress_bar(pdata-pbar),text); return true;void destroy_progress( gtkwidget *widget,progressdata *pdata) /*退出*/ gtk_timeout_remove (pdata-timer); pdata-timer = 0; pdata-window = null; g_free (pdata); gtk_main_quit ();int main( int argc,char *argv) progressdata *pdata; gtkwidget *align; gtkwidget *separator; gtkwidget *table; gtkwidget *button; gtkwidget *vbox; gtk_init (&argc, &argv);/为传递到回调函数中的数据分配内存 pdata = g_malloc (sizeof (progressdata); pdata-window = gtk_window_new (gtk_window_toplevel); pdata-pbar = gtk_progress_bar_new (); pdata-activity_mode= !pdata-activity_mode; gtk_progress_bar_pulse(gtk_progress_bar (pdata-pbar); gtk_progress_bar_set_fraction(gtk_progress_bar(pdata-pbar),0.00); gtk_progress_bar_set_text(gtk_progress_bar(pdata-pbar),0.00); gtk_container_add (gtk_container (align), pdata-pbar); gtk_widget_show (pdata-pbar);/* 加一个定时器(timer),以更新进度条的值*/ pdata-timer = gtk_timeout_add (100, progress_timeout, pdata); separator = gtk_hseparator_new (); gtk_box_pack_start (gtk_box (vbox), separator, false, false, 0); gtk_widget_show (separator); table = gtk_table_new (2, 2, false); gtk_box_pack_start (gtk_box (vbox), table, false, true, 0); gtk_widget_show (table); button = gtk_button_new_with_label (close); g_signal_connect_swapped (g_object (button), clicked, g_callback (gtk_widget_destroy), pdata-window); gtk_box_pack_start (gtk_box (vbox), button, false, false, 0); gtk_widget_set_flags (button, gtk_can_default); gtk_widget_grab_default (button); gtk_widget_show (button); gtk_widget_show (pdata-window); gtk_main (); return 0;/m_proc1.c#include #include #include #include #include int semid;char *finish;int p1,p2;int main (void)if(p1=fork()=0)/创建新进程execv(./p1,null);elseif(p2=fork()=0)sleep(1);execv(./p2,null);elseif (fork()=0)sleep(2);execv(./p3,null);/打开文件执行 return;运行结果:2、 字符驱动程序程序说明:对于实现字符设备的驱动,首先要挂载字符设备,然后加载设备的驱动程序,然后再调用测试程序进行测试.我们用insmod来挂载驱动,然后使用mknod c 设备名称 设备号来分配设备号,这里c 表示是字符设备.然后我们可以通过dmesg 查看每一步的进展情况.挂载设备成功后,通过lsmod 来查看所有挂载的设备,卸载设备则使用rmmod 设备号.所有这些完成后便可以开始测试了,编写测试程序test.c 包含读设备和写设备.具体操作步骤(在根目录下执行):makeinsmod mydev.ko /挂载设备mknod /dev/mydev c 249 0 /分配设备号gcc o test test.c /编译测试程序./test /运行测试程序rmmod mydev /卸载设备rm /dev/mydev /删除设备号/mydev.c#include #include #include #include #include #include module_license(dual bsd/gpl);int mydev_major = 0;char *buffer= ;ssize_t mydev_write (struct file *filp, const char _user *buf, size_t count,loff_t *pos) int ret; ret=copy_from_user(buffer,buf,count); return 1;/buf是用户进程空间的一个地址.但是在mydev_read被调用时,系统进入核心态./所以不能使用buf这个地址,必须用copy_to_user,这是kernel提供的一个函数,用于向用户传送数据.ssize_t mydev_read(struct file *filp, char _user *buf,size_t count, loff_t *pos) int ret; ret=copy_to_user(buf,buffer,count); return 1;struct file_operations mydev_fops = /系统调用和驱动程序关联起来 .read = mydev_read, .write = mydev_write, .owner = this_module;int mydev_init(void) if(mydev_major=register_chrdev (0, mydev, &mydev_fops)=0) printk(register success!n); return 1; else printk(register failed!n); return 0; void mydev_cleanup(void) unregister_chrdev (mydev_major, mydev);module_init(mydev_init);module_exit(mydev_cleanup);/makefileifneq ($(kernelrelease),) obj-m := mydev.oelse kerneldir ?= /lib/modules/$(shell uname -r)/build pwd := $(shell pwd)default:$(make) -c $(kerneldir) m=$(pwd) modulesendifinstall:sudo insmod mydev.kounstall:sudo rmmod mydevclean:rm -rf *.o *.ko .*.cmd *.mod.c .tmp_versions/test.c#include #include #define maxbuff 1024#define device /dev/mydevint main(void)char buffmaxbuff,buff2maxbuff;int fd;printf(now driver test beginning.n);printf(open device.n);if (fd=open(device,o_rdwr)0)printf(open device is failedn);return 1;elseread(fd,buff,maxbuff);printf(the content of device is readed:n%sn,buff);printf(input something to device whatever you want:n);scanf(%s,buff);printf(write your input to device.n);write(fd,buff,maxbuff);read(fd,buff2,maxbuff);printf(the content of device is readed again:n%sn,buff2);printf(the driver test is ended successfuln);return 0;操作界面演示:1. 挂载后用 cat /proc/devices 查看分配的设备号2. lsmod查看挂载成功的设备3. 用测试程序测试挂载的驱动3、 用gtk做一个系统监视器程序说明:通过/proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。我们要显示系统信息,只需进行相应的文件操作。首先打开相应的文件,读取所需要的信息,将其写入一个缓冲区中,然后将缓冲区的内容加到gtk的相应的控件上面去,最后将控件组合显示即可。源程序:/explorer.c#include#include#include#include#include#include#include#include#include#include#include#include#include#include/系统参数的数据结构typedef struct sys_parameter char hostname22; /主机名char kernel_version33;/内核版本char cpu_model38; /cpu型号char cpu_mhz9;/cpu频率参数char keep_time10; /cpu到目前持续运行时间char total_mem8;/总内存大小char memfree8; /空闲内存大小char buffers8; char cached8; /磁盘缓存大小float mem_userate;/内存利用率float pre_cpu_use_time; /之前cpu使用的总时间float pre_cpu_total_time; float now_cpu_use_time; /当前cpu使用的总时间float now_cpu_total_time; sys_parameter;/系统进程状态的结构typedef struct process_stat char * fname; /父进程号char * level; /进程优先级char * mem_use; /内存使用情况struct process_stat * next; /指向下一个进程状态的指针 process_stat;sys_parameter * sys_parameter = null; gtkwidget * main_window; gtkwidget * main_vbox; gtkwidget * main_notebook; /notebook控件gtkwidget * main_table; /存放notebook的tablegtkwidget * main_frame4; gtkwidget * process_list; /进程列表gtkwidget * keep_time_label; /显示系统持续运行时间的labelgtkwidget * time_label; /显示当前时间的labelgtkwidget * pro_num_label;gtkwidget * entry; /进程号的输入框gtkwidget * cpu_use_label; /显示cpu使用情况的labelgtkwidget * mem_use_label; /显示内存使用情况的labelgdkpixmap * pixmap = null;gtkwidget * drawing_area;gdkpixmap * pixmap1 = null;gtkwidget * drawing_area1;dir * dir; /要打开的目录pid_t selected_process; /被选中的进程号int selected_row;int pro_num;int is_fresh = 1; /设置是否刷新进程信息int fresh_level = 10; /进程信息刷新频率,即多少秒刷新一次int fresh_time = 0; /刷新计时器int cpu60; /用于显示cpu折线图的数组信息int mem60; /用于显示内存折线图的数组信息int pro_flag32768;void dialog_show(char * title, char * text) gtkwidget * dialog;gtkwidget * label;dialog = gtk_dialog_new_with_buttons(title, gtk_window(main_window), gtk_dialog_destroy_with_parent, gtk_stock_close, gtk_response_none, null);gtk_window_set_resizable(gtk_window(dialog), false);g_signal_connect_swapped(dialog, response, g_callback(gtk_widget_destroy), dialog);label = gtk_label_new(text);gtk_widget_show(label);gtk_container_set_border_width(gtk_container(gtk_dialog(dialog)-vbox), 10);gtk_container_add(gtk_container(gtk_dialog(dialog)-vbox),label);gtk_widget_show (dialog);/得到当前所有进程状态void get_process_stat() process_stat * p;struct dirent * ptr;char temp200, tmp200, pro20, stat10, ppid10;gchar * drink4;int i, j, fp;p = (process_stat *)malloc(sizeof(process_stat);dir = opendir(/proc);/循环读取/proc目录下数字目录即进程目录,并将对应进程的部分信息存储到进程信息链表中pro_num = 0;while(ptr = readdir(dir) != null) if(isdigit(ptr-d_name0) & pro_flagatoi(ptr-d_name) sprintf(tmp, /proc/%s/stat0, ptr-d_name);fp = open(tmp, o_rdonly);read(fp, temp, 200);close(fp);/获取进程的所属的运行程序i = 0;while(tempi != ) i+;i += 2;j = 0;while(tempi != ) proj = tempi;i+;j+;proj = 0;drink3 = pro;/获取进程的状态i += 2;j = 0;while(tempi != ) statj = tempi;i+;j+;statj = 0;drink1 = stat;/获取进程的父进程号i+;j = 0;while(tempi != ) ppidj = tempi;i+;j+;ppidj = 0;drink2 = ppid;drink0 = ptr-d_name;gtk_clist_append(gtkclist *)process_list, drink);/在进程列表中添加该进程的信息pro_num+;pro_flagatoi(ptr-d_name) = 0;closedir(dir);return;void get_static_syspara(void) char temp1000, * temp1;int i, fp;/获取主机名fp = open(/proc/sys/kernel/hostname, o_rdonly);read(fp, temp, 200);close(fp);for(i = 0; i hostnamei = tempi;sys_parameter-hostname21 = 0;/获取内核版本fp = open(/proc/version, o_rdonly);read(fp, temp, 200);close(fp);i = 0;while(tempi != () sys_parameter-kernel_versioni = tempi;i+;sys_parameter-kernel_versioni = 0;/获取cpu信息存储到字符串中fp = open(/proc/cpuinfo, o_rdonly);read(fp, temp, 1000);close(fp);/从字符串中得到cpu型号for(i = 0; i cpu_modeli = tempi + 79;sys_parameter-cpu_model37 = 0;/从字符串中得到cpu频率参数for(i = 0; i cpu_mhzi = tempi + 151;sys_parameter-cpu_mhz8 = 0;/获取关于内存的信息fp = open(/proc/meminfo, o_rdonly);read(fp, temp, 1000);close(fp);/获取内存的大小temp1 = strstr(temp, memtotal);for(i = 0; i total_memi = temp1i + 16;sys_parameter-total_mem7 = 0;read(fp, temp, 200);close(fp);i = 0;while(tempi != .) sys_parameter-keep_timei = tempi;i+ ;sys_parameter-keep_timei = 0;/得到cpu当前信息的函数,用于求cpu使用率fp = open(/proc/stat, o_rdonly);read(fp, temp, 200);close(fp);i = 0;while(tempi != ) i+;i += 3;j = 0;while(tempi!= ) /得到user时间temp2j = tempi;i+;j+;temp2j = 0;user = atoi(temp2);j = 0;i += 2;while(tempi!= ) /得到sys时间temp2j = tempi;i+;j+;temp2j = 0;sys = atoi(temp2);j = 0;i+;while(tempi!= ) /得到nice时间temp2j = tempi;i+;j+;temp2j = 0;nice = atoi(temp2);j = 0;i+;while(tempi!= ) /得到idle时间temp2j = tempi;i+;j+;temp1 = strstr(temp, memfree);for(i = 0; i memfreei = temp1i + 16;sys_parameter-memfree7 = 0;/获取活动内存的大小temp3 = strstr(temp, buffers);for(i = 0; i buffersi = temp3i + 16;sys_parameter-buffers7 = 0;/获取活动内存的大小temp4 = strstr(temp, cached);for(i = 0; i cachedi = temp4i + 16;sys_parameter-cached7 = 0;/求内存利用率total_mem = atof(sys_parameter-total_mem);active_mem =total_mem - atof(sys_parameter-memfree) - atof(sys_parameter-buffers) - atof(sys_parameter-cached);sys_parameter-mem_userate = active_mem / total_mem;/显示系统到目前的持续运行时间void draw_keep_time() char hs7 = hours , ms9 = minutes , ss9 = seconds ; char temp3, temp13, keep_time_c35;int i, j;int keep_time, hour, minute, second;float hour_f, minute_f, second_f;keep_time = atoi(sys_parameter-keep_time);hour = keep_time / 3600; /得到运行小时keep_time -= 3600 * hour;minute = keep_time / 60; /得到运行分钟second = keep_time % 60; /得到运行秒hour_f = (float)hour; /下面这些工作都是将时间转化为字符串形式minute_f = (float)minute;second_f = (float)second;i = 0;j = 0;gcvt(hour_f, 2, temp);/将小时转换为字符串while(tempj != 0) keep_time_ci = tempj;i+;j+;for(j = 0; j 7; j+, i+) keep_time_ci = hsj;j = 0;gcvt(minute_f, 2, temp);while(tempj != 0) keep_time_ci = tempj;i+;j+;for(j = 0; j 9; j+, i+) keep_time_ci = msj;j = 0;gcvt(second_f, 2, temp);while(tempj != 0) keep_time_ci = tempj;i+;j+;for(j = 0; j style-white_gc, true, 0, 0, drawing_area-allocation.width, drawing_area-allocation.height);gdk_draw_line(pixmap, drawing_area-style-black_gc, 264, 52, 264, 2);gdk_draw_line(pixmap, drawing_area-style-black_gc, 13, 52, 268, 52);for(i = 0; i style-black_gc, 264, 52 - 10 * i, 268, 52 - 10 * i);for(i = 59; i 0; i-) gdk_draw_line(pixmap, drawing_area-style-black_gc, a, 52 - cpui, a - 4, 52 - cpui - 1);a -= 4;gtk_widget_queue_draw(drawing_area);return true;gboolean draw_mem() int i, a;a = 263;gdk_draw_rectangle(pixmap1, drawing_area1-style-white_gc, true, 0, 0, drawing_area1-allocation.width, drawing_area1-allocation.height);gdk_draw_line(pixmap1, drawing_area1-style-black_gc, 264, 52, 264, 2);gdk_draw_line(pixmap1, drawing_area1-style-black_gc, 13, 52, 268, 52);for(i = 0; i style-black_gc, 264, 52 - 10 * i, 268, 52 - 10 * i);for(i = 59; i 0; i-) gdk_draw_line(pixmap1, drawing_area1-style-black_gc, a, 52 - memi, a - 4, 52 - memi - 1);a -= 4;gtk_widget_queue_draw(drawing_area1);return true;void draw_cpu_userate() char temp10, cpu_userate10 = cpu:;int i;float cpu_userate_num;cpu_userate_num = (sys_parameter-now_cpu_use_time - sys_parameter-pre_cpu_use_time) / (sys_parameter-now_cpu_total_time - sys_parameter-pre_cpu_total_time) * 100;/得到cpu使用率的百分比for(i = 0; i pre_cpu_use_time = sys_parameter-now_cpu_use_time;sys_parameter-pre_cpu_total_time = sys_parameter-now_cpu_total_time;void draw_mem_userate() char temp10, mem_userate10 = mem:;int i;float mem_userate_num;mem_userate_num = sys_parameter-mem_userate * 100; /得到内存使用率的百分比for(i = 0; i 59; i+) memi = memi + 1;mem59 = (int)(mem_userate_num / 2);gcvt(mem_userate_num, 4, temp); /将百分比以字符串形式暂存for(i = 0; i tm_hour);sprintf(temp,%d,p-tm_min);strcat(buf,:);strcat(buf,temp);sprintf(temp,%d,p-tm_sec);strcat(buf,:);strcat(buf,temp);gtk_label_set_text(gtk_label(time_label),buf);return 1;void draw_pro_num()char *s;sprintf(s,%d,pro_num);gtk_label_set_text(gtklabel *)pro_num_label,s);/时间回调函数,更新任务管理器中的动态信息gboolean deal_timeout() /更新动态的系统参数get_dynamic_syspara();/刷新界面上系统持续运行时间draw_keep_time();/刷新界面上cpu使用率draw_cpu_userate();/刷新界面上内存使用率draw_mem_userate();/根据设置刷新进程信息if(is_fresh = 1) fresh_time += fresh_level;if(fresh_time = 20) get_process_stat();fresh_time = 0;return true; void make_frame(char * name, int f_width, int f_heigh
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版研学旅行合同范本知识拓展之旅
- 二零二五版快递物流包装运输优化升级合同
- 二零二五年度数字经济担保合同投标授权保证书
- 2025版有机肥料产品代理采购合同样本
- 二零二五年度文化活动策划服务合同模板
- 二零二五版太阳能光伏零件采购合同
- 二零二五年度中小学信息化教学设备供应合同
- 2025贷款买卖商业房产租赁权买卖合同规范
- 二零二五年度农业机械设备动产质押担保合同
- 二零二五年度大数据分析与信息服务合同标准范本
- 2025年山西省教师职称考试(理论知识)历年参考题库含答案详解(5套)
- 2025年保定高阳县招聘社区工作者考试试题(含答案)
- 火星基地建设方案-洞察及研究
- 【课件】新学期新征程 课件-2025-2026学年高一上学期开学第一课主题班会
- 心里减压培训
- 大健康产业趋势分析
- 工地交通保通方案(3篇)
- 建材公司叉车操作安全培训制度
- 人大换届工作培训课件
- 上海电子信息职业技术学院招聘笔试真题2024
- DB4201T 537-2018 武汉市房屋安全鉴定技术规程
评论
0/150
提交评论