Linux进程间通信(消息队列介绍).docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux进程间通信(消息队列介绍)

Linux进程间通信: 消息队列 2007-12-20 10:15 Linux的消息队列(queue)实质上是一个链表, 它有消息队列标识符(queue ID). msgget创建一个新队列或打开一个存在的队列; msgsnd向队列末端添加一条新消息; msgrcv从队列中取消息, 取消息是不一定遵循先进先出的, 也可以按消息的类型字段取消息. 1. 标识符(des)和键(key): ??? 消息队列, 信号量和共享存储段, 都属于内核中的IPC结构, 它们都用标识符来描述. 这个标识符是一个非负整数, 与文件描述符不同的是, 创建时并不会重复利用通过删除回收的整数, 而是每次+1, 直到整数最大值回转到0. ??? 标识符是IPC对象的内部名, 而它的外部名则是key(键), 它的基本类型是key_t, 在头文件sys/types.h中定义为长整型. 键由内核变换成标识符. 2. 消息队列状态msqid_ds: ??? 每个消息队列都有一个msqid_ds结构与其关联: struct msqid_ds ...{ ????struct ipc_perm msg_perm; /**//* access */ ???? msgqnum_t??????? msg_qnum; /**//* # of messages on queue */ ???? msglen_t??????????? msg_qbytes; /**//* max # of bytes on queue */ ???? pid_t????????????????? msg_lspid;??/**//* pid of last msgsnd() */ ???? pid_t????????????????? msg_lrpid;??/**//* pid of last msgrcv() */ ???? time_t??????????????? msg_stime; /**//* last-msgsnd() time */ ???? time_t??????????????? msg_rtime; /**//* last-msgrcv() time */ ???? time_t??????????????? msg_ctime; /**//* last-change time */ ???? ... ???? ... ???? ... }; 3. 由路径名和项目ID产生一个key: ??? 如果客户进程和服务器进程认同一个路径名和项目ID(0~255间的字符值), 接着调用ftok将这两个值变换为一个key. 原型: key_t ftok(const char *path, int id); 头文件: sys/ipc.h 返回值: 成功则返回key, 出错则返回(key_t)-1. 参数: path参数必须引用一个现存文件. 当产生key时 只使用id参数的低8位. 说 明: 如果两个路径名引用两个不同的文件, 对这两个路径名调用ftok通常返回不同的key. 但是, 因为i节点号和key通常存放在长整型中, 于是创建key时可能会丢失信息. 这意味着, 如果使用同一项目ID, 那么对于不同文件的两个路径名可能产生相同的key. 该函数的工作方式为: 按给定的路径名取得其stat结构. 从该结构中取出部分st_dev和st_ino字段, 与项目ID组合起来. 4. 创建/打开消息队列: ??? msgget可以创建一个新队列或打开一个存在的队列. 原型: int msgget(key_t key, int flag); 头文件: sys/msg.h 返回值: 成功则返回消息队列ID, 出错则返回-1. 参数: key: 消息队列的key值. flag: 标志位. 说明: 创建队列有两种方法: key是IPC_PRIVATE. key当前未与特定类型的IPC结构相结合, 并且flag中指定了IPC_CREAT位. 初始化msqid_ds成员: ipc_perm中的mode成员按flag进行设置. msg_qnum, msg_lspid, msg_lrpid, msg_stime和msg_rtime都设置为0. msg_ctime设置为当前时间. msg_qbytes设置为系统限制值. 5. 消息队列的垃圾桶函数: ??? msgctl类似于驱动程序中的ioctl函数, 可对消息队列执行多种操作. 原型: int msgctl(int msqid, int cmd, struct msgqid_ds *buf); 头文件: sys/msg.h 返回值: 成功则返回0, 出错则返回-1. 参数: cmd参数说明对msqid

文档评论(0)

liangyuehong + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档