实验三 进程的管道通信实验_第1页
实验三 进程的管道通信实验_第2页
实验三 进程的管道通信实验_第3页
实验三 进程的管道通信实验_第4页
实验三 进程的管道通信实验_第5页
已阅读5页,还剩10页未读, 继续免费阅读

下载本文档

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

文档简介

1、实验3过程的管道通信第一,实验目的(1)了解什么是管道(2)熟悉UNIX/LINUX支持的管道通信模式第二,实验时间4小时三、实验内容编写程序实现进程的流水线通信。使用系统调用管道()来建立一个管道,两个子流程P1和P2分别给管道写一个句子:孩子1正在发送消息!孩子2正在发送消息!父进程从管道中读取子进程的两条消息并显示它们(首先需要接收P1,然后是P2)。第四,实验指导首先,什么是管道UNIX系统在操作系统开发中最重要的贡献之一是它开创了管道。这也是UNIX系统的一个主要特性。所谓的管道指的是一个共享文件,它可以连接一个写进程和一个读进程,并允许它们以生产者-消费者的方式进行通信,也称为管道

2、文件。写进程从写端(句柄1)将数据写入流水线,而读进程从读端(句柄0)读取数据。处理fd0处理fd1阅读结束写结束第二,管道的类型:1.著名的管道路径名可以在文件系统中长期存在的文件。用系统调用mknod()进行设置。它克服了匿名管道的局限性,使更多的进程通过管道进行通信。因此,其他进程可以知道它的存在,并通过使用路径名来访问文件。您可以像访问其他文件一样访问著名的管道,并且需要使用open()打开它们。2.未知管道临时文件。管道()创建了未知文件(没有路径名)。只有系统调用返回的文件描述符用于标识文件,因此只有调用管道()的进程及其后代可以标识文件描述符并与文件(管道)通信。当这些进程不再使

3、用此管道时,核心会回收其索引节点。两条管道的读写方法是一样的,本文只讨论未命名的管道。3.管道文件的建立分配磁盘和内存索引节点、用于读取过程的文件表条目、用于写入过程的文件表条目以及用户文件描述符4.读/写过程是互斥的内核为地址设置一个读指针和一个写指针,按照先进先出的顺序读写。为了使读和写进程互斥地访问管道文件,有必要使每个进程互斥地访问管道文件索引节点中的直接地址项。因此,每次进程访问管道文件时,都有必要检查索引文件是否被锁定。如果是这样,进程将休眠并等待;否则,它将被锁定并读/写。操作完成后解锁,唤醒进程睡眠,因为索引节点被锁定。第三,涉及系统调用1、管道()建立一条无名管道。系统调用格

4、式管道(文件)参数定义intpipe(filedes);int文件2;其中文件1是写端,文件0是读端。该函数使用以下头文件:#包括# inlcude#包括2、阅读()系统调用格式读取(fd、buf、nbyte)函数:从fd指示的文件中读出n字节的数据,并将其发送到指针buf指示的缓冲区。如果文件被锁定,请等到锁被打开。参数定义intread(fd、buf、nbyte);intfdchar * buf未签名的nbyte;3、写()系统调用格式读取(fd、buf、nbyte)函数:将缓冲区中的字节数据写入文件中。如果文件被锁定,暂停写入,直到它被解锁。参数定义与read()相同。四.参考程序#包括

5、#包括#包括int pid1,pid2main()int FD2;焦炭输出管100,入口管100;管道(FD);/*创建管道*/而(PID 1=fork()=-1);if(pid1=0)lockf(fd1,1,0);“子进程1正在发送消息!”);/*将字符串放入数组输出管道*/写(fd1,输出管道,50);/*将一个50字节的字符串写入管道*/睡眠(5);/*自阻塞5秒钟*/lockf(fd1,0,0);退出(0);其他而(PID 2=fork()=-1);if(pid2=0)lockf(fd1,1,0);/*互斥*/“子进程2正在发送消息!”);写(fd1,输出管道,50);睡眠(5);lo

6、ckf(fd1,0,0);退出(0);其他等待(0);/*同步*/读取(fd0,ipe,50);/*从管道中读取50字节的字符串*/printf(“% s/n”,在管道中);等待(0);读取(fd0,ipe,50);printf(“% s/n”,在管道中);退出(0);V.运营结果延迟5秒后显示子进程1正在发送消息!再延迟5秒钟子进程2正在发送消息!实验4进程间通信第一,实验目的Linux系统的进程通信机制允许任意进程间的大量数据交换。本实验的目的是了解和熟悉Linux支持的消息通信机制和信息量机制。第二,实验时间4小时三、实验内容两个程序,client.c和server.c,是通过使用系统调

