欢迎来到天天文库
浏览记录
ID:35217199
大小:237.00 KB
页数:20页
时间:2019-03-22
《各种实验报告电子版模版》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、实验项目四进程通信一、实验类型本实验为综合性实验。二、实验目的1.了解什么是消息,熟悉消息传送原理。2.了解和熟悉共享存储机制。3.掌握消息的发送与接收的实现方法。三、实验预备知识任务一消息的发送和接收1.实验基本原理消息(message)是一个格式化的可变长的信息单元。消息机制允许由一个进程给其它任意的进程发送一个消息。当一个进程收到多个消息时,可将它们排成一个消息队列。消息使用两种重要的数据结构:一是消息首部,其中记录了一些与消息有关的信息,如消息数据的字节数;二是消息队列头表,其每一表项是作为一个消息队列的消息头,记录了消息队列的有关信息。消息机制的数据结构:structmsg
2、form{longmtype;charmtext[1024];};(1)消息首部记录一些与消息有关的信息,如消息的类型、大小、指向消息数据区的指针、消息队列的链接指针等。(2)消息队列头表其每一项作为一个消息队列的消息头,记录了消息队列的有关信息如指向消息队列中第一个消息和指向最后一个消息的指针、队列中消息的数目、队列中消息数据的总字节数、队列所允许消息数据的最大字节总数,还有最近一次执行发送操作的进程标识符和时间、最近一次执行接收操作的进程标识符和时间等。(3)消息队列的描述符UNIX中,每一个消息队列都有一个称为关键字(key)的名字,是由用户指定的;消息队列有一消息队列描述符,
3、其作用与用户文件描述符一样,也是为了方便用户和系统对消息队列的访问。1.msgget()函数头文件:#include#include#include函数原型:intmsgget(key_tkey,intmsgflag);函数说明:创建一个消息,获得一个消息的描述符。系统内核将搜索消息队列头表,确定是否有指定名字的消息队列。若无,系统内核将分配一新的消息队列头,并对它进行初始化,然后给用户返回一个消息队列描述符,否则它只是检查消息队列的许可权便返回。系统调用格式:msgqid=msgget(key,flag)。其中:
4、msgqid是该系统调用返回的描述符,失败则返回-1。msgget()函数的第一个参数是消息队列对象的关键字(key),函数将它与已有的消息队列对象的关键字进行比较来判断消息队列对象是否已经创建。而函数进行的具体操作是由第二个参数msgflg控制的。它可以取下面的几个值:IPC_CREAT:如果消息队列对象不存在,则创建之,否则则进行打开操作;IPC_EXCL:和IPC_CREAT一起使用(用”
5、”连接),如果消息对象不存在则创建之,否则产生一个错误并返回。如果单独使用IPC_CREAT标志,msgget()函数要么返回一个已经存在的消息队列对象的标识符,要么返回一个新建立的消息队列
6、对象的标识符。如果将IPC_CREAT和IPC_EXCL标志一起使用,msgget()将返回一个新建的消息对象的标识符,或者返回-1。如果消息队列对象已存在,IPC_EXCL标志本身并没有太大的意义,但和IPC_CREAT标志一起使用可以用来保证所得的消息队列对象是新创建的而不是打开的已有的对象。除了以上的两个标志以外,在msgflg标志中还可以有存取权限控制符。这种控制符的意义和文件系统中的权限控制符是类似的。1.msgsnd()函数头文件:#include#include#include函数原型:intmsgs
7、nd(intmsqid,constvoid*msgp,inttmsgsz,intmsgflg);函数说明:在消息队列上进行收发消息,为了发送消息,调用进程对消息队列进行写入时必须有写权能。成功执行时返回0,失败时返回-1。其中msgqid是返回消息队列的描述符;msgp是指向用户消息缓冲区的一个结构体指针。缓冲区中包括消息类型和消息正文,即{longmtype;/*消息类型*/charmtext[];/*消息的文本*/}msgsz指示由msgp指向的数据结构中字符数组的长度;即消息的长度。这个数组的最大值由MSG-MAX()系统可调用参数来确定。msgflag参数是控制函数行为的标志
8、,取值可以是:0,表示忽略。若在标志msgflag中未设置IPC_NOWAIT位,则当该消息队列中的字节数超过最大值时,或系统范围的消息数超过某一最大值时,调用msgsnd进程睡眠。若是设置IPC_NOWAIT,则在此情况下,msgsnd立即返回。对于msgsnd(),系统内核须完成以下工作:(1)对消息队列的描述符和许可权及消息长度等进行检查。若合法才继续执行,否则返回;(2)系统内核为消息分配消息数据区。将用户消息缓冲区中的消息正文,拷贝到消息数据区;
此文档下载收益归作者所有