管道通信操作系统实验报告_第1页
管道通信操作系统实验报告_第2页
管道通信操作系统实验报告_第3页
管道通信操作系统实验报告_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、计算机与信息技术学院综合性、设计性实验报告专业:计算机科学与技术年级 / 班级:08 级计科一班 2010 2011 学年第一学期课程名称计算机操作系统指导教师本组成员学号姓名实验地点计算机学院过街天桥机房 C实验时间2010.11.7区201011.14项目名称管道通信实验类型综合性一、实验目的1、了解什么是管道2、熟悉 UNIX/LINUX支持的管道通信方式二、实验仪器或设备已安装 linux系统的计算机一台三、总体设计(设计原理、设计方案及流程等)设计原理:1、无名管道:一个临时文件。利用pipe( ) 建立起来的无名文件(无路径名)。只用该系统调用所返回的文件描述符来标识该文件,故只有

2、调用 pipe( ) 的进程及其子孙进程才能识别此文件描述符,才能利用该文件(管道)进行通信。当这些进程不再使用此管道时,核心收回其索引结点。它能够连接一个写进程和一个读进程、并允许它们以生产者消费者方式进行通信的一个共享文件,又称为pipe 文件。由写进程从管道的写入端(句柄1)将数据写入管道,而读进程则从管道的读出端(句柄0)读出数据。2、建立一无名管道: pipe()系统调用格式: pipe(pipeID)参数定义:int pipe(pipeID);int pipeID 2;其中,文件描述符pipeID 1是写入端,文件描述符pipeID 0是读出端。该函数使用头文件如下:#includ

3、e #inlcude #include 2、从管道读数据:read( )系统调用格式:read(fd,buf,nbyte)功能:从 fd 所指示的文件中读出 nbyte 个字节的数据,并将它们送至由指针 buf 所指示的缓冲区中。如该文件被加锁,等待,直到锁打开为止。参数定义:int read(fd,buf,nbyte);int fd;char *buf;unsigned nbyte;3、从管道写入数据: write( )系统调用格式: write(fd,buf,nbyte)功能:把 nbyte个字节的数据,从 buf中。如文件加锁,暂停写入,直至开锁。参数定义同 read( )。4、文件锁定

4、: lockf()所指向的缓冲区写到由fd所指向的文件参数定义:int lockf(files,function,size)int files,function;long size;其中, files是文件描述符; function是锁定和解锁, 1 表示锁定, 0 表示解锁;size 是锁定或解锁的字节数,若用0,表示从文件的当前位置到文件尾。设计方案:1、使用 fork()2、使用 pipe()创建两个子进程pid1 和 pid2创建一个无名管道fd , fd0为读出端,fd1为写入端3、定义两个缓冲区4、使用 read() 和OutPipe100 和 InPipe100write()进行

5、管道的读和写,利用lockf()实现对管道的只读或只写5、使用 sleep() 来调整锁定的时间流程:四、实验步骤(包括主要步骤、代码分析等)#include int pid1, pid2; / int main( ) 定义两个进程变量int fd2;/fd1char OutPipe100,InPipe100;pipe(fd);/while(pid1 = fork() = -1);/为写入端, fd0为读出端创建管道创建进程 pid1 ,如果不成功,则空循环if(pid1 = 0)printf(nChild1n);lockf(fd1, 1, 0);/将写入端锁定sprintf(OutPipe,

6、 n Child process 1 is sending message!n);/ 给 OutPipe赋值write(fd1, OutPipe, 50);/将 50 字节的数据从OutPipe所指向的缓冲区写入管道端口fd1sleep(5);/等待读进程读出数据lockf(fd1, 0, 0);exit(0);/结束进程/pid1将写入端解锁elsewhile(pid2 = fork() = -1);if(pid2 = 0)/创建子进程pid2printf(nChild2n);lockf(fd1, 1, 0);sprintf(OutPipe, n Child process 2 is sen

7、ding message!n); write(fd1, OutPipe, 50);sleep(5);lockf(fd1, 0, 0);exit(0);elseprintf(nFather1n);wait(0);/等待子进程1 结束read(fd0, InPipe, 50);/从fd0端口读出50 字节的数据送到 inpipe指向的缓冲区printf(%sn, InPipe); /显示读出的数据printf(nFather2n);wait(0);/等待子进程 2 结束read(fd0, InPipe, 50);printf(%sn, InPipe);exit(0);/父进程结束return 0;

8、五、结果分析与总结运行结果:Child process 1 is sending message!Child process 2 is sending message!实验总结:通过本次实验, 使我对管道有了一个更深层的了解,加深了我对管道的概念。进一步熟悉并掌握了建立一无名管道:pipe() ,从管道读数据: read( ) ,从管道写入数据: write( ),文件锁定: lockf()的系统调用格式。为了协调双方的通信,了解了管道通信机制必须提供以下 3 方面的协调能力: 1、互斥。当一个进程正在对 pipe 进程读 / 写操作时,另一进程必须等待,程序中使用lock(fd1,1,0) 函数实现对管道的加锁操作, 用 lock(fd1,0,0) 解除管道的锁定。 2、同步。当写进程把一定数量的数据写入 pipe 后,便去睡眠等待,直到

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论