管道通信(操作系统课程设计).doc
《管道通信(操作系统课程设计).doc》由会员分享,可在线阅读,更多相关《管道通信(操作系统课程设计).doc(28页珍藏版)》请在沃文网上搜索。
1、操作系统课程设计说明书一、前言课程设计是检测学生课程效果的重要手段,是训练学生通过所学的知识解决实际问题的重要方式,同时也是实践性教学中的一个重要环节,它以某以课程为基础,可以涉及和课程相关的各个方面,是一门独立于课程之外的特殊课程。课程设计是让学生对所学的课程更全面的学习和应用,理解和掌握课程的相关知识。操作系统是一门重要的专业课,是计算机理论和应用的核心。操作系统课程设计,是一次对多学知识的综合演练,要求学生在操作系统的设计理念、整体机构、模块划分、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解,同时,在课程设计方法以及上机操作等基本技能和科学作风方面收到比较系统
2、和严格的训练。在这次的课程设计中我们选择的题目是进程间通信消息机制的设计,实现消息的创建、发送和接收及在server端创建一个服务函数,从而形成C/S通讯模式。消息机制是消息通过消息队列的方式进行进程间消息的传递,通过此次课程设计,全面理解消息机制进程间通信方法。实现把死板的课本知识变得生动有趣,激发了学生的积极性。把学过的计算机操作系统的知识强化,能够把课堂上的知识通过自己设计的程序表示出来。二、目录一、前言1二、目录2三、设计目的与要求31、目的32、要求3四、运行环境41硬件环境:42软件环境:4五、总体设计51、fork()52、lockf()53、read()54、write()65
3、、signal(sig,function)6 6、open()67、getpid()78、Sleep()79、Exit()710、Wait()811.Unlink()8六、详细设计111、匿名管道112、服务器程序133、客户端程序15七、调试与测试17八、设计中遇到的问题及解决方法21九、源程序代码221、管道通信222、客户端程序25十、参考文献27十一、心得体会28三、设计目的与要求1、目的学习计算机软件技术,特别是计算机操作系统技术,除了需要刻苦努力外,还需要掌握软件和操作系统的原理与设计技巧。如何学习和掌握操作系统技术的原理与实际技巧呢?除了听课和读书之外,最好的方法就是在实践中练习
4、。例如,自己设计一个小型系统,多使用操作系统,多阅读和分析操作源代码等。但由于我们的条件和学时有限,在理论学习过程中没有给同学们提供更多的实验机会。本操作系统课程设计,是给同学提供一个集中实验的机会。希望同学们通过该设计加深对所学习课程的理解。2、要求利用UNIX系统提供的管道机制实现进程间的通信。(1)管道通信。利用pipe()和lockf()系统调用,编写程序,实现同族进程间的通信。使用系统调用pipe()建立一条管道线;创建子进程P1、P2、。子进程Pi分别向管道各写信息,而父进程则从管道中读出来自于各子进程的信息,实现进程家族间无名管道通讯。扩展之,使之成为客户/服务器模式,并完成一定
5、的任务(自己定义)。(2)命名管道通信:利用mkfifo(name,mode)或mknod(name,mode,0)创建一个命名管道,然后利用它和文件部分系统调用实现不同进程间的通信。改造之,使之成为客户/服务器模式,并完成一定的任务(自己定义)。四、运行环境1硬件环境:Cpu频率要满足使用需求内存大于2G2软件环境:Windows xp/7/8操作系统装有VMware虚拟机并可正常运行的PCVMware中安装有Linux/Unix系列的操作系统,如fedora,Red Hat等。五、总体设计1、fork()创建一个新进程。用法:int fork()其中返回int取值意义如下:0:创建子进程,
6、从子进程返回的id值0:从父进程返回的子进程id值-1:创建失败2、lockf()用作锁定文件的某些段或者整个文件。头文件:#include参数定义:int lockf(files,function,size);int files,function;long size;其中:files是文件描述符;function是锁定和解锁;1表示锁定;0表示解锁;Size是锁定或解锁的字节数,若用0,表示从文件的当前位置到文件尾。3、read()功能:从描述符为filedes的文件读信息。用法:#include ssize_tread(int filedes, void *buff, size_t nby
7、tes) ;返回:读到的字节数,若已到文件尾为0,若出错为-1。 在UNIX/Linux 可重定义为: intread(int fd, char *buff, unsigned nbytes) ;4、write()功能:向已打开的文件写数据。用法:#include ssize_t write(int filedes, const void * buff, size_t nbytes) ;返回值:若成功为已写入的字节数;出错为-1。intwrite(int fd, char *buff, unsigned nbytes) ;文件位置指针文件位置指针:每个打开文件都有一个与其相关联的“当前位移量”
8、。是从文件开始处计算的字节数。通常,读、写操作都从当前文件位置处开始,并使位移量增加所读或写的字节数。按系统默认,当打开一个文件时,除非指定O_APPEND选择项,否则该位移量被设置为0,即指向文件的开始处。文件位置指针可以通过系统调用lseek来移动。5、signal(sig,function)允许调用进程控制软中断信号的处理。头文件:#include参数定义signal(sig,function)intsig;void(*function)();返回值:成功时返回旧的(以前)函数描述,失败时返回SIG_ERR。说明:信号sig的值在头文件singal.h中有完整定义和描述,可用man 7
9、signal来获得帮助。其中:sig的值是:SIGHUP挂起SIGINT键盘按delete键或break键6、open() open可以打开或创建一个文件,并返回一个文件描述符。 调用方法:#include #include #include int open(const char * pathname, int oflag) ;int open(const char * pathname, int oflag, mode_t mode ) ;返回值:成功时为文件描述符,出错则为-1。open的参数pathname是要打开或创建的文件的名字。oflag参数可用来说明此函数的多个选择项。用下列一
10、个或多个常数进行或运算构成oflag参数(在fcntl.h中): O_RDONLY:只读打开。 O_WRONLY:只写打开。 O_RDWR :读写打开 O_APPEND 追加方式。 O_CREAT 若不存在则创建它。需同时使用第三个参数mode。 O_EXCL 如果同时指定了O_CREAT,而文件已经存在,则出错。这可测试一个文件是否存在,如果不存在则创建此文件成为一个原子操作。 O_TRUNC 如果此文件存在,则将其长度截短为0。 O_NOCTTY 如果pathname指的是终端设备,则不将此设备分配作为此进程的控制终端。 O_NONBLOCK 如果pathname指的是特殊文件,此选择项为
11、此文件的本次打开操作和后续的I / O操作设置非阻塞方式。7、getpid() 功能:取得当前进程pid. 返回值:当前进程pid.8、Sleep() 功能: 执行进程挂起一段时间。9、Exit() 功能:回收进程说占用的资源,实现进程的自我终止。10、Wait() 功能:用于将调用进程挂起,直至其子进程因暂停或终止而发来的软中断信号为止。11.Unlink() 功能:删除一个文件的目录项并减少它的链接数,若成功则返回0,否则返回-1,错误原因存于errno。如果想通过调用这个函数来成功删除文件,你就必须拥有这个文件的所属目录的写和执行权限。任务一:编制一段程序,实现进程的管道通信。使用系统调
12、用pipe()建立一条管道线。两个子进程p1和p2分别向管道各写一句话:child 1 is sending message!child 2 is sending message!而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。任务二:命名管道的通信例子中包括client端和server端。它们源代码文件名称分别为clt.c和svr.c,还有一个公共常量的有关文件被打包在文件fifo_hd.h编译方法是:cc o svr srv.ccc o clt clt.c先启动server端程序,方法为:./svr再换一个终端运行client端,方法是:./clt运行时,client只运行一次
13、就将退出,而server端作为服务器仍将继续运行,你再次启动client来请求服务。任务二、FIFO的用法1、创建用mkfifo或mknod创建一个命名管道。以mkfifo为例:#include#includeint mkfifo(const char *fifo_name, mode_t mode);/成功返回0,否则为-12、使用管道一经创建,就可向普通文件一样使用。可通过系统调用open,close,read,write,unlink等进行操作。管道打开过程中,变量O_NONBLOCK将影响打开后对文件的操作。默认情况下该变量不设置,也就是以阻塞方式打开。这样可以保证原子性操作。(因此可
14、以不考虑该参数。)在操作过程中,如果对一个管道进行写操作write,若对方没有以读方式打开将产生SIGPIPE。你可以捕获此信号进行处理。默认情况下是出现写错误。当最后一个写入者关闭了管道,将产生一个文件结束标志EOF。3、client、server可以以client/server方式使用FIFO。如果一个服务器有多个客户时,每个客户可通过一个well_known FIFO服务器连接。连接后可以通过well_known FIFO向服务器发送请求,所发信息的长度必须PIPE_BUF (4096)。如果客户服务器模式是并发型的话,则客户机不能再通过well_known FIFO回读信息。此时可采用
15、在已连接的客户与服务器之间建立一个私有通讯管道的办法来进行通信。该私有管道被服务器创建后可以以I/O方式打开,用于客户机和服务器之间进行通讯,以完成指定性工作。并发型客户机与服务器之间的通讯模式如图所示。匿名管道: 用户进程fd0 fd1 读 写 管道 命名管道:六、详细设计任务一:编制一段程序,实现进程的管道通信。使用系统调用pipe()建立一条管道线。两个子进程p1和p2分别向管道各写一句话:child 1 is sending message!child 2 is sending message!而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上程序编制一段程序,实现进程的管道通
16、信。使用系统调用pipe()建立一条管道线。两个子进程p1和p2分别向管道各写一句话:child 1 is sending message!child 2 is sending message!而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。1、匿名管道#include#include#includeint pid1,pid2;main()int fd2;char OutPipe100,InPipe100;pipe(fd);while(pid1=fork()=-1);if(pid1=0)lockf(fd1,1,0);sprintf(OutPipe,child 1 process i
17、s sending message!n);write(fd1, OutPipe,50);sleep(5);lockf(fd1,0,0);exit(0); else while(pid2=fork()=-1);if(pid2=0)lockf(fd1,1,0);sprintf(OutPipe,child 2 process is sending message!n);write(fd1,OutPipe,50);sleep(5);lockf(fd1,0,0);exit(0); else wait(0);read(fd0,InPipe,50);printf(%sn,InPipe);wait(0);re
18、ad(fd0,InPipe,50);printf(%sn,InPipe);exit(0);child 1is sending messagechild 2is sending message任务二:命名管道的通信例子中包括client端和server端。它们源代码文件名称分别为clt.c和svr.c,还有一个公共常量的有关文件被打包在文件fifo_hd.h编译方法是:cc o svr srv.ccc o clt clt.c先启动server端程序,方法为:./svr再换一个终端运行client端,方法是:./clt运行时,client只运行一次就将退出,而server端作为服务器仍将继续运行,
19、你再次启动client来请求服务。1、服务器程序#define my_fifo my_fifo#define file_name server.#include#include#include#includevoidterminate();intwell_known_id,tmp_id;chartmp_fil100;main(int argc,char *argv)intfd1,fd2;pid_tpid;charmy_buf100,my_fil100,my_tmp100;sprintf(my_buf,rm -f %s /dev/null,my_fifo);system(my_buf);/do
20、shell cmd rm -f my_fifo /dev/nullwell_known_id=tmp_id=-1;signal(SIGINT,terminate);if(mkfifo(my_fifo,S_IRWXU|S_IRWXG|S_IRWXO)=-1)fprintf(stderr,Create Well_known FIOF Error!n);exit(-1);fprintf(stderr,mkfifo OK!n);fprintf(stderr,A New Seession! Im waiting connection.n);loop1:if(fd1=open(my_fifo,0)=-1)
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
20 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 管道 通信 操作系统 课程设计