操作系统实验报告范文文档格式.docx

上传人:b****1 文档编号:428913 上传时间:2023-04-28 格式:DOCX 页数:88 大小:1.52MB
下载 相关 举报
操作系统实验报告范文文档格式.docx_第1页
第1页 / 共88页
操作系统实验报告范文文档格式.docx_第2页
第2页 / 共88页
操作系统实验报告范文文档格式.docx_第3页
第3页 / 共88页
操作系统实验报告范文文档格式.docx_第4页
第4页 / 共88页
操作系统实验报告范文文档格式.docx_第5页
第5页 / 共88页
操作系统实验报告范文文档格式.docx_第6页
第6页 / 共88页
操作系统实验报告范文文档格式.docx_第7页
第7页 / 共88页
操作系统实验报告范文文档格式.docx_第8页
第8页 / 共88页
操作系统实验报告范文文档格式.docx_第9页
第9页 / 共88页
操作系统实验报告范文文档格式.docx_第10页
第10页 / 共88页
操作系统实验报告范文文档格式.docx_第11页
第11页 / 共88页
操作系统实验报告范文文档格式.docx_第12页
第12页 / 共88页
操作系统实验报告范文文档格式.docx_第13页
第13页 / 共88页
操作系统实验报告范文文档格式.docx_第14页
第14页 / 共88页
操作系统实验报告范文文档格式.docx_第15页
第15页 / 共88页
操作系统实验报告范文文档格式.docx_第16页
第16页 / 共88页
操作系统实验报告范文文档格式.docx_第17页
第17页 / 共88页
操作系统实验报告范文文档格式.docx_第18页
第18页 / 共88页
操作系统实验报告范文文档格式.docx_第19页
第19页 / 共88页
操作系统实验报告范文文档格式.docx_第20页
第20页 / 共88页
亲,该文档总共88页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

操作系统实验报告范文文档格式.docx

《操作系统实验报告范文文档格式.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告范文文档格式.docx(88页珍藏版)》请在冰点文库上搜索。

操作系统实验报告范文文档格式.docx

●用图形界面实现系统监控状态。

5、设计并实现一个模拟的文件系统(选作)

三、设计说明

Linux系统版本12.10

新编译的内核版本3.6.11

虚拟机VMwareFusion3.0

环境MACOSX10.68

实验一

1.编写一个C程序实现文件拷贝的功能

2.编写一个C程序,其内容为分窗口同时显示三个并发进程的运行结果,要求用到Linux下的图形库。

二、实验过程

1.文件拷贝功能

要实现文件拷贝功能,主要用到的函数是open、write、read。

以前在windows下写C语言打开文件常用的fopen,此时不能用,因为fopen是ANSIC标准中的C语言库函数,在不同的系统中应该调用不同的内核api;

所以应该直接使用linux中的系统函数open。

主要用到的头文件:

Unistd.h\\包含了许多Linux系统服务的函数原型,如:

read、write

Fcntl.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

2.分窗口显示并发进程的运行结果

安装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);

//启动GTK

gtk_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,//以下参数是指定把物件放在哪里,及用多少个boxes

gintright_attach,

ginttop_attach,

gintbottom_attach);

三、实验结果

2.分窗口显示并发进程的运行结果

四、源代码

#include<

unistd.h>

fcntl.h>

stdio.h>

sys/types.h>

sys/stat.h>

errno.h>

string.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)

Open%sError:

%s\n"

argv[1],strerror(errno));

/*创建目的文件*/

if((to_fd=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1)

argv[2],strerror(errno));

while(bytes_read=read(from_fd,buffer,BUFFER_SIZE))

/*出错*/

if((bytes_read==-1)&

&

(errno!

=EINTR))break;

elseif(bytes_read>

0)

ptr=buffer;

while(bytes_write=write(to_fd,ptr,bytes_read))

if((bytes_write==-1)&

=EINTR))break;

/*写完了所有读的字节*/

elseif(bytes_write==bytes_read)break;

/*只写了一部分,继续写*/

elseif(bytes_write>

ptr+=bytes_write;

bytes_read-=bytes_write;

/*写的时候出错*/

if(bytes_write==-1)break;

close(from_fd);

close(to_fd);

return

(1);

}

gtk/gtk.h>

gintprogress_timeout(gpointerpbar)

gdoublenew_val;

chars[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);

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,&

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);

父进程ID:

getppid());

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();

intmain(intargc,char*argv[])

