三上操作系统实验_第1页
三上操作系统实验_第2页
三上操作系统实验_第3页
三上操作系统实验_第4页
三上操作系统实验_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

1、实验四基于消息队列和共享内存的进程间通信学号:12070424目录实验目的实验内容实验要求实验设计实验运行结果感想参考资料及分析一、实验目的Linux 系统的进程通信机构(IPC)允许在任意进程间大批量地交换数据。本实验的目的是了解和熟悉:1. Linux 支持的消息通信机制及其使用方法2. Linux 系统的共享二、实验内容1 消息的创建、发送和接收使用消息调用 msgget()、msgsnd()、msggrev()、msgctrl()编制长度为1K 的消息的发送和接收程序。区的原理及使用方法。2 共享取得创建、附接和断接使用系统调用 shmget()、shmat()、shmctl()、sh

2、mctl(),编制一个与上述功能相同的程序。三、实验要求按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验。四、实验设计1. 消息的创建,收发和接收#include #include #include #include#include#define MSGKEY 75struct msgformlong mtype;char minfo1030;msg;msgqid;void CNT() i;msgqid=msgget(MSGKEY,0777|IPC_CREAT);/get for (i=10;i=1;i-)/change the type frommsg.

3、mtype=i;the description10 to 1char ofmessageprf(cntn);msgsnd(msgqid,&msg,1024,0);/send msgothe queuevoid SERVER()msgqid=msgget(MSGKEY,0777|IPC_CREAT); do msgrcv(msgqid,&msg,1030,0,0);/receivemsgfrom queuemsgidprwhile msgctf(server)receivedn); (msg.mtype!=1);gqid,IPC_RMID,0);main()/msgqid=msgget(MSGK

4、EY,0777); if (fork()/wait(NULL); SERVER();elseCNT();2.共享#include #include #include #include#include区的附接#define SHMKEY 75shmid,i;*addr;void CNT() i;shmid=shmget(SHMKEY,1024,0777);/get shared addr=shmat(shmid,0,0);/shared area star for (i=9;i=0;i-)while (*addr!=-1);areaaddrprf(cntn);*addr=i;exit(0);/e

5、nd the cnt prosvoid SERVER()shmid=shmget(SHMKEY,1024,0777|IPC_CREAT); addr=shmat(shmid,0,0);do *addr=-1;/server use the shared areawhile (*addr=-1);/wait the change prf(server)receivedn);while (*addr);shmctl(shmid,IPC_RMID,0);exit(0);/end the servrosmain()if (fork()SERVER();if (fork()CNT();wait(0);w

6、ait(0); return 0;5. 实验及分析由于在父进程第一步执行wait(NULL),等待子进程之行结束,结果应为子进程传输是个消息,然后父进程接收十个消息(c(c(c(c(c(c(c(c(c(cnn n n n n n n n ntt t t t t t t t t(server)received(server)received (server)received (server)received (server)received (server)received (server)received (server)received (server)received (server)re

7、ceived6. 运行结果7. 收获及体会通过此次实验熟悉了消息队列和共享的使用。区的机制,原理及使用方法。学会了相关系统调用在此试验中,如果要求父进程在子进程结束后再运行,则将有消息发送后父进程接收。而如果不等待子进程全部之行结束,则子进程发送一个消息,父进程就会写及时接收该消息再回到子进程发送消息。8. 参考资料1、共享内存(1)共享区的建立shmid=shmget (key ,size ,flag):建立(获得)一块共享区,返回该共享区的描述符shmid;若尚未建立,便为进程建立一个指定大小的共享区。(2)共享区的控制shmctl(id,cmd,buf)对共享区的状态信息进行查询,如其长

8、度、所连接的进程数、创建者标识符等;也可设置或修改其属性,如共享区的权、当前连接的进程计数等;还可用来对共享存储区加锁或,以及修改共享区标识符等。(3) 共享区的附接在进程已经建立了共享shmat(id,addr ,flag)将该共享区或已获得了其描述符后, 还须利用系统调用区附接到用户给定的某个进程的虚地址上,并指定该区的属性,即指明该区是只读,还是可读可写。此共享(4)共享区便成为该进程虚地址空间的一部分。区的断开当进程不再需要该共享区时,再利用系统调用shmdt(addr)把该区与进程断开。2、消息队列msgqid msgget(key,flag)功能:获得一个消息的描述符,该描述符指定

9、一个消息队列以便用于其他系统调用。该函数使用头文件如下:# include # include #include msgsnd(id,msgp,size,flag)功能:发送一条消息。其中:id 是返回消息队列的描述符;msgp 是指向用户区的一个构造体指针,size 指示由msgp 指向的数据结构中字符数组的长度; 即消息的长度。flag 规定当用尽内部缓冲空间适应执行的动作;若在标志flag 中未设置IPC_NOWAIT位,则当该消息队列中的字节数超过一最大值时,或系统范围的消息数超过某一最大值时,调用msgsnd 进程睡眠。若是设置IPC_NOWAIT,则在此情况下,msgsnd 立即返

10、回。 (3)msgrcv(id,msgp,size,type,flag)功能:接受一条消息。 其中,id 是消息描述符,msgp 是用来存放欲接受消息的用户数据结构的地址;size 是msgp 中数据数组的大小;type 是用户要读的消息类型:typetypetypeflag为0 :接收该队列的第一个消息;为正:为负:接收类型 type 的第一个消息;接收小于或等于 type 绝对值的最低类型的第一个消息/应当做什么事,如果此时设置了 IPC_NOWAIT规定倘若该队列无消息,标志,则立即返回,若在flag 中设置了MSG_NOERROR,且所接收的消息大小大于size截断所接收的消息。count 是返回消息正文的字节数。(4)msgctl(id,cmd,buf)功能:查询一个消息描述符的状态,设置它的状态及删除一个消息描述符。id,cmd;

温馨提示

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

评论

0/150

提交评论