实验目的掌握Linux操作系统的使用方法;了解Linux系统内核代码结构;掌握实例操作系统的实现方法。
一、实验要求1、掌握Linux操作系统的使用方法,包括键盘命令、系统调用;掌握在Linux下的编程环境。
●编一个C程序,其内容为实现文件拷贝的功能;●编一个C程序,其内容为分窗口同时显示三个并发进程的运行结果。
要求用到Linux下的图形库。
2、掌握系统调用的实现过程,通过编译内核方法,增加一个新的系统调用。
另编写一个应用程序,调用新增加的系统调用。
实现的功能是:文件拷贝;3、掌握增加设备驱动程序的方法。
通过模块方法,增加一个新的设备驱动程序,其功能可以简单。
实现字符设备的驱动;4、了解和掌握/proc文件系统的特点和使用方法●了解/proc文件的特点和使用方法●监控系统状态,显示系统中若干部件使用情况●用图形界面实现系统监控状态。
5、设计并实现一个模拟的文件系统(选作)二、实验一1、编一个C程序,其内容为实现文件拷贝的功能要实现文件拷贝功能,主要用到的函数是fopen、fputc、fgetc。
主要用到的头文件:#include <stdio.h>#include <stdlib.h>设计思路:由scanf函数获取2个文件名,根据其文件名和路径分别打开该2个文件,设置一个循环,从源文件复制1个字节到目的文件,直到源文件指针到文件尾,最后关闭2个文件。
在可能出错的地方需要加上相应的报错代码,并输出错误信息,以方便调试。
理清楚设计思路后,首先搭建linux下编程环境。
安装gcc:sudo apt-get install build-essential安装codeblocks:sudo apt-get install codeblocks在集成开发环境Code::Blocks IDE下根据需求写出相应的源代码copy.c,将程序编译并生成exe可执行文件。
然后手动创建一个测试文件test.txt ,运行copy.exe文件,并输入text.txt与target.txt。
这样就能将源文件test.txt复制到目标文件target.txt程序源代码copy.c:#include <stdio.h>#include <stdlib.h>int main(){char a[20],b[20];scanf("%s",a);getchar();scanf("%s",b);FILE *p=NULL,*q=NULL;p=fopen(a,"rb");if(p==NULL){printf("%s default",a);return 0;}q=fopen(b,"wb+");char c;while((c=fgetc(p))!=EOF){fputc(c,q);}printf("copy success");return 0;}2、编一个C程序,其内容为分窗口同时显示三个并发进程的运行结果。
要求用到Linux下的图形库。
安装Linux下的GTK+:sudo apt-get install build-essential这将安装gcc/g++/gdb/make 等基本编程工具sudo apt-get install gnome-core-devel这将安装 libgtk2.0-dev libglib2.0-dev 等开发相关的库文件sudo apt-get install pkg-config用于在编译GTK程序时自动找出头文件及库文件位置sudo apt-get install devhelp这将安装 devhelp GTK文档查看程序sudo apt-get install libglib2.0-doc libgtk2.0-doc这将安装 gtk/glib 的API参考手册及其它帮助文档sudo apt-get install glade libglade2-dev这将安装基于GTK的界面GTK是开发Gnome窗口的c/c++语言图形库sudo apt-get install libgtk2.0*, gtk+2.0所需的所有文件统通下载安装完毕编写一个GTK+程序的基本步骤如下:●初始化Gtk●建立控件●登记消息与消息处理函数●执行消息循环函数gtk_main()初始化主要使用的函数有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);在Code::Blocks IDE创建GTK+工程如下流程:首先在codeblocks选中File,然后选择New,最后Project。
出现如上图所示界面。
在该界面中选中GTK+Project然后Go进入下一步。
继续Next,直到如下图输入工程名称与路径。
然后Next->Finish这样,就创建了一个GTK+工程。
直接运行刚才创建的GTK+工程中的默认程序,得到一个包含2个按钮的窗口界面应用,如下图所示:此时,可以按此模板修改源代码,也可以删除重写。
并发进程:创建3个如上GTK+工程,生成3个不同的exe文件。
if ((p1=fork()) == 0){execv("../1",NULL);}else if ((p2=fork())==0){execv("../2",NULL);}else if ((p3=fork()==0)){execv("../3",NULL);}wait();实验截图:实验源代码:gtk.c:#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <linux/sem.h>#include <linux/shm.h>int main (){pid_t p1,p2,p3;if ((p1=fork()) == 0){execv("/home/linux/Desktop/1/bin/Debug/1",NULL);}else if ((p2=fork())==0){execv("/home/linux/Desktop/2/bin/Debug/2",NULL);}else if ((p3=fork()==0)){execv("/home/linux/Desktop/3/bin/Debug/3",NULL);}wait();return 0;}#include <stdlib.h>#include <gtk/gtk.h>static void helloWorld (GtkWidget *wid, GtkWidget *win){GtkWidget *dialog = NULL;dialog = gtk_message_dialog_new (GTK_WINDOW (win), GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, "1");gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);gtk_dialog_run (GTK_DIALOG (dialog));gtk_widget_destroy (dialog);}int main (int argc, char *argv[]){GtkWidget *button = NULL;GtkWidget *win = NULL;GtkWidget *vbox = NULL;/* Initialize GTK+ */g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, (GLogFunc) gtk_false, NULL);gtk_init (&argc, &argv);g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, g_log_default_handler, NULL);/* Create the main window */win = gtk_window_new (GTK_WINDOW_TOPLEVEL);gtk_container_set_border_width (GTK_CONTAINER (win), 8);gtk_window_set_title (GTK_WINDOW (win), "Hello World");gtk_window_move (GTK_WINDOW (win), 450,320);gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_CENTER); gtk_widget_realize (win);g_signal_connect (win, "destroy", gtk_main_quit, NULL);/* Create a vertical box with buttons */vbox = gtk_vbox_new (TRUE, 6);gtk_container_add (GTK_CONTAINER (win), vbox);button = gtk_button_new_from_stock (GTK_STOCK_DIALOG_INFO);g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (helloWorld), (gpointer) win);gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);button = gtk_button_new_from_stock (GTK_STOCK_CLOSE);g_signal_connect (button, "clicked", gtk_main_quit, NULL);gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);/* Enter the main loop */gtk_widget_show_all (win);gtk_main ();return 0;}三、实验二Linux内核,简单来说就是一套用来控制计算机最底层的硬件设备,如处理器、内存、硬盘等的一种软件,一般称为操作系统,在Linux术语中称为内核。