UNIX Network Programming Volume 2: Interprocess Communications Second Edition UNIX 网 络 编 程 卷 2: 进 程 间 通 信 ( 第 2 版 英 文 版 ) [ 美 ] W. Richard Stevens 著 人 民 邮 电 出 版 社 北 京
内 容 提 要 本 书 是 一 部 UNIX 网 络 编 程 的 经 典 之 作 进 程 间 通 信 (IPC) 几 乎 是 所 有 Unix 程 序 性 能 的 关 键, 理 解 IPC 也 是 理 解 如 何 开 发 不 同 主 机 间 网 络 应 用 程 序 的 必 要 条 件 本 书 从 对 Posix IPC 和 System V IPC 的 内 部 结 构 开 始 讨 论, 全 面 深 入 地 介 绍 了 4 种 IPC 形 式 : 消 息 传 递 ( 管 道 FIFO 消 息 队 列 ) 同 步 ( 互 斥 锁 条 件 变 量 读 写 锁 文 件 与 记 录 锁 信 号 量 ) 共 享 内 存 ( 匿 名 共 享 内 存 具 名 共 享 内 存 ) 及 远 程 过 程 调 用 (Solaris 门 Sun RPC) 附 录 中 给 出 了 测 量 各 种 IPC 形 式 性 能 的 方 法 本 书 内 容 详 尽 且 具 权 威 性, 几 乎 每 章 都 提 供 精 选 的 习 题, 并 提 供 了 部 分 习 题 的 答 案, 是 网 络 研 究 和 开 发 人 员 理 想 的 参 考 书 著 [ 美 ] W. Richard Stevens 责 任 编 辑 杨 海 玲 责 任 印 制 张 佳 莹 焦 志 炜 人 民 邮 电 出 版 社 出 版 发 行 北 京 市 丰 台 区 成 寿 寺 路 11 号 邮 编 100164 电 子 邮 件 315@ptpress.com.cn 网 址 http://www.ptpress.com.cn 北 京 ****** 印 刷 开 本 :800 1000 1/16 印 张 :36 字 数 :692 千 字 2016 年 2 月 第 2 版 印 数 :1-2 000 册 2016 年 2 月 北 京 第 1 次 印 刷 著 作 权 合 同 登 记 号 图 字 :01-2009-5714 号 定 价 :89.00 元 读 者 服 务 热 线 :(010)81055410 印 装 质 量 热 线 :(010)81055316 反 盗 版 热 线 :(010)81055315
版 权 声 明 Original edition, entitled UNIX Network Programming, Volume 2: Interprocess Communications, Second Edition, 9780130810816 by W. Richard Stevens, published by Pearson Education, Inc., Copyright 1999 by Prentice Hall PTR. All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from Pearson Education, Inc. China edition published by PEARSON EDUCATION ASIA LTD., and POSTS & TELECOM PRESS Copyright 2016. This edition is manufactured in the People s Republic of China, and is authorized for sale only in the People s Republic of China excluding Hong Kong, Macao and Taiwan. 本 书 封 面 贴 有 Pearson Education( 培 生 教 育 出 版 集 团 ) 激 光 防 伪 标 签, 无 标 签 者 不 得 销 售
前 言 概 述 大 多 数 重 要 的 程 序 都 涉 及 进 程 间 通 信 (Interprocess Communication, IPC) 这 是 受 下 述 设 计 原 则 影 响 的 自 然 结 果 : 把 应 用 程 序 设 计 为 一 组 相 互 通 信 的 小 片 断 比 将 其 设 计 为 单 个 庞 大 的 程 序 更 好 从 历 史 角 度 看, 应 用 程 序 有 如 下 几 种 构 建 方 法 (1) 用 一 个 庞 大 的 程 序 完 成 全 部 工 作 程 序 的 各 部 分 可 以 实 现 为 函 数, 函 数 之 间 通 过 参 数 返 回 值 和 全 局 变 量 来 交 换 信 息 (2) 使 用 多 个 程 序, 程 序 之 间 用 某 种 形 式 的 IPC 进 行 通 信 许 多 标 准 的 Unix 工 具 都 是 按 这 种 风 格 设 计 的, 它 们 使 用 shell 管 道 (IPC 的 一 种 形 式 ) 在 程 序 之 间 传 递 信 息 (3) 使 用 一 个 包 含 多 个 线 程 的 程 序, 线 程 之 间 使 用 某 种 IPC 这 里 仍 然 使 用 术 语 IPC, 尽 管 通 信 是 在 线 程 之 间 而 不 是 在 进 程 之 间 进 行 的 还 可 以 把 后 两 种 设 计 形 式 结 合 起 来 : 用 多 个 进 程 来 实 现, 其 中 每 个 进 程 包 含 几 个 线 程 在 这 种 情 况 下, 进 程 内 部 的 线 程 之 间 可 以 通 信, 不 同 的 进 程 之 间 也 可 以 通 信 上 面 讲 述 了 可 以 把 完 成 给 定 任 务 所 需 的 工 作 分 到 多 个 进 程 中, 或 许 还 可 以 进 一 步 分 到 进 程 内 的 多 个 线 程 中 在 包 含 多 个 处 理 器 (CPU) 的 系 统 中, 多 个 进 程 也 许 可 以 ( 在 不 同 的 CPU 上 ) 同 时 运 行, 或 许 给 定 进 程 内 的 多 个 线 程 也 能 同 时 运 行 因 此, 把 任 务 分 到 多 个 进 程 或 线 程 中 有 望 减 少 完 成 指 定 任 务 的 时 间 本 书 详 细 描 述 了 以 下 4 种 不 同 的 IPC 形 式 :
ii UNIX Network Programming 前 言 (1) 消 息 传 递 ( 管 道 FIFO 和 消 息 队 列 ); (2) 同 步 ( 互 斥 量 条 件 变 量 读 写 锁 文 件 和 记 录 锁 信 号 量 ); (3) 共 享 内 存 ( 匿 名 的 和 具 名 的 ); (4) 远 程 过 程 调 用 (Solaris 门 和 Sun RPC) 本 书 不 讨 论 如 何 编 写 通 过 计 算 机 网 络 通 信 的 程 序 这 种 通 信 通 常 涉 及 使 用 TCP/IP 协 议 族 的 套 接 字 API, 相 关 主 题 在 第 1 卷 [Stevens 1998] 中 有 详 细 讨 论 有 人 可 能 会 提 出 质 疑 : 不 应 该 使 用 单 主 机 或 非 网 络 IPC( 本 卷 的 主 题 ), 所 有 程 序 都 应 该 在 网 络 上 的 多 台 主 机 上 同 时 运 行 但 在 日 常 实 践 中, 单 主 机 IPC 往 往 比 网 络 通 信 快 得 多, 而 且 有 时 还 简 单 些 共 享 内 存 同 步 等 方 法 通 常 也 只 能 用 于 单 主 机, 跨 网 络 时 可 能 无 法 使 用 经 验 和 历 史 表 明, 非 网 络 IPC( 本 卷 ) 与 跨 网 络 IPC( 第 1 卷 ) 都 是 需 要 的 本 卷 建 立 在 第 1 卷 和 我 写 的 另 外 4 本 书 的 基 础 上, 这 5 本 书 在 本 书 中 简 记 如 下 : UNPv1:UNIX Network Programming, Volume 1 [Stevens 1998]; APUE:Advanced Programming in the UNIX Environment [Stevens 1992]; TCPv1:TCP/IP Illustrated, Volume 1 [Stevens 1994]; TCPv2:TCP/IP Illustrated, Volume 2 [Wright and Stevens 1995]; TCPv3:TCP/IP Illustrated, Volume 3 [Stevens 1996] 在 一 本 以 网 络 编 程 为 书 名 一 部 分 的 书 中 讨 论 IPC 看 似 有 点 奇 怪, 但 事 实 上 IPC 经 常 用 于 网 络 应 用 程 序 我 在 UNIX 网 络 编 程 1990 年 版 的 前 言 里 就 指 出 : 想 知 道 如 何 为 网 络 开 发 软 件, 必 须 先 理 解 进 程 间 通 信 (IPC) 与 第 1 版 的 区 别 本 书 完 全 重 写 并 扩 充 了 1990 年 版 UNIX 网 络 编 程 的 第 3 章 和 第 18 章 字 数 统 计 表 明, 现 在 的 内 容 是 第 1 版 的 5 倍 新 版 的 主 要 改 动 归 纳 如 下 不 仅 讨 论 了 System V IPC 的 三 种 形 式 ( 消 息 队 列 信 号 量 以 及 共 享 内 存 ), 还 对 实 现 了 这 些 IPC 的 新 的 Posix 函 数 进 行 了 介 绍 (1.7 节 将 详 细 介 绍 Posix 标 准 族 ) 我 认 为 使 用 Posix IPC 函 数 是 大 势 所 趋, 因 为 它 们 比 System V 中 的 相 应 部 分 更 具 优 势 讨 论 了 用 于 同 步 的 Posix 函 数 : 互 斥 锁 条 件 变 量 以 及 读 写 锁 它 们 可 用 于 线 程 或 进 程 的 同 步, 而 且 往 往 在 访 问 共 享 内 存 时 使 用 本 卷 假 定 使 用 Posix 线 程 环 境 ( 称 为 Pthreads ), 许 多 示 例 都 是 用 多 线 程 而 不 是 多 进 程 构 建 的 对 管 道 FIFO 和 记 录 锁 的 讨 论 侧 重 于 从 它 们 的 Posix 定 义 出 发 本 卷 不 仅 描 述 了 IPC 机 制 及 其 使 用 方 法, 还 实 现 了 Posix 消 息 队 列 读 写 锁 与 Posix 信 号 量 ( 都 可 以 实 现 为 用 户 库 ) 这 些 实 现 可 以 把 多 种 不 同 的 特 性 捆 绑 起 来 ( 例 如,Posix 信 号 量 的 一 种 实 现 用 到 了 互 斥 量 条 件 变 量 和 内 存 映 射 I/O), 还 强
UNIX Network Programming 前 言 iii 读 者 对 象 调 了 我 们 在 应 用 程 序 中 经 常 要 处 理 的 一 些 问 题 ( 如 竞 争 状 态 错 误 处 理 内 存 泄 漏 和 变 长 参 数 列 表 ) 理 解 某 种 特 性 的 实 现 通 常 有 助 于 了 解 如 何 使 用 该 特 性 对 RPC 的 讨 论 侧 重 于 Sun 的 RPC 包 在 此 之 前 讲 述 了 新 的 Solaris 门 API, 它 类 似 于 RPC 但 用 于 单 主 机 这 么 一 来 我 们 就 介 绍 了 许 多 在 调 用 其 他 进 程 中 的 过 程 时 需 要 考 虑 的 特 性, 而 不 用 关 心 网 络 方 面 的 细 节 本 书 既 可 以 用 作 IPC 的 教 程, 也 可 以 用 作 有 经 验 的 程 序 员 的 参 考 书 全 书 划 分 为 以 下 4 个 主 要 部 分 : 消 息 传 递 ; 同 步 ; 共 享 内 存 ; 远 程 过 程 调 用 但 许 多 读 者 可 能 只 对 特 定 的 部 分 感 兴 趣 第 2 章 总 结 了 所 有 Posix IPC 函 数 共 有 的 特 性, 第 3 章 归 纳 了 所 有 System V IPC 函 数 共 有 的 特 性, 第 12 章 介 绍 了 Posix 和 System V 的 共 享 内 存, 但 书 中 多 数 章 节 都 可 以 独 立 于 其 他 章 节 阅 读 所 有 读 者 都 应 该 阅 读 第 1 章, 尤 其 是 1.6 节, 该 节 介 绍 了 一 些 贯 穿 全 书 的 包 装 函 数 讨 论 Posix IPC 的 各 章 与 讨 论 System V IPC 的 各 章 彼 此 独 立, 有 关 管 道 FIFO 和 记 录 锁 的 几 章 不 属 于 上 述 两 个 阵 营, 关 于 RPC 的 两 章 也 独 立 于 其 他 IPC 方 法 为 了 方 便 读 者 把 本 书 作 为 参 考 书, 本 书 提 供 了 完 整 的 全 文 索 引, 并 在 最 后 几 页 总 结 了 每 个 函 数 和 结 构 的 详 细 描 述 在 正 文 中 的 哪 里 可 以 找 到 为 了 给 不 按 顺 序 阅 读 本 书 的 读 者 提 供 方 便, 我 们 在 书 中 为 各 个 主 题 提 供 了 大 量 的 交 叉 引 用 源 代 码 与 勘 误 致 谢 书 中 所 有 示 例 的 源 代 码 可 以 从 作 者 主 页 ( 列 在 前 言 的 最 后 ) 获 得 1 学 习 本 书 讲 述 的 IPC 技 术 的 最 好 方 法 就 是 下 载 这 些 程 序, 对 其 进 行 修 改 和 改 进 只 有 这 样 实 际 编 写 代 码 才 能 深 入 理 解 有 关 概 念 和 方 法 每 章 末 尾 提 供 了 大 量 的 习 题, 大 部 分 在 附 录 D 中 给 出 答 案 本 书 的 最 新 勘 误 表 也 可 以 从 作 者 主 页 获 取 尽 管 封 面 上 只 出 现 了 作 者 一 个 人 的 名 字, 但 一 本 高 质 量 的 书 的 出 版 需 要 许 多 人 的 共 同 努 力 首 先 要 感 谢 我 的 家 人, 他 们 在 我 写 书 的 那 段 时 间 里 承 担 了 一 切 再 次 感 谢 你 1 书 中 所 有 示 例 的 源 代 码 也 可 以 从 异 步 社 区 http: //www.epubit.com.cn/book/details/4088 免 费 注 册 下 载 编 者 注
iv UNIX Network Programming 前 言 版 权 说 明 们 :Sally Bill Ellen 和 David 感 谢 技 术 审 稿 人 给 出 的 宝 贵 的 反 馈 意 见 ( 打 印 出 来 有 135 页 ) 他 们 发 现 了 许 多 错 误, 指 出 了 需 要 更 多 解 释 的 地 方, 并 对 表 达 用 词 和 代 码 提 出 了 许 多 修 改 建 议, 他 们 是 Gavin Bowe Allen Briggs Dave Butenhof Wan- Teh Chang Chris Cleeland Bob Friesenhahn Andrew Gierth Scott Johnson Marty Leisner Larry McVoy Craig Metz Bob Nelson Steve Rago Jim Reid Swamy K. Sitarama Jon C. Snader Ian Lance Taylor Rich Teer 和 Andy Tucker 下 列 诸 位 通 过 电 子 邮 件 回 答 过 我 的 问 题, 有 人 甚 至 回 答 过 很 多 问 题 澄 清 这 些 问 题 提 高 了 本 书 的 准 确 性 并 改 进 了 语 言 表 达, 他 们 是 David Bausum Dave Butenhof Bill Gallmeister Mukesh Kacker Brian Kernighan Larry McVoy Steve Rago Keith Skowran Bart Smaalders Andy Tucker 和 John Wait 特 别 感 谢 GSquared 的 Larry Rafsky 提 供 了 很 多 帮 助 像 以 往 一 样, 感 谢 国 家 光 学 天 文 台 (NOAO) Sidney Wolff Richard Wolff 和 Steve Grandi, 他 们 为 我 提 供 了 网 络 与 主 机 的 访 问 权 限 DEC 公 司 的 Jim Bound Matt Thomas Mary Clouter 和 Barb Glover 提 供 了 用 于 本 书 多 数 示 例 的 Alpha 系 统 书 中 的 一 部 分 代 码 是 在 其 他 Unix 系 统 上 测 试 的 : 感 谢 Red Hat 软 件 公 司 的 Michael Johnson 提 供 了 最 新 版 本 的 Red Hat Linux, 感 谢 IBM 奥 斯 汀 实 验 室 的 Dave Marquardt 和 Jessie Haug 提 供 了 RS/6000 系 统 以 及 最 新 版 本 的 AIX 的 访 问 权 限 最 后 还 要 感 谢 Prentice Hall 的 优 秀 员 工 ( 本 书 的 编 辑 Mary Franz, 还 有 Noreen Regina Sophie Papanikolaou 和 Patti Guerrieri) 给 予 的 帮 助, 尤 其 是 在 很 紧 的 时 间 内 完 成 一 切 所 付 出 的 努 力 我 制 作 了 本 书 的 最 终 电 子 版 (PostScript 格 式 ), 最 后 排 版 成 现 在 的 书 我 用 James Clark 编 写 的 优 秀 的 groff 包 为 本 书 排 版, 该 软 件 包 安 装 在 一 台 运 行 Solaris 2.6 的 SparcStation 工 作 站 上 ( 认 为 troff 已 经 过 时 的 报 导 显 然 太 夸 张 了 ) 我 使 用 vi 编 辑 器 键 入 了 所 有 的 138 897 个 单 词, 用 gpic 程 序 绘 制 了 72 幅 插 图 ( 其 中 用 到 了 许 多 由 Gary Wright 编 写 的 宏 ), 用 gtbl 程 序 生 成 了 35 张 表 格, 为 全 书 添 加 了 索 引 ( 用 到 了 Jon Bentley 与 Brian Kernighan 编 写 的 一 组 awk 脚 本 ), 并 设 计 了 最 终 的 版 式 我 录 入 书 中 的 8 046 行 C 语 言 源 代 码, 使 用 的 是 Dave Hanson 的 loom 程 序 GNU 的 indent 程 序 和 Gary Wright 写 的 一 些 脚 本 欢 迎 读 者 以 电 子 邮 件 的 方 式 反 馈 意 见 提 出 建 议 或 订 正 错 误 W. Richard Stevens 1998 年 7 月 于 亚 利 桑 那 州 图 森 市 http://www.kohala.com/~rstevens
目 录 Part 1. Introduction / 简 介 1 Chapter 1. Introduction / 简 介 3 1.1 Introduction / 概 述 3 1.2 Processes, Threads, and the Sharing of Information / 进 程 线 程 与 信 息 共 享 5 1.3 Persistence of IPC Objects / IPC 对 象 的 持 续 性 6 1.4 Name Spaces / 名 字 空 间 7 1.5 Effect of fork, exec, and exit on IPC Objects / fork exec 和 exit 对 IPC 对 象 的 影 响 9 1.6 Error Handling: Wrapper Functions / 错 误 处 理 : 包 装 函 数 11 1.7 Unix Standards / Unix 标 准 13 1.8 Road Map to IPC Examples in the Text / 本 书 中 IPC 示 例 的 路 线 图 15 1.9 Summary / 小 结 16 Chapter 2. Posix IPC 19 2.1 Introduction / 概 述 19 2.2 IPC Names / IPC 名 字 19 2.3 Creating and Opening IPC Channels / 创 建 与 打 开 IPC 通 道 22 2.4 IPC Permissions / IPC 权 限 25 2.5 Summary / 小 结 26
ii UNIX Network Programming 目 录 Chapter 3. System V IPC 27 3.1 Introduction / 概 述 27 3.2 key_t Keys and ftok Function / key_t 键 和 ftok 函 数 28 3.3 ipc_perm Structure / ipc_perm 结 构 30 3.4 Creating and Opening IPC Channels / 创 建 与 打 开 IPC 通 道 30 3.5 IPC Permissions / IPC 权 限 32 3.6 Identifier Reuse / 标 识 符 重 用 34 3.7 ipcs and ipcrm Programs / ipcs 和 ipcrm 程 序 36 3.8 Kernel Limits / 内 核 限 制 36 3.9 Summary / 小 结 38 Part 2. Message Passing / 消 息 传 递 41 Chapter 4. Pipes and FIFOs / 管 道 和 FIFO 43 4.1 Introduction / 概 述 43 4.2 A Simple Client-Server Example / 一 个 简 单 的 客 户 - 服 务 器 示 例 43 4.3 Pipes / 管 道 44 4.4 Full-Duplex Pipes / 全 双 工 管 道 50 4.5 popen and pclose Functions / popen 和 pclose 函 数 52 4.6 FIFOs 54 4.7 Additional Properties of Pipes and FIFOs / 管 道 和 FIFO 的 额 外 属 性 58 4.8 One Server, Multiple Clients / 单 服 务 器, 多 客 户 60 4.9 Iterative versus Concurrent Servers / 迭 代 服 务 器 与 并 发 服 务 器 的 比 较 66 4.10 Streams and Messages / 流 与 消 息 67 4.11 Pipe and FIFO Limits / 管 道 和 FIFO 限 制 72 4.12 Summary / 小 结 73 Chapter 5. Posix Message Queues / Posix 消 息 队 列 75 5.1 Introduction / 概 述 75 5.2 mq_open, mq_close, and mq_unlink Functions / mq_open mq_close 和 mq_unlink 函 数 76 5.3 mq_getattr and mq_setattr Functions / mq_getattr 和 mq_setattr 函 数 79 5.4 mq_send and mq_receive Functions / mq_send 和 mq_receive 函 数 82 5.5 Message Queue Limits / 消 息 队 列 限 制 86 5.6 mq_notify Function / mq_notify 函 数 87 5.7 Posix Realtime Signals / Posix 实 时 信 号 98 5.8 Implementation Using Memory-Mapped I/O / 使 用 内 存 映 射 I/O 实 现 106 5.9 Summary / 小 结 126 Chapter 6. System V Message Queues / System V 消 息 队 列 129 6.1 Introduction / 概 述 129 6.2 msgget Function / msgget 函 数 130 6.3 msgsnd Function / msgsnd 函 数 131
UNIX Network Programming 目 录 iii 6.4 msgrcv Function / msgrcv 函 数 132 6.5 msgctl Function / msgctl 函 数 134 6.6 Simple Programs / 简 单 的 程 序 135 6.7 Client-Server Example / 客 户 - 服 务 器 示 例 140 6.8 Multiplexing Messages / 多 路 复 用 消 息 142 6.9 Message Queues with select and poll / 消 息 队 列 上 使 用 select 和 poll 151 6.10 Message Queue Limits / 消 息 队 列 限 制 152 6.11 Summary / 小 结 155 Part 3. Synchronization / 同 步 157 Chapter 7. Mutexes and Condition Variables / 互 斥 锁 和 条 件 变 量 159 7.1 Introduction / 概 述 159 7.2 Mutexes: Locking and Unlocking / 互 斥 锁 : 加 锁 与 解 锁 159 7.3 Producer-Consumer Problem / 生 产 者 - 消 费 者 问 题 161 7.4 Locking versus Waiting / 加 锁 与 等 待 165 7.5 Condition Variables: Waiting and Signaling / 条 件 变 量 : 等 待 与 信 号 发 送 167 7.6 Condition Variables: Timed Waits and Broadcasts / 条 件 变 量 : 定 时 等 待 和 广 播 171 7.7 Mutexes and Condition Variable Attributes / 互 斥 锁 和 条 件 变 量 的 属 性 172 7.8 Summary / 小 结 174 Chapter 8. Read-Write Locks / 读 写 锁 177 8.1 Introduction / 概 述 177 8.2 Obtaining and Releasing Read-Write Locks / 获 取 与 释 放 读 写 锁 178 8.3 Read-Write Lock Attributes / 读 写 锁 属 性 179 8.4 Implementation Using Mutexes and Condition Variables / 使 用 互 斥 锁 和 条 件 变 量 实 现 179 8.5 Thread Cancellation / 线 程 取 消 187 8.6 Summary / 小 结 192 Chapter 9. Record Locking / 记 录 加 锁 193 9.1 Introduction / 概 述 193 9.2 Record Locking versus File Locking / 记 录 加 锁 与 文 件 加 锁 197 9.3 Posix fcntl Record Locking /Posix fcntl 记 录 加 锁 199 9.4 Advisory Locking / 劝 告 性 加 锁 203 9.5 Mandatory Locking / 强 制 性 加 锁 204 9.6 Priorities of Readers and Writers / 读 出 者 和 写 入 者 的 优 先 级 207 9.7 Starting Only One Copy of a Daemon / 只 启 动 守 护 进 程 的 一 个 副 本 213 9.8 Lock Files / 锁 文 件 214 9.9 NFS Locking / NFS 加 锁 216 9.10 Summary / 小 结 216
iv UNIX Network Programming 目 录 Chapter 10. Posix Semaphores / Posix 信 号 量 219 10.1 Introduction / 概 述 219 10.2 sem_open, sem_close, and sem_unlink Functions / sem_open sem_close 和 sem_unlink 函 数 225 10.3 sem_wait and sem_trywait Functions / sem_wait 和 sem_trywait 函 数 226 10.4 sem_post and sem_getvalue Functions / sem_post 和 sem_getvalue 函 数 227 10.5 Simple Programs / 简 单 的 程 序 228 10.6 Producer-Consumer Problem / 生 产 者 - 消 费 者 问 题 233 10.7 File Locking / 文 件 加 锁 238 10.8 sem_init and sem_destroy Functions / sem_init 和 sem_destroy 函 数 238 10.9 Multiple Producers, One Consumer / 多 生 产 者, 单 消 费 者 242 10.10 Multiple Producers, Multiple Consumers / 多 生 产 者, 多 消 费 者 245 10.11 Multiple Buffers / 多 缓 冲 区 249 10.12 Sharing Semaphores between Processes / 进 程 间 共 享 信 号 量 256 10.13 Semaphore Limits / 信 号 量 限 制 257 10.14 Implementation Using FIFOs / 使 用 FIFO 实 现 257 10.15 Implementation Using Memory-Mapped I/O / 使 用 内 存 映 射 I/O 实 现 262 10.16 Implementation Using System V Semaphores / 使 用 System V 信 号 量 实 现 271 10.17 Summary / 小 结 278 Chapter 11. System V Semaphores / System V 信 号 量 281 11.1 Introduction / 概 述 281 11.2 semget Function / semget 函 数 282 11.3 semop Function / semop 函 数 285 11.4 semctlfunction / semctl 函 数 287 11.5 Simple Programs / 简 单 的 程 序 289 11.6 File Locking / 文 件 加 锁 294 11.7 Semaphore Limits / 信 号 量 限 制 296 11.8 Summary / 小 结 300 Part 4. Shared Memory / 共 享 内 存 301 Chapter 12. Shared Memory Introduction / 共 享 内 存 简 介 303 12.1 Introduction / 概 述 303 12.2 mmap, munmap, and msync Functions / mmap munmap 和 msync 函 数 307 12.3 Increment Counter in a Memory-Mapped File / 内 存 映 射 文 件 中 的 计 数 器 递 加 311 12.4 4.4BSD Anonymous Memory Mapping / 4.4BSD 匿 名 内 存 映 射 315 12.5 SVR4 /dev/zero Memory Mapping / SVR4 /dev/zero 内 存 映 射 316 12.6 Referencing Memory-Mapped Objects / 引 用 内 存 映 射 的 对 象 317
UNIX Network Programming 目 录 v 12.7 Summary / 小 结 322 Chapter 13. Posix Shared Memory / Posix 共 享 内 存 325 13.1 Introduction / 概 述 325 13.2 shm_open and shm_unlink Functions / shm_open 和 shm_unlink 函 数 326 13.3 ftruncate and fstat Functions / ftruncate 和 fstat 函 数 327 13.4 Simple Programs / 简 单 的 程 序 328 13.5 Incrementing a Shared Counter / 共 享 计 数 器 递 加 333 13.6 Sending Messages to a Server / 向 服 务 器 发 送 消 息 336 13.7 Summary / 小 结 342 Chapter 14. System V Shared Memory / System V 共 享 内 存 343 14.1 Introduction / 概 述 343 14.2 shmget Function / shmget 函 数 343 14.3 shmat Function / shmat 函 数 344 14.4 shmdt Function / shmdt 函 数 345 14.5 shmctl Function / shmctl 函 数 345 14.6 Simple Programs / 简 单 的 程 序 346 14.7 Shared Memory Limits / 共 享 内 存 限 制 349 14.8 Summary / 小 结 351 Part 5. Remote Procedure Calls / 远 程 过 程 调 用 353 Chapter 15. Doors / 门 355 15.1 Introduction / 概 述 355 15.2 door_call Function / door_call 函 数 361 15.3 door_create Function / door_create 函 数 363 15.4 door_return Function / door_return 函 数 364 15.5 door_cred Function / door_cred 函 数 365 15.6 door_info Function / door_info 函 数 365 15.7 Examples / 示 例 366 15.8 Descriptor Passing / 描 述 符 传 递 379 15.9 door_server_create Function / door_server_create 函 数 384 15.10 door_bind, door_unbind, and door_revoke Functions / door_bind door_unbind 和 door_revoke 函 数 390 15.11 Premature Termination of Client or Server / 客 户 或 服 务 器 的 过 早 终 止 390 15.12 Summary / 小 结 397 Chapter 16. Sun RPC 399 16.1 Introduction / 概 述 399 16.2 Multithreading / 多 线 程 技 术 407 16.3 Server Binding / 服 务 器 绑 定 411 16.4 Authentication / 鉴 别 414 16.5 Timeout and Retransmission / 超 时 和 重 传 417
vi UNIX Network Programming 目 录 16.6 Call Semantics / 调 用 语 义 422 16.7 Premature Termination of Client or Server / 客 户 或 服 务 器 的 过 早 终 止 424 16.8 XDR: External Data Representation / XDR: 外 部 数 据 表 示 426 16.9 RPC Packet Formats / RPC 分 组 格 式 444 16.10 Summary / 小 结 449 Epilogue / 后 记 453 Appendix A. Performance Measurements / 性 能 测 量 457 A.1 Introduction / 概 述 457 A.2 Results / 结 果 458 A.3 Message Passing Bandwidth Programs / 消 息 传 递 带 宽 程 序 467 A.4 Message Passing Latency Programs / 消 息 传 递 延 迟 程 序 480 A.5 Thread Synchronization Programs / 线 程 同 步 程 序 486 A.6 Process Synchronization Programs / 进 程 同 步 程 序 497 Appendix B. A Threads Primer 501 B.1 Introduction / 概 述 501 B.2 Basic Thread Functions: Creation and Termination / 基 本 线 程 函 数 : 创 建 和 终 止 502 Appendix C. Miscellaneous Source Code / 其 他 源 代 码 505 C.1 unpipc.h Header / unpipc.h 头 文 件 505 C.2 config.h Header / config.h 头 文 件 509 C.3 Standard Error Functions / 标 准 错 误 处 理 函 数 510 Appendix D. Solutions to Selected Exercises / 精 选 习 题 答 案 515 Bibliography / 参 考 文 献 535