- 1、本文档共148页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux进程通信课件
消息队列 是一个格式化的可变长信息单位 消息机制允许一个进程向其他进程发送一个消息 当一个进程收到多个消息时,可将它们排成一个消息队列 IPC消息队列资源的限制 IPC消息队列的缺省数为16 每个消息的缺省最大值8192字节 队列中全部信息的缺省大小为16384字节 消息使用以下两种数据结构 消息首部:struct msg_msg 消息队列头表:msg_queue 消息队列 消息队列各数据结构之间的关系 消息队列 msg_queue结构定义 定义位置:linux/ipc/msg.c 若IPC_NOWAIT未被设置 消息队列容量已满时,发送进程进入睡眠状态,并被添加到相应的q_senders队列 当消息队列中无合适消息时,接收进程进入睡眠状态,并被添加到相应的q_receivers队列 消息队列 msg_msg结构 定义位置:linux/ipc/msg.c 说明 只是一个消息头部,不包含消息的数据部分 消息队列 消息队列的数据存储 数据部分紧接msg_msg结构分配 当数据部分空间与msg_msg结构所占空间大于一个页面时,则将其以页面为单位分片 第一个页面存储msg_msg结构与首部分数据 随后的再分配空间则存储struct msg_msgseg结构与剩余的数据 如果这两者所占空间之和仍大于一个页面,则继续分配下去 msg_msgseg结构用以把消息片链接在一起 消息队列 消息队列的基本操作—msgget() 功能 创建一个新消息队列或打开一个存在的队列 函数原型 int msgget(key_t key, int flag); 参数说明 key:待创建/打开队列的键值 flag:创建/打开方式 常取IPC_CREAT|IPC_EXCL|0666 若不存在key值的队列,则创建;若存在,则打开队列 0666表示与一般文件权限一样 返回值 成功返回消息队列描述字,否则返回-1 说明 IPC_CREAT一般由服务器程序创建消息队列时使用 若是客户程序,须打开现有消息队列,而不用IPC_CREAT 消息队列 消息队列的基本操作—msgrcv() 功能 消息队列中读取一个消息 函数原型 ssize_t msgrcv(int msqid, struct msgbuf *msgp, size_t size, long type, int flag); 参数说明 msgid:消息队列描述字 msgp:消息存储位置 size:消息内容的长度 type:请求读取的消息类型 flag:规定队列无消息时内核应做的操作 IPC_NOWAIT:无满足条件消息时返回,此时errno=ENOMSG IPC_EXCEPT:type0时使用,返回第一个类型不为type的消息 IPC_NOERROR:如果队列中满足条件的消息内容大于所请求的size字节,则把该消息截断,截断部分将丢失 消息队列 消息队列的基本操作—msgrcv()工作流程 检查消息队列描述符和许可权 若合法,继续执行 否则返回 根据type的不同分成三种情况处理 type=0:接收该队列的第一个消息,并将它返回给调用者 type0:接收类型type的第一个消息 type0:接收小于等于type绝对值的最低类型的第一个消息 当返回消息的大小等于或小于用户请求时,内核便将消息正文拷贝到用户区,并从消息队列中删除此消息,然后唤醒睡眠的发送进程 如果消息长度比用户要求的大时,则返回出错 消息队列 消息队列的基本操作—msgsnd() 功能 向消息队列发送一个消息 函数原型 int msgsnd(int msqid, struct msgbuf *msgp, size_t size, int flag); 说明 flag: 有意义的标志为IPC_NOWAIT,指明在消息队列没有足够空间容纳要发送的消息时,msgsnd是否等待 内核须对msgsnd( )函数完成的工作 检查消息队列描述符、许可权及消息长度 若合法,继续执行 否则,返回 内核为消息分配数据区,将消息正文拷贝到消息数据区 分配消息首部,并将它链入消息队列的末尾 修改消息队列头数据,如队列中的消息数、字节总数等 唤醒等待消息的进程 消息队列 消息队列的基本操作—msgctl() 功能 修改消息队列状态信息,如 查询消息队列描述符 修改消息队列许可权 删除该队列等 函数原型 int msgctl(int msqid, int cmd, struct msqid_ds *buf); 消息队列 消息队列的基本操作—msgctl()(续) cmd参数说明 规定的命令 IPC_STAT:查询有关消息队列情况的命令 IPC_SET:按buf所指向结构的值,设置与此队列相关的结构中的下列4个字段 msg_perm.uid,msg_per
文档评论(0)