Linux消息队列分析及应用

上传人:飞*** 文档编号:29225169 上传时间:2018-01-23 格式:DOC 页数:3 大小:317.02KB
返回 下载 相关 举报
Linux消息队列分析及应用_第1页
第1页 / 共3页
Linux消息队列分析及应用_第2页
第2页 / 共3页
Linux消息队列分析及应用_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

《Linux消息队列分析及应用》由会员分享,可在线阅读,更多相关《Linux消息队列分析及应用(3页珍藏版)》请在金锄头文库上搜索。

1、2012-07-13#2012-07-13#2#0#12-07-13#张 锋 涛( 苏 州 大 学 计 算 机 科 学 与 技 术 学 院 江 苏 苏 州 215006 )本 文 详 细 介 绍 了 linux 中 消 息 队 列 的 基 本 概 念 和 工 作 原 理 , 并 结 合 实 例 给 出 了 消 息 队 列【摘 要 】:API 函 数 的 使 用 方 法 。linux;消 息 队 列 ; System V IPC【关 键 词 】:消 息 会 从 进 程 的 地 址 空 间 复 制 到 一 个 msg 结 构 体 , 然1、引 言Linux 继 承 了 System V 提 供 的

2、 3 种 进 程 间 通 信 机 制 , 它 们 是 消 息 队 列 、 信 号 量 和 共 享 内 存 。 这 3 种 进 程间 通 信 机 制 用 于 同 一 主 机 间 两 个 进 程 信 息 的 传 递 或 同步 。 消 息 队 列 是 消 息 的 链 式 队 列 , 就 是 把 消 息 看 作 一 个后 系 统 把 该 msg 结 构 体 放 在 消 息 队 列 的 尾 部 。 由 于linux 限 制 写 消 息 的 数 量 和 消 息 的 长 度 ( 定 义 在 /usr/in-clude/linux/msg.h 文 件 中 ) , 所 以 可 能 会 出 现 没 有 足 够的

3、空 间 来 存 放 消 息 的 情 况 。 这 时 当 前 进 程 会 被 放 入 对记 录 , 并 且 这 个 记 录 具 有 特 定 的 格 式 以 及 特 定 的 优 先 应 消 息 的 写 等 待 队 列 中 , 系 统 调 用 进 程 调 度 器 选 择 合级 (用 消 息 类 型 标 示 )。 对 消 息 队 列 有 写 权 限 的 进 程 可 以按 照 一 定 的 规 则 添 加 新 消 息 ; 对 消 息 队 列 有 读 权 限 的 进 程 则 可 以 从 消 息 队 列 中 读 出 消 息 。2、 Linux System V IPC 消 息 队 列 介 绍Linux 可 采

4、 用 消 息 队 列 的 方 式 来 实 现 进 程 间 消 息 的 传 递 。 这 种 消 息 的 发 送 方 式 是 : 发 送 方 不 必 等 待 接 收适 的 进 程 运 行 。 在 该 消 息 队 列 中 有 一 个 或 多 个 消 息 被读 出 时 , 睡 眠 的 进 程 会 被 唤 醒 。从 队 列 中 读 消 息 的 过 程 与 写 消 息 的 过 程 相 似 , 系 统 会 再 次 核 对 有 效 用 户 标 识 和 组 标 识 与 该 队 列 的 ipc_perm 结 构 体 中 定 义 的 访 问 模 式 。 一 个 读 进 程 可 以选 择 获 得 队 列 中 的 第

5、一 个 消 息 ( 不 考 虑 消 息 类 型 ) , 或方 检 查 它 所 收 到 的 消 息 就 可 以 继 续 工 作 下 去 , 而 接 收 者 读 取 某 种 特 别 类 型 的 消 息 (根 据 要 求 的 消 息 类 型 ) 。方 如 果 没 有 收 到 消 息 也 不 需 等 待 。 这 种 通 信 机 制 相 对 如 果 没 有 符 合 要 求 的 消 息 的 话 , 读 进 程 会 被 加 入 到 该简 单 , 但 是 应 用 程 序 使 用 起 来 就 需 要 使 用 相 对 复 杂 的方 式 来 应 付 了 。 新 的 消 息 总 是 放 在 队 列 的 末 尾 , 接

