欢迎来到天天文库
浏览记录
ID:15399481
大小:102.50 KB
页数:9页
时间:2018-08-03
《unix&linux下的消息通信机制及消息通信程序示例》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、实验七一.基础知识1.1消息消息(message)是一个格式化的可变长的信息单元。消息机制允许由一个进程给其它任意的进程发送一个消息。当一个进程收到多个消息时,可将它们排成一个消息队列。消息使用二种重要的数据结构:一是消息首部,其中记录了一些与消息有关的信息,如消息数据的字节数;二个消息队列头表,其每一表项是作为一个消息队列的消息头,记录了消息队列的有关信息。1.2消息队列消息队列就是存放在内核中的一个消息链表,注意它是存放在内核中的,所以在应用消息队列时,普通用户是无法运用的,只有切换到超级用户才可以使用。而
2、且是如果创建了一个消息只有在操作系统重启时才会真正删除该消息队列。在许多方面看来,消息队列类似与有名管道,但是却没有与打开与关闭管道的复杂关联,然而,使用消息队列并没有解决我们使用有名管道所遇到的麻烦,例如管道上的阻塞。所以与有名管道比起来,消息队列的优点在于独立与发送与接收进程,这减少了在打开与关闭有名管道之间同步的困难。消息队列提供了一种由一个进程向另一个进程发送块数据的方法。另外,每一个数据块被看作有一个类型,而接收进程可以独立接收具有不同类型的数据块。消息队列的好处在于我们几乎可以完全避免同步问题,并且
3、可以通过发送消息屏蔽有名管道的问题。更好的是,我们可以使用某些紧急方式发送消息。坏处在于,与管道类似,在每一个数据块上有一个最大尺寸限制,同时在系统中所有消息队列上的块尺寸上也有一个最大尺寸限制。消息队列相关的数据结构:1、消息缓冲结构向消息队列发送消息时,必须组成合理的数据结构。Linux系统定义了一个模版数据结构msgbuf:#includestructmsgbuf{longtype;charmtex[1];}其中type表示消息的类型,这是接收消息的一个重要标志。mtex并不一定
4、就是char类型,任意类型都可以的。2、msqid_ds内核数据结构。Linux内核中,每个消息队列都维护一个结构体,此结构体保存着消息队列当前状态信息,该结构体在头文件linux/msg.h中定义,这里就不一一例举了。3、ipc_perm内核数据结构结构体ipc_perm保存着消息队列的一些重要的信息,比如说消息队列关联的键值,消息队列的用户id组id等。它定义在头文件linux/ipc.h中。消息队列的创建:#include#includekey_tftok(
5、char*pathname,charproj);它返回与路径pathname相对应的一个键值。该函数不直接对消息队列操作,但在调用ipc(MSGGET,…)或msgget()来获得消息队列描述字前,往往要调用该函数。典型的调用代码是:key=ftok(path_ptr,'a');ipc_id=ipc(MSGGET,(int)key,flags,0,NULL,0);1.1相关函数系统V消息队列API共有四个,使用时需要包括几个头文件:#include#include
6、#include1)intmsgget(key_tkey,intmsgflg)参数key是一个键值,由ftok获得;msgflg参数是一些标志位。该调用返回与健值key相对应的消息队列描述字。在以下两种情况下,该调用将创建一个新的消息队列:如果没有消息队列与健值key相对应,并且msgflg中包含了IPC_CREAT标志位;key参数为IPC_PRIVATE;参数msgflg可以为以下:IPC_CREAT、IPC_EXCL、IPC_NOWAIT或三者的或结果。调用返回:成功返回消息队列描述
7、字,否则返回-1。注:参数key设置成常数IPC_PRIVATE并不意味着其他进程不能访问该消息队列,只意味着即将创建新的消息队列。2)intmsgrcv(intmsqid,structmsgbuf*msgp,intmsgsz,longmsgtyp,intmsgflg);该系统调用从msgid代表的消息队列中读取一个消息,并把消息存储在msgp指向的msgbuf结构中。msqid为消息队列描述字;消息返回后存储在msgp指向的地址,msgsz指定msgbuf的mtext成员的长度(即消息内容的长度),msgty
8、p为请求读取的消息类型;读消息标志msgflg可以为以下几个常值的或:IPC_NOWAIT如果没有满足条件的消息,调用立即返回,此时,errno=ENOMSGIPC_EXCEPT与msgtyp>0配合使用,返回队列中第一个类型不为msgtyp的消息IPC_NOERROR如果队列中满足条件的消息内容大于所请求的msgsz字节,则把该消息截断,截断部分将丢失。msgrcv手册中详细给出了消
此文档下载收益归作者所有