7、用编写的,如msgget(),msgsnd(),msgrcv()和msgctl(),它们分别用于发送和接收消息。服务器用键75建立一个消息队列,并等待来自其他进程的消息。当遇到类型1的消息时,作为结束信号,取消队列并退出服务器。每次服务器收到消息时,都会显示“(服务器)已收到”。客户端使用键为75的消息队列,连续发送类型为10到1的消息,然后退出。最后一条消息是服务器需要的结束信号。每次客户端发送消息时,都会显示“(客户端)已发送”。四、实验要求阅读msg.c、sem.c、shm.c等Linux系统的源文件,熟悉Linux的三种机制。V.实验步骤两个程序,client.c和server.c,是

8、通过使用系统调用编写的,如msgget(),msgsnd(),msgrcv()和msgctl(),它们分别用于发送和接收消息。服务器用键75建立一个消息队列,并等待来自其他进程的消息。当遇到类型1的消息时,作为结束信号,取消队列并退出服务器。每次服务器收到消息时,都会显示“(服务器)已收到”。客户端使用键为75的消息队列,连续发送类型为10到1的消息,然后退出。最后一条消息是服务器需要的结束信号。每次客户端发送消息时,都会显示“(客户端)已发送”。服务器. c参考程序如下:#包括#包括#包括#包括#包括#定义MSGKEY 75结构msgform长mtypechar mtext1000; msg

9、int msgqidvoid服务器()msgqid=msg set(MSGKEY,0777 | IPC _ CREAT);/*创建75#消息队列*/做msgrcv(msgqid,msg,1030,0,0);/*接收消息*/printf(服务器)已收到 n );while(msg.mtype!=1);msgctl(msgqid,IPC_RMID,0);/*删除消息队列并返回资源*/退出(0);main()服务器();客户c参考程序如下:#包括#包括#包括#包括#包括#定义MSGKEY 75结构msgform长mtypechar mtext1000; msgint msgqidvoid客户端()i

10、nt I;msgqid=msg set(MSGKEY,0777);/*打开75#消息队列*/对于(i=10I=1;i -)msg . m type=I;printf(客户端)已发送 n );msgsnd(msgqid,msg,1024,0);/*发送消息*/退出(0);main()客户();将上述两个程序分别编译到服务器和客户端,并按如下方式执行:/服务器IPCSq。/client客户端和服务器分别发送和接收10条消息。观察运行结果,并注意发送者发送消息和接收者接收消息的顺序。涉及的系统调用:1、msgget()系统调用格式int msgget(key_t key,int msgflg);函数

11、:获取与关键字相关联的消息队列标识。建立消息队列有两种情况:(1)如果密钥的值是IPC_PRIVATE。(2)或者密钥的值不是IPC_PRIVATE,并且对应于该密钥的消息队列不存在,并且在标志中指定了IPC_CREAT。参数定义密钥:与消息队列相关联的密钥。消息队列的建立标志和访问权。回到描述:成功执行后,将返回消息队列标识值。失败返回-1,errno被设置为下列值之一:指定的消息队列已经存在,但是调用进程没有访问它的权限,也没有CAP_IPC_OWNER权限由EEXIST:键指定的消息队列已经存在,并且在msgflg中指定了IPC_CREAT和IPC _ EXCL标志提示:关键字指定的消息

12、队列不存在,并且在msgflg中未指定IPC_CREAT标志需要建立消息队列,但是没有足够的内存需要建立一个消息队列,但是已经达到了系统限制该函数使用以下头文件:#包括#包括#包括2.msgsnd()和msgrcv()系统调用格式int msgsnd(int msqid,const void *msgp,size_t msgsz,int msgflg);ssize_t msgrcv(int msqid,void *msgp,size_t msgsz,long msgtyp,int msgflg);功能:在消息队列中发送和接收消息。为了发送消息,调用进程必须对消息队列有写访问权。接收邮件时,您必

13、须拥有读取权限。参数定义Msqid:消息队列的标识符。Msgp:指向消息缓冲区的指针,用于临时存储发送和接收的消息。它是用户可定义的通用结构,具有以下形式struct msgbuf 长mtype/*消息类型,必须是0 */char mtext100;/*消息文本*/;Msgsz:消息的大小。Msgtyp:从消息队列中读取的消息表单。如果该值为零,将读取消息队列中的所有消息。Msgflg:用于指示当队列中没有数据时核心程序应该采取的操作。如果msgflg和IPC_NOWAIT一起使用,如果在执行msgsnd()时消息队列已满,msgsnd()将不会阻塞,但会立即返回-1。如果执行msgrcv(),当消息队列为空时,它将返回-1而不等待,并将错误代码设置为ENOMSG。当msgflg为0时,msgsnd()和msgrcv()采用阻塞和队列满或空时等待的处理方式。该函数使用以下头文件:#包括#包括#包括回到描述:成功执行时,msgsnd()返回0,msgrcv()返回复制到多行文字数组的实际字节数。两次失败都返回

温馨提示

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

评论

0/150

提交评论