6、 收 进消 息 的 读 等 待 队 列 中 , 系 统 唤 醒 进 程 调 度 器 调 度 新 进程 运 行 。 一 旦 有 新 消 息 被 写 入 消 息 队 列 。 睡 眠 的 进 程 被 唤 醒 , 并 再 次 运 行 。3.2 内 核 与 消 息 队 列 的 联 系附 录 A( 图 2 ) 说 明 了 内 核 与 消 息 队 列 是 怎 样 建 立 起 联 系 的 .程 接 收 的 时 候 并 不 总 是 从 头 来 接 收 , 可 以 从 中 间 来 接收 :息 。根 据 消 息 结 构 中 的 消 息 类 型 变 量 来 确 定 接 收 的 消3、内 核 与 消 息 队 列 的 关

7、 系3.1 消 息 队 列 的 工 作 原 理消 息 队 列 允 许 一 个 或 多 个 进 程 向 队 列 中 写 入 消 息 , 然 后 由 一 个 或 多 个 读 进 程 读 出 。 linux 系 统 维 护 一 个 消 息 队 列 的 表 , 该 表 是 msg_queue 类 型 的 结 构 体 数结 构 体 list_head 形 成 一 个 链 表 , 而 结 构 体msg_msg 之 中 的 m_list 成 员 是 一 个 struct_list_head 类型 的 变 量 , 通 过 此 变 量 消 息 形 成 了 一 个 链 表 , 在 查 找 和 插 入 时 , 对

8、m_list 域 进 行 偏 移 操 作 就 可 以 找 到 对 应 的消 息 的 位 置 。 内 核 中 的 代 码 在 头 文 件 和 中 , 主 要 是 插 入 消 息 和 取 出 消 息 的 操 作 。 系 统 使 用 ipc_perm 结 构 来 保 持 每 个 IPC 对 象 权 限 信 息 ,定 义 在 中 。3.3 IPCS 命 令命 令 ipcs 用 于 读 取 System V IPC 目 标 的 状 态 。ipcs -q: 只 显 示 消 息 队 列 。ipcs -s: 只 显 示 信 号 量 。ipcs -m: 只 显 示 共 享 内 存 。组 , 数 组 中 每 个

9、元 素 指 向 一 个 能 完 全 描 述 消 息 队 列 的msqid_ds 结 构 体 。 一 旦 一 个 新 的 消 息 队 列 被 创 建 , 则 在系 统 内 存 中 会 为 一 个 新 的 msqid_ds 结 构 体 分 配 空 间 ,并 把 它 插 入 到 msg_queue 结 构 体 数 组 中 。每 个 msqid_ds 结 构 体 都 包 含 ipc_perm 类 型 的 数 据 结 构 体 以 及 指 向 进 入 该 队 列 的 消 息 的 指 针 。 此 外 ,linux 还 记 录 像 队 列 最 后 被 更 改 的 时 间 等 队 列 时 间 更 改 信 息 。

10、 msqid_ds 结 构 体 还 包 括 两 个 等 待 队 列 ; 一 个 用于 存 放 写 进 程 的 消 息 , 另 一 个 用 于 消 息 队 列 。每 次 进 程 要 向 写 队 列 写 入 消 息 时 , 系 统 都 要 把 它 ipcs -help: 其 他 的 参 数 。2012的 -有 0效 7用 -户 13标 #识 #和 #组 #标 #识 #与 #该 #队 #列 #的 #ipc#_p2er0m1结 2构 -037.4 -消 1息 3队 #列 #的 #主 #要 #调 #2用 #0#12-07-13#a. msgget(key_t key, int msgflg):调 用 者

