网络操作系统课程设计报告书.docx
- 文档编号:10087908
- 上传时间:2023-02-08
- 格式:DOCX
- 页数:33
- 大小:708.93KB
网络操作系统课程设计报告书.docx
《网络操作系统课程设计报告书.docx》由会员分享,可在线阅读,更多相关《网络操作系统课程设计报告书.docx(33页珍藏版)》请在冰豆网上搜索。
网络操作系统课程设计报告书
一共有4个部分,但最后一个代码量过大,没有写出来,不过我上传到了csdn上,叫“ubuntu下用gtk实现仿windows资源管理器”比较有借鉴意义的可能就是后3个吧。
一、目的
1、掌握Linux操作系统的使用方法;
2、了解Linux系统核代码结构;
3、掌握实例操作系统的实现方法。
二、实验容
1、掌握Linux操作系统的使用方法,包括键盘命令、系统调用;掌握在Linux下的编程环境。
编一个C程序,其容为实现文件拷贝的功能;
编一个C程序,其容为分窗口同时显示三个并发进程的运行结果。
要求用到Linux下的图形库。
2、掌握系统调用的实现过程,通过编译核方法,增加一个新的系统调用。
另编写一个应用程序,调用新增加的系统调用。
实现的功能是:
文件拷贝;
3、掌握增加设备驱动程序的方法。
通过模块方法,增加一个新的设备驱动程序,其功能可以简单。
实现字符设备的驱动
4、了解和掌握/proc文件系统的特点和使用方法
了解/proc文件的特点和使用方法
监控系统状态,显示系统中若干部件使用情况
用图形界面实现系统监控状态。
5、文件系统(选作)
三、系统环境
1、硬件环境:
处理器:
Intel(R) Core(TM)2 Duo CPU T7250 2.00GHz 2.00GHz
存(RAM):
1526MB
2、软件环境:
操作系统:
ubuntu9.10
核版本:
linux2.6.32.10
四、设计与实现
1.1、文件拷贝
文件拷贝函数本身并不是很难,主要是用到了一些现有的函数如fprintf等。
在最开始写这个函数的时候,我只写了打开、创建和拷贝的那一部分,代码量很少,没有过多的去考虑当出现了错误时的情况。
后来我在网上接触到了一些比较优秀的拷贝代码,意识到了对于拷贝失败时的情况要输出错误信息,就增加了比较多的条件判断和错误信息输出,才有了这个最终的版本。
编译时使用的命令:
gcc -o test1_1 test1_1.c
运行时使用的命令:
./test1_1
源代码
#include
#include
#include
#include
#include
#include
#include
#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_read>0)
{
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_write>0)
{
ptr+=bytes_write;
bytes_read-=bytes_write;
}
}
/* 写的时候发生的致命错误 */
if(bytes_write==-1)break;
}
}
close(from_fd);
close(to_fd);
return
(1);
}
1.2、多窗口的并发程序
这里主要是设计了三个窗口,第一个窗口由一个进度条和“close”按钮组成,第二个窗口只有一个文本框不断地计数输出,第三个窗口是第一个窗口和第二个窗口的结合。
程序一共涉与到四个源文件,分别是progress_bar.c、window_text.c、text_bar.c和test1_2.c。
需要分别编译,最后运行test1_2
运行的效果如下:
下面分别列出四个文件的源代码和编译方式
(1)progress_bar.c
编译命令:
gcc -o progress_bar progress_bar.c `pkg-config --cflags --libs gtk+-2.0`
源代码
#include
#include
GtkWidget*window;
GtkWidget*table;
GtkWidget*button;
GtkWidget*progress_bar;
// 更新进度条,这样就能够看到进度条的移动
gintprogress_timeout(gpointerdata){
gdoublevalue;
intv;
chartext[20]="0%";
//使用在调整对象中设置的取值围计算进度条的值
value=gtk_progress_bar_get_fraction(GTK_PROGRESS_BAR(progress_bar))+0.01;
if(value>1.0)
value=0.0;
v=(int)(value*100);
strcpy(text,"");
sprintf(text,"%d",v);
strcat(text,"% ");
// 设置进度条的新值
gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progress_bar),value);
gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progress_bar),text);
//这是一个timeout函数,返回 TRUE,这样它就能够继续被调用
//如果想要结束,可以在进度条到100%时,return0;这样回调函数就会结束
returnTRUE;
}
intmain(intargc,char*argv[]){
inttimer;
gpointerdata;
gtk_init(&argc,&argv);//在任何构件生成之前完成
window=gtk_window_new(GTK_WINDOW_TOPLEVEL);//创建窗口
gtk_window_set_title(GTK_WINDOW(window),"窗口1");//设置窗口标题
gtk_widget_set_usize(window,200,200);//设置窗口大小
gtk_container_set_border_width(GTK_CONTAINER(window),5);//设置窗口边框宽度
gtk_widget_show(window);//显示窗口
gtk_signal_connect(GTK_OBJECT(window),"destroy",GTK_SIGNAL_FUNC(gtk_main_quit),NULL);
table=gtk_table_new(3,5,TRUE);//创建表格3行*5列
gtk_widget_show(table);//显示表格
gtk_container_add(GTK_CONTAINER(window),table);//将table1装进窗口
/* 创建进度条 */
progress_bar=gtk_progress_bar_new();
gtk_table_attach_defaults(GTK_TABLE(table),progress_bar,0,5,0,1);//进度条装进表格
gtk_widget_show(progress_bar);
/* 加一个定时器(timer),以更新进度条的值 */
timer=gtk_timeout_add(100,progress_timeout,data);
/* 添加一个按钮,用来退出应用程序 */
button=gtk_button_new_with_label("close");
gtk_table_attach_defaults(GTK_TABLE(table),button,0,5,2,3);//进度条装进表格
gtk_widget_show(button);
gtk_signal_connect(GTK_OBJECT(button),"clicked",GTK_SIGNAL_FUNC(gtk_main_quit),NULL);
gtk_main();
return0;
}
(2)window_text.c
编译命令:
gcc -o window_text window_text.c `pkg-config --cflags --libs gtk+-2.0`
源代码
#defineGTK_ENABLE_BROKEN
#include
#include
GtkWidget*window;
GtkWidget*table;
GtkWidget*label;
GtkWidget*text;
inti=0;
ginttext_timeout(gpointerdata){
charbuf[20];
chartemp[10];
sprintf(temp,"%d",i);
strcpy(buf,"showtext");
strcat(buf,temp);
strcat(buf,"\n");
//将buf容插入到文本构件中
gtk_text_insert(GTK_TEXT(text),NULL,NULL,NULL,buf,-1);
i++;
//这是一个timeout函数,返回 TRUE,这样它就能够继续被调用
//如果想要结束,可以在进度条到100%时,return0;这样回调函数就会结束
returnTRUE;
}
intmain(intargc,char*argv[]){
GtkWidget*vscrollbar;
inttimer;
gpointerdata;
gtk_init(&argc,&argv);//在任何构件生成之前完成
window=gtk_window_new(GTK_WINDOW_TOPLEVEL);//创建窗口
gtk_window_set_title(GTK_WINDOW(window),"窗口2");//设置窗口标题
gtk_widget_set_usize(window,200,200);//设置窗口大小
gtk_container_set_border_width(GTK_CONTAINER(window),5);//设置窗口边框宽度
gtk_widget_show(window);//显示窗口
gtk_signal_connect(GTK_OBJECT(window),"destroy",GTK_SIGNAL_FUNC(gtk_main_quit),NULL);
table=gtk_table_new(11,10,TRUE);//创建表格11行*10列
gtk_container_add(GTK_CONTAINER(window),table);//将table1装进窗口
gtk_widget_show(table);//显示表格
label=gtk_label_new("ShowText");
gtk_table_attach_defaults(GTK_TABLE(table),label,0,10,0,1);
gtk_widget_show(label);
text=gtk_text_new(NULL,NULL);//创建文本构件
gtk_widget_show(text);//显示文本构件
//将文本构件装进表格
gtk_table_attach_defaults(GTK_TABLE(table),text,0,9,1,11);
//创建滚动条并设置其与文本同步
vscrollbar=gtk_vscrollbar_new(GTK_TEXT(text)->vadj);
gtk_widget_show(vscrollbar);//显示垂直滚动条
gtk_table_attach_defaults(GTK_TABLE(table),vscrollbar,9,10,1,11);//将滚动条装进表格
timer=gtk_timeout_add(1000,text_timeout,data);//调用回调函数,每隔1秒输出一行文本
gtk_main();
return0;
}
(3)text_bar.c
编译命令:
gcc -o text_bar text_bar.c `pkg-config --cflags --libs gtk+-2.0`
源代码
#defineGTK_ENABLE_BROKEN
#include
#include
GtkWidget*window;
GtkWidget*table;
GtkWidget*button;
GtkWidget*progress_bar;
GtkWidget*label;
GtkWidget*text;
inti=0;
ginttext_timeout(gpointerdata){
charbuf[20];
chartemp[10];
sprintf(temp,"%d",i);
strcpy(buf,"showtext_bar");
strcat(buf,temp);
strcat(buf,"\n");
gtk_text_insert(GTK_TEXT(text),NULL,NULL,NULL,buf,-1);
i++;
//这是一个timeout函数,返回 TRUE,这样它就能够继续被调用
//如果想要结束,可以在进度条到100%时,return0;这样回调函数就会结束
returnTRUE;
}
// 更新进度条,这样就能够看到进度条的移动
gintprogress_timeout(gpointerdata){
gdoublevalue;
intv;
chartext[20]="0%";
//使用在调整对象中设置的取值围计算进度条的值
value=gtk_progress_bar_get_fraction(GTK_PROGRESS_BAR(progress_bar))+0.01;
if(value>1.0) value=0.0;
v=(int)(value*100);
strcpy(text,"");
sprintf(text,"%d",v);
strcat(text,"% ");
//设置进度条的新值
gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progress_bar),value);
gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progress_bar),text);
//这是一个timeout函数,返回 TRUE,这样它就能够继续被调用
//如果想要结束,可以在进度条到100%时,return0;这样回调函数就会结束
returnTRUE;
}
intmain(intargc,char*argv[]){
GtkWidget*vscrollbar;
inttimer;
gpointerdata;
gtk_init(&argc,&argv);//在任何构件生成之前完成
window=gtk_window_new(GTK_WINDOW_TOPLEVEL);//创建窗口
gtk_window_set_title(GTK_WINDOW(window),"窗口3");//设置窗口标题
gtk_widget_set_usize(window,400,400);//设置窗口大小
gtk_container_set_border_width(GTK_CONTAINER(window),5);//设置窗口边框宽度
gtk_widget_show(window);//显示窗口
gtk_signal_connect(GTK_OBJECT(window),"destroy",GTK_SIGNAL_FUNC(gtk_main_quit),NULL);
table=gtk_table_new(10,8,TRUE);//创建表格10行*8列
gtk_widget_show(table);//显示表格
gtk_container_add(GTK_CONTAINER(window),table);//将table1装进窗口
label=gtk_label_new("ShowText");
gtk_table_attach_defaults(GTK_TABLE(table),label,0,8,1,2);
gtk_widget_show(label);
text=gtk_text_new(NULL,NULL);//创建文本构件
gtk_widget_show(text);//显示文本构件
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 操作系统 课程设计 报告书