您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 华科操作系统课设报告
华中科技大学操作系统课程设计实验报告专业:计算机科学与技术班级:1101姓名:许阳学号:U201014241一、实验目的掌握Linux操作系统的使用方法;了解Linux系统内核代码结构;掌握实例操作系统的实现方法。二、实验要求1、掌握Linux操作系统的使用方法,包括键盘命令、系统调用;掌握在Linux下的编程环境。编一个C程序,其内容为实现文件拷贝的功能;编一个C程序,其内容为分窗口同时显示三个并发进程的运行结果。要求用到Linux下的图形库。2、掌握系统调用的实现过程,通过编译内核方法,增加一个新的系统调用。另编写一个应用程序,调用新增加的系统调用。实现的功能是:文件拷贝;3、掌握增加设备驱动程序的方法。通过模块方法,增加一个新的设备驱动程序,其功能可以简单。实现字符设备的驱动;4、了解和掌握/proc文件系统的特点和使用方法了解/proc文件的特点和使用方法监控系统状态,显示系统中若干部件使用情况用图形界面实现系统监控状态。5、设计并实现一个模拟的文件系统(选作)三、实验一1、编一个C程序,其内容为实现文件拷贝的功能要实现文件拷贝功能,主要用到的函数是open、write、read。以前在windows下写C语言打开文件常用的fopen,此时不能用,因为fopen是ANSIC标准中的C语言库函数,在不同的系统中应该调用不同的内核api;所以应该直接使用linux中的系统函数open。主要用到的头文件:Unistd.h\\包含了许多Linux系统服务的函数原型,如:read、writeFcntl.h\\定义了很多宏和open,fcntl函数原型Stdio.h\\标准输入输出头文件sys/types.h\\此头文件包含适当时应使用的多个基本派生类型sys/stat.h\\包含了获取文件属性的一些函数errno.h\\用于调试错误代码是所需要的一些errno变量string.h\\包含了处理字符串的一些函数设计思路:由命令行参数获取2个文件名,根据其文件名和路径分别打开该2个文件,设置一个循环,从源文件复制N个字节到目的文件,直到源文件指针到文件尾,最后关闭2个文件。在可能出错的地方需要加上相应的报错代码和中断,并输出错误信息,以方便调试或是往后应用在第2小题中可能发生的错误。理清楚设计思路后,根据需求写出相应的源代码见后页源程序代码scopy.c;在Linux终端使用编译命令gcc–oscopyscopy.c将程序编译并生产exe可执行文件。然后手动创建一个测试文件test.txt,在终端输入命令./scopytest.txttarget.txt这样就能将源文件test.txt复制到目标文件target.txt程序源代码scopy.c:#includeunistd.h#includefcntl.h#includestdio.h#includesys/types.h#includesys/stat.h#includeerrno.h#includestring.h#defineBUFFER_SIZE1024//缓冲区大小intmain(intargc,char**argv){intfrom_fd,to_fd;intbytes_read,bytes_write;charbuffer[BUFFER_SIZE];//设定一个缓冲区char*ptr;if(argc!=3)//三个参数{fprintf(stderr,Usage:%sfromfiletofile\n\a,argv[0]);return(-1);}/*打开源文件*/if((from_fd=open(argv[1],O_RDONLY))==-1){fprintf(stderr,Open%sError:%s\n,argv[1],strerror(errno));return(-1);}/*创建目的文件*/if((to_fd=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1){fprintf(stderr,Open%sError:%s\n,argv[2],strerror(errno));return(-1);}while(bytes_read=read(from_fd,buffer,BUFFER_SIZE)){/*出错*/if((bytes_read==-1)&&(errno!=EINTR))break;elseif(bytes_read0){ptr=buffer;while(bytes_write=write(to_fd,ptr,bytes_read)){/*出错*/if((bytes_write==-1)&&(errno!=EINTR))break;/*写完了所有读的字节*/elseif(bytes_write==bytes_read)break;/*只写了一部分,继续写*/elseif(bytes_write0){ptr+=bytes_write;bytes_read-=bytes_write;}}/*写的时候出错*/if(bytes_write==-1)break;}}close(from_fd);close(to_fd);return(1);}2、编一个C程序,其内容为分窗口同时显示三个并发进程的运行结果。要求用到Linux下的图形库。安装Linux下的GTK+:首先要在Linux下载GTK+相关库文件并安装。在终端输入sudoapt-getinstallgnome-core-devel,然后根据提示操作,就会安装libgtk2.0-devlibglib2.0-dev等开发所需的相关库文件。$sudoapt-getinstallbuild-essential$sudoapt-getinstallgnome-core-devel$sudoapt-getinstallpkg-config$sudoapt-getinstalllibgtk2.0*编译GTK+代码时需要包含的头文件是gtk/gtk.h,此外,还必须连接若干库;比如编译test.c时用以下命令。gcc–otesttest.c`pkg-config--cflags--libsgtk+-2.0`在编写代码时需要用到的控件、窗口等视窗物件形态,用类GtkWidget定义其为指针类型。编写一个GTK+程序的基本步骤如下:初始化Gtk建立控件登记消息与消息处理函数执行消息循环函数gtk_main()之后所设计的3个进程,基本上都是以这样的方式编写代码的,因为之前曾用过OpenGL,所以在这方面掌握的比较快。初始化主要使用的函数有gtk_init(&argc,&argv);//启动GTKgtk_window_new(GTK_WINDOW_TOPLEVEL);//创建窗口gtk_window_set_title(GTK_WINDOW(window),标题名);//设置窗口标题名gtk_widget_set_usize(window,200,200);//设置窗口大小gtk_widget_show(window);//显示窗口建立控件的一般流程/*创建表格准备封装*/gtk_table_new(//创建多少列gintrows,//创建多少栏gintcolumns,//用来决定表格如何来定大小ginthomogeneous);/*这个函数是将表格table,结合到窗口window里*/gtk_container_add(GTK_CONTAINER(window),table);gtk_widget_show(table);//显示该表格/*要把物件放进box中,可用以下函数*/voidgtk_table_attach_defaults(GtkTable*table,//参数(table)是选定某表格GtkWidget*widget,//(child)是想放进去的物件gintleft_attach,//以下参数是指定把物件放在哪里,及用多少个boxesgintright_attach,ginttop_attach,gintbottom_attach);实验截图:实验源代码:process.c:#includegtk/gtk.h#includesys/types.h#includeunistd.hgintprogress_timeout(gpointerpbar){gdoublenew_val;chars[10];new_val=gtk_progress_bar_get_fraction(GTK_PROGRESS_BAR(pbar))+0.01;if(new_val1.0)new_val=0.0;sprintf(s,%.0f%%,new_val*100);gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pbar),new_val);gtk_progress_bar_set_text(GTK_PROGRESS_BAR(pbar),s);returnTRUE;}voiddestroy_progress(GtkWidget*widget){gtk_main_quit();}voidshow(intargc,char*argv[],char*title){GtkWidget*window;GtkWidget*vbox;GtkWidget*pbar;GtkWidget*pbar2;GtkWidget*button;GtkWidget*label;inttimer;charid_char[50];gtk_init(&argc,&argv);window=gtk_window_new(GTK_WINDOW_TOPLEVEL);gtk_window_set_resizable(GTK_WINDOW(window),TRUE);gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);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),0);vbox=gtk_vbox_new(FALSE,10);gtk_container_set_border_width(GTK_CONTAINER(vbox),10);gtk_container_add(GTK_CONTAINER(window),vbox);gtk_widget_show(vbox);sprintf(id_char,本进程ID:%d,getpid());label=gtk_label_new(id_char);gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0);gtk_widget_show(label);sprintf(id_char,父进程ID:%d,getppid());label=gtk_label_new(id_char);gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0);gtk_widget_show(label);pbar=gtk_progress_bar_new();gtk_box_pack_start(GTK_BOX(vbox),pbar,FALSE,FALSE,0);gtk_widget_show(pbar);timer=gtk_timeout_add(100,progress_timeout,pbar);button=gtk_button_new_with_label(close);g_signal_connect_swap
本文标题:华科操作系统课设报告
链接地址:https://www.777doc.com/doc-6954077 .html