11、 提 供 一 个 消息 队 列 的 键 标 (用 于 表 示 个 消 息 队 列 的 唯 一 名 字 , 可 以 用 ftok()函 数 生 成 ), 当 这 个 消 息 队 列 存 在 的 时 候 , 这 个 消 息 调 用 负 责 返 回 这 个 队 列 的 标 识 号 ; 如 果 这 个 队 列不 存 在 , 就 创 建 一 个 消 息 队 列 , 然 后 返 回 这 个 消 息 队 列 的 标 识 号 。 打 开 或 者 访 问 操 作 依 赖 于 msgflg 参 数 的 内 容 。b. msgsnd(int msqid, const void *msgp, size_t msgsz

12、,图 1.程 序 运 行 结 果结 果 解 释 : ./queue s 001 为 向 消 息 队 列 001 中 写 入int msgflg): 向 一 个 消 息 队 列 发 送 一 个 消 息 , 主 要 由消 息 ; ./queue r 001 为 从 消 息 队 列 中 读 取 消 息 。 可 以 看sys_msgsnd 执 行 。 第 一 个 参 数 是 队 列 标 示 符 , 它 是 前 面调 用 msgget() 获 得 的 值 , 第 二 个 参 数 是 一 个 void 类 型 的 指 针 , 指 向 一 个 消 息 缓 冲 区 。 msgsz 参 数 则 包 含 着 消

13、息 的 大 小 , 它 是 以 字 节 为 单 位 的 , 其 中 不 包 括 消 息 类 型的 长 度 ( 4 个 字 节 长 ) 。c. msgrcv (int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg): 从 一 个 消 息 队 列 中 收 到 一 个 消 息 , 主 要 由 系 统 调 用 sys_msgrcv 执 行 。d. msgctl(int msqid, int cmd, struct msqid_ds *buf):到 , 在 写 入 hello world 后 查 看 消 息 队 列 长 度 为 12 个

14、 字节 ( 其 中 包 括 消 息 类 型 2 个 字 节 ) ; 读 出 消 息 后 队 列 变 为 0 个 字 节 。 ./queue d 001 为 删 除 队 列 , 运 行 该 命 令 后 可 看 到 队 列 已 经 不 存 在 。4 结 语 :在 两 个 不 近 程 之 间 传 递 数 据 有 许 多 种 方 法 , 消 息 是 其 中 比 较 简 单 同 时 也 是 比 较 高 效 的 一 种 。 首 先 , 它 提 供 有 格 式 字 节 流 , 有 利 于 减 少 开 发 人 员 的 工 作 量 ; 其次 , 消 息 具 有 类 型 , 在 实 际 应 用 中 , 可 作 为

15、 优 先 级 使 用 ;最 后 , 与 管 道 相 比 , 消 息 队 列 既 不 依 赖 于 发 送 近 程 , 也 不 依 赖 于 接 收 进 程 , 它 们 自 己 是 可 以 独 立 存 在 的 , 这 就 省 掉 了 在 打 开 和 关 闭 管 道 时 必 不 可 少 的 同 步 与 协 调 机 制 。在 消 息 队 列 上 执 行 指 定 的 操 作 。 根 据 参 数 的 不 同 和 权限 的 不 同 , 可 以 执 行 检 索 、 删 除 等 的 操 作 , 主 要 由 系 统调 用 sys_msgctl 执 行 。3.5 消 息 队 列 的 应 用 例 子下 面 的 例 子

16、演 示 了 创 建 、 发 送 、 读 取 以 及 删 除 消 息 队 列 各 种 操 作 。 源 程 序 见 附 录 B, 程 序 保 存 为 queue.c,编 译 及 运 行 结 果 如 图 参 考 文 献 :1Linux 高 级 程 序 设 计 ( 第 2 版 ) 杨 宗 德 、 邓 玉 春 著 .北 京 :人 民 邮 电 出 版 社 ,2009.102Linux 程 序 设 计 ( 原 书 第 2 版 ) / ( 英 ) 马 太 ( Matthew, N.) 等 著 ;杨 晓 云 等 译 .北 京 : 机 械 工 业 出 版 社 ,2002.13Linux 内 核 编 程 指 南 ( 第 3 版 ) /拜 克 ( Beck,M.) , 鲍

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号