操作系统管道通信课程设计Word格式文档下载.docx
- 文档编号:17216915
- 上传时间:2022-11-29
- 格式:DOCX
- 页数:19
- 大小:161.74KB
操作系统管道通信课程设计Word格式文档下载.docx
《操作系统管道通信课程设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《操作系统管道通信课程设计Word格式文档下载.docx(19页珍藏版)》请在冰豆网上搜索。
鉴于此,本操作系统课程涉及的实验均在Linux环境下进行。
这就要求大家:
(1)熟悉Linux的操作和开发环境;
(2)具有C语言知识(Linux操作系统大约90%的源码是用C语言编写)。
我们的设计和实验将在Windowsxp环境下,基于虚拟机软件VMWare软件进行安装。
学习计算机软件技术,特别是计算机操作系统技术,除了需要刻苦努力外,还需要掌握软件和操作系统的原理与设计技巧。
如何学习和掌握操作系统技术的原理与实际技巧呢?
除了听课和读书之外,最好的方法恐怕就是在实践中练习。
例如,自己设计一个小型操作系统,多使用操作系统,多阅读和分析操作源代码等。
但由于我们的条件和学时有限,在理论学习过程中没有给同学们提供更多的实验机会。
管道通信,通过在两个进程间创建通道,一个写信息通过通道传送给另一个进程并且读出来,同过实践让我们了解了什么是管道通信机制,实现了程序进程间的通信。
积极通过合作,完成任务。
第一章:
系统环境
1.1硬件环境
Intel(R)Core™2DuoCPUE7500@2.93GHz2.00GB内存
1.2软件环境
1)MicrosoftWindowsXPProfessional版本2002ServicePack3
2)VmwareWorkstation10.0.1build-1379776
3)RedHatLinux9
第二章:
设计目的
实践操作系统原理知识,根据题目要求设计、实现进程的管道通信,并且在虚拟机中模拟的linux系统中运行检测。
第三章:
总体设计
3.1程序设计组成框图
无名管道读写示意图
命名管道操作示意图
3.2流程图
3.2.1匿名管道通信C/S流程图
3.2.2命名管道通信C/S流程图
FIFO写进程:
第四章:
详细设计
4.1匿名管道通信
管道用于不同进程间通信。
通常先创建一个管道,再通过fork函数创建一个子进程,该子进程会继承父进程创建的管道。
注意事项:
必须在系统调用fork()前调用pipe(),否则子进程将不会继承文件描述符。
否则,会创建两个管道,因为父子进程共享同一段代码段,都会各自调用pipe(),即建立两个管道,出现异常错误。
父进程通过管道向服务器发布命令,然后由服务器执行命令。
1.fork()
创建一个新进程。
用法:
intfork()
其中返回int取值意义如下:
0:
创建子进程,从子进程返回的id值
>
从父进程返回的子进程id值
-1:
创建失败
2.lockf(files,function,size)
用作锁定文件的某些段或者整个文件。
头文件:
#include<
unistd.h>
参数定义:
intlockf(files,function,size);
intfiles,function;
longsize;
其中:
files是文件描述符;
function是锁定和解锁;
1表示锁定;
0表示解锁;
Size是锁定或解锁的字节数,若用0,表示从文件的当前位置到文件尾。
3.read
功能:
从描述符为filedes的文件读信息。
ssize_tread(intfiledes,void*buff,size_tnbytes);
返回:
读到的字节数,若已到文件尾为0,若出错为-1。
在UNIX/Linux可重定义为:
intread(intfd,char*buff,unsignednbytes);
4.write
向已打开的文件写数据。
ssize_twrite(intfiledes,constvoid*buff,size_tnbytes);
返回值:
若成功为已写入的字节数;
出错为-1。
intwrite(intfd,char*buff,unsignednbytes);
文件位置指针
文件位置指针:
每个打开文件都有一个与其相关联的“当前位移量”。
是从文件开始处计算的字节数。
通常,读、写操作都从当前文件位置处开始,并使位移量增加所读或写的字节数。
按系统默认,当打开一个文件时,除非指定O_APPEND选择项,否则该位移量被设置为0,即指向文件的开始处。
文件位置指针可以通过系统调用lseek来移动。
sys/types.h>
errno.h>
stdio.h>
string.h>
stdlib.h>
/*
*程序入口
**/
intmain()
{
intpipe_fd[2];
pid_tpid;
charbuf_r[100];
char*p_wbuf;
intr_num;
memset(buf_r,0,sizeof(buf_r));
//对较大的结构体或数组进行清零操作的一种最快方法
/*创建管道*/
if(pipe(pipe_fd)<
0)
{
printf("
pipecreateerror\n"
);
return-1;
}
/*创建子进程*/
if((pid=fork())==0)//子进程执行序列
\n"
close(pipe_fd[1]);
//子进程先关闭了管道的写端
sleep
(2);
/*让父进程先运行,这样父进程先写子进程才有内容读*/
if((r_num=read(pipe_fd[0],buf_r,100))>
%dnumbersreadfromthepipeis%s\n"
r_num,buf_r);
close(pipe_fd[0]);
exit(0);
elseif(pid>
0)//父进程执行序列
//父进程先关闭了管道的读端
if(write(pipe_fd[1],"
Hello"
5)!
=-1)
parentwrite1Hello!
Pipe"
parentwrite2Pipe!
waitpid(pid,NULL,0);
/*等待子进程结束*/
return0;
}
4.2命名管道通信
命名管道:
命名管道和无名管道基本相同,但也有不同点:
无名管道只能有父进程使用;
但是通过命名管道,不相关的进程也能交换数据。
客户机实现数据的发送,服务器实现数据接收。
1.创建
用mkfifo或mknod创建一个命名管道。
以mkfifo为例:
#include<
sys/stat.h>
intmkfifo(constchar*fifo_name,mode_tmode);
//成功返回0,否则为-1
2、使用
管道一经创建,就可向普通文件一样使用。
可通过系统调用open,close,read,write,unlink等进行操作。
FIFO读进程:
fcntl.h>
#defineFIFO"
myfifo"
/*程序入口*/
intmain(intargc,char**argv)
intfd;
intnread;
Preparingforreadingbytes...\n"
/*打开管道*/
fd=open(FIFO,O_RDONLY|O_NONBLOCK,0);
if(fd==-1)
perror("
open"
exit
(1);
while
(1)
if((nread=read(fd,buf_r,100))==-1)
if(errno==EAGAIN)
nodatayet\n"
read%sfromFIFO\n"
buf_r);
sleep
(1);
}
/*后面三句话是不会被运行到的,但不会影响程序运行的效果当程序在上面的死循环中执行时收到信号后会马上结束运行而没有执行后面的三句话。
*/
close(fd);
//关闭管道
pause();
//暂停,等待信号
unlink(FIFO);
//删除文件
#defineFIFO_SERVER"
charw_buf[100];
intnwrite;
/*创建有名管道*/
if((mkfifo(FIFO_SERVER,O_CREAT|O_EXCL|O_RDWR)<
0)&
&
(errno!
=EEXIST))
cannotcreatefifoserver\n"
fd=open(FIFO_SERVER,O_WRONLY|O_NONBLOCK,0);
/*入参检测*/
if(argc==1)
Pleasesendsomething\n"
exit(-1);
strcpy(w_buf,argv[1]);
/*向管道写入数据*/
if((nwrite=write(fd,w_buf,100))==-1)
TheFIFOhasnotbeenreadyet.Pleasetrylater\n"
else
write%stotheFIFO\n"
w_buf);
//关闭管道
第五章:
调试与测试
运行匿名管道通信以及运行命名管道通信读进程结果如下:
打开另外一个终端,运行写进程结果如下:
同时读进程结果发生变化如下:
第六章:
设计中遇到的问题及解决方法
1、由于课程涉及UNIX管道通信模式较少,刚开始做课程设计时感觉无从下手,后来通过看书以及上网查询相关资料有些头绪。
2、对于虚拟机与主机的交互搞了好久但是最后结果不理想,也没搞成功,试了用ftp方式相互连接,以及通过VMwareTools也没有成功。
后来,通过问学长和同学终于解决了。
通过此事,我知道知识自己主动探索实践固然好,但学习他人已有的经验学的知识更多更快。
3、对于C语言中open、write等函数掌握的并不好,这是由于长期不联系C语言所致,一门语言要想精通必须通过不断的联系才行。
第七章:
源程序清单和执行结果及分析
任务1:
匿名管道通信
任务2:
命名管道通信
/tmp/myfifo"
第八章:
总结
此次课程设计—管道通信,让我实实在在地锻炼了自己的动手能力,基本操作以熟练掌握。
设计中地任务一比较简单,只是设计一个程序实现管道通信,通过查资料可以顺利完成;
但是任务二—命名管道设计,涉及到了头文件、服务器程序和客户端程序,三者要在同一台计算机中,两个不同的终端上实现通信。
服务器程序设计操作中没有出现什么问题,但是在连接客户端程序时,客户端程序出错,编译出现错误,导致通信出现错误。
通过向老师请教和同学询问,基本有些了解,但还是出现一些解决不了的问题,还需要多加联系然后多查资料,认真克服困难。
通过这次课程设计,我感觉到了,编程还是很有趣的一件事情,这次设计充分锻炼了我的动手能力,思维能力,设计能力,更重要的是合作精神,大家基础都有点差,但可以主动找不足,主动查询资料,询问同学和请教老师,充分体现了新时代新青年的团结和探索精神。
第九章:
参考文献
汤小丹,梁红兵编著·
《计算机操作系统》(第三版)·
西安电子科技大学出版社,2007
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 管道 通信 课程设计