当前位置:文档之家› 华科操作系统课设报告

华科操作系统课设报告

华中科技大学操作系统课程设计实验报告专业:计算机科学与技术班级:1101姓名:***学号:U*********一、实验目的掌握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 –o scopy scopy.c将程序编译并生产exe可执行文件。

然后手动创建一个测试文件test.txt ,在终端输入命令./scopy test.txt target.txt这样就能将源文件test.txt复制到目标文件target.txt程序源代码scopy.c:#include <unistd.h>#include <fcntl.h>#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <errno.h>#include <string.h>#define BUFFER_SIZE 1024 //缓冲区大小int main(int argc,char **argv){int from_fd,to_fd;int bytes_read,bytes_write;char buffer[BUFFER_SIZE]; //设定一个缓冲区char *ptr;if(argc!=3) //三个参数{fprintf(stderr,"Usage:%s fromfile tofile\n\a",argv[0]);return(-1);}/* 打开源文件*/if((from_fd=open(argv[1],O_RDONL Y))==-1){fprintf(stderr,"Open %s Error:%s\n",argv[1],strerror(errno));return(-1);}/* 创建目的文件*/if((to_fd=open(argv[2],O_WRONL Y|O_CREAT,S_IRUSR|S_IWUSR))==-1) {fprintf(stderr,"Open %s Error:%s\n",argv[2],strerror(errno));return(-1);}while(bytes_read=read(from_fd,buffer,BUFFER_SIZE)){/* 出错*/if((bytes_read==-1)&&(errno!=EINTR)) break;else if(bytes_read>0){ptr=buffer;while(bytes_write=write(to_fd,ptr,bytes_read)){/* 出错*/if((bytes_write==-1)&&(errno!=EINTR))break;/* 写完了所有读的字节*/else if(bytes_write==bytes_read) break;/* 只写了一部分,继续写*/else if(bytes_write>0){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+相关库文件并安装。

在终端输入sudo apt-get install gnome-core-devel ,然后根据提示操作,就会安装libgtk2.0-dev libglib2.0-dev 等开发所需的相关库文件。

$sudo apt-get install build-essential$sudo apt-get install gnome-core-devel$sudo apt-get install pkg-config$sudo apt-get install libgtk2.0*编译GTK+代码时需要包含的头文件是gtk/gtk.h,此外,还必须连接若干库;比如编译test.c时用以下命令。

gcc –o test test.c `pkg-config --cflags --libs gtk+-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 ( //创建多少列gint rows, //创建多少栏gint columns, //用来决定表格如何来定大小gint homogeneous);/*这个函数是将表格table,结合到窗口window里*/gtk_container_add(GTK_CONTAINER(window),table);gtk_widget_show(table); // 显示该表格/*要把物件放进box中,可用以下函数*/void gtk_table_attach_defaults (GtkTable*table, //参数("table")是选定某表格GtkWidget*widget, //("child")是想放进去的物件gintleft_attach, //以下参数是指定把物件放在哪里, 及用多少个boxesgintright_attach,ginttop_attach,gintbottom_attach);实验截图:实验源代码:process.c:#include <gtk/gtk.h>#include <sys/types.h>#include <unistd.h>gint progress_timeout( gpointer pbar ){gdouble new_val;char s[10];new_val = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pbar)) +0.01;if (new_val > 1.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);return TRUE;}void destroy_progress( GtkWidget *widget){gtk_main_quit ();}void show(int argc,char *argv[],char *title ){GtkWidget *window;GtkWidget *vbox;GtkWidget *pbar;GtkWidget *pbar2;GtkWidget *button;GtkWidget *label;int timer;char id_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_swapped (G_OBJECT (button), "clicked", G_CALLBACK (gtk_widget_destroy), 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 (window);gtk_main ();}int main(int argc, char *argv[]){int pid = fork ();if (pid < 0)printf ("error!\n");else if (pid == 0){int pid = fork ();if (pid < 0)printf ("error!\n");else if (pid == 0)show (argc,argv,"process3");elseshow (argc,argv,"process2"); }elseshow (argc,argv,"process1");}四、实验二Linux内核,简单来说就是一套用来控制计算机最底层的硬件设备,如处理器、内存、硬盘等的一种软件,一般称为操作系统,在Linux术语中称为内核。

相关主题