UnixLinux下的消息通信机制及消息通信程序示例.doc

UnixLinux下的消息通信机制及消息通信程序示例.doc

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
UnixLinux下的消息通信机制及消息通信程序示例

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

文档评论(0)

yaobanwd + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档