intpid=fork();

if(pid<

0)

printf("

error!

\n"

elseif(pid==0)

show(argc,argv,"

process3"

else

process2"

process1"

实验二

掌握系统调用的实现过程,通过编译内核方法,增加一个新的系统调用。

文件拷贝。

1.下载并解压内核

到官方网站http:

//www.kernel.org/下载内核linux-3.6.11.tar.xz,将其放入/usr/src中,打开终端,使用下列命令对其解压:

#tar-xvflinux-3.6.11

该目录用来存放内核的源码。

2.修改内核

首先对系统调用模块添加一个自定义函数helloworld.c,即添加一个新的自定义函数到/arch/x86/kernel中。

在/include/linux/syscalls.h中添加如下代码,进行对系统调用模块的修改

asmlinkageintsys_helloworld(constchar*s_file,constchar*t_file);

接着在arch/x86/syscalls/syscall_32.tbl添加

350i386helloworldsys_helloworld

在arch/x86/kernel/Makefile中添加

obj-y+=helloworld.o

3.编译内核

依次在终端键入以下命令进行对内核的编译,此过程要持续2小时左右

sudoapt-getinstallfakerootbuild-essentialkernel-packagelibncurses5libncurses5-dev

cp/boot/config-3.5.0-17-generic./.config

makemenuconfig

load.config

make-kpkgclean

fakerootmake-kpkg--initrdkernel_imagekernel_headers

4.安装内核

编译完成内核咋终端输入以下命令对内核进行安装

sudodpkg-ilinux-image-3.6.11.Custom_i386.deb

sudodpkg-ilinux-headers-3.6.11.Custom_i386.deb

5.系统调用

使用如下命令实现对系统函数字符拷贝的调用

gcc-otestsys.ctestsys

./testsys

helloworld.c

linux/kernel.h>

linux/export.h>

linux/mm.h>

linux/utsname.h>

linux/mman.h>

linux/reboot.h>

linux/prctl.h>

linux/highuid.h>

linux/fs.h>

linux/kmod.h>

linux/perf_event.h>

linux/resource.h>

linux/kexec.h>

linux/workqueue.h>

linux/capability.h>

linux/device.h>

linux/key.h>

linux/times.h>

linux/posix-timers.h>

linux/security.h>

linux/dcookies.h>

linux/suspend.h>

linux/tty.h>

linux/signal.h>

linux/cn_proc.h>

linux/getcpu.h>

linux/task_io_accounting_ops.h>

linux/seccomp.h>

linux/cpu.h>

linux/personality.h>

linux/ptrace.h>

linux/fs_struct.h>

linux/file.h>

linux/mount.h>

linux/gfp.h>

linux/syscore_ops.h>

linux/version.h>

linux/ctype.h>

linux/compat.h>

linux/syscalls.h>

linux/kprobes.h>

linux/user_namespace.h>

linux/kmsg_dump.h>

/*Movesomewhereelsetoavoidrecompiling?

*/

generated/utsrelease.h>

asm/uaccess.h>

asm/io.h>

asm/unistd.h>

#ifndefSET_UNALIGN_CTL

#defineSET_UNALIGN_CTL(a,b)(-EINVAL)

#endif

#ifndefGET_UNALIGN_CTL

#defineGET_UNALIGN_CTL(a,b)(-EINVAL)

#ifndefSET_FPEMU_CTL

#defineSET_FPEMU_CTL(a,b)(-EINVAL)

#ifndefGET_FPEMU_CTL

#defineGET_FPEMU_CTL(a,b)(-EINVAL)

#ifndefSET_FPEXC_CTL

#defineSET_FPEXC_CTL(a,b)(-EINVAL)

#ifndefGET_FPEXC_CTL

#defineGET_FPEXC_CTL(a,b)(-EINVAL)

#ifndefGET_ENDIAN

#defineGET_ENDIAN(a,b)(-EINVAL)

#ifndefSET_ENDIAN

#defineSET_ENDIAN(a,b)(-EINVAL)

#ifndefGET_TSC_CTL

#defineGET_TSC_CTL(a)(-EINVAL)

#ifndefSET_TSC_CTL

#defineSET_TSC_CTL(a)(-EINVAL)

asmlinkageintsys_helloworld(constchar*s_file,constchar*t_file)

{

//printk("

hello,world!

intbytes_read,bytes_write;

//fileid

intfrom_fd,to_fd;

charbuff

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2