操作系统实验报告范文文档格式.docx
- 文档编号:428913
- 上传时间:2023-04-28
- 格式:DOCX
- 页数:88
- 大小:1.52MB
操作系统实验报告范文文档格式.docx
《操作系统实验报告范文文档格式.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告范文文档格式.docx(88页珍藏版)》请在冰点文库上搜索。
●用图形界面实现系统监控状态。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 报告 范文