第一章 引论 1
1.1 本指南介绍 1
1.1.1 读者 1
1.1.2 组织 1
目录 1
1.1.3 所用的约定 2
1.1.4 其它文档 3
第二章 STREAMS概述 5
2.1 什么是STREAMS? 5
图和表 6
图2—2:基于STREAMS的管道 6
图2—1:简单流 6
2.2 基本的流操作 7
图2—3:到通信驱动程序的流 8
2.3 STREAMS的组成部分 9
2.3.1 队列 9
2.3.2.1 消息类型 10
图2—4:消息 10
2.3.2 消息 10
图2—5:消息队列中的消息 11
2.3.2.2 消息入队优先级 11
2.3.3 模块 12
图2—6:有关流的细节 12
2.4 多路复用 13
2.3.4 驱动程序 13
图2—7:多对一多路转接器 14
图2—8:一对多多路转接器 14
图2—9:多对多多路转接器 15
图2—10:Internet多路转接流 15
图2—11:X.25多路转接流 16
2.5.2 操作模块 17
2.5.1 标准化的服务界面 17
2.5 STREAMS的长处 17
图2—12:协议模块可移植性 18
2.5.2.3 协议迁移 18
2.5.2.2 协议替换 18
2.5.2.1 协议可移植性 18
2.5.2.4 模块可复用性 19
图2—13:协议迁移 19
图2—14:模块可复用性 20
第三章 STREAMS机制 21
3.1 STREAMS机制概述 21
3.1.1 STREAMS系统调用 21
3.2 流的构造 21
图3—1:逆流和顺流流的构造 22
3.2.1 打开一个STREAMS设备文件 23
图3—2:流中队列关系 23
图3—3:打开的基于STREAMS的驱动程序 24
3.2.2 创建基于STREAMS的管道 25
图3—4:创建基于STREAMS的管道 26
3.2.3 添加与删除模块 26
3.2.5 流构造示例 27
3.2.4 关闭流 27
3.2.5.1 插入模块 28
图3—5:大小写转换程序模块 29
3.2.5.2 模块和驱动程序控制 29
第四章 STREAMS处理例程 33
4.1.1 put过程 33
4.1 put和service过程 33
4.2 异步协议流示例 34
4.1.2 service过程 34
图4—1:空转流配置示例 35
图4—2:可操作流示例 36
图4—3:模块put和service过程 37
4.2.1.2 CHARPROC 37
4.2.1.1 驱动程序处理 37
4.2.1 读侧处理 37
4.2.2 写侧处理 38
4.2.1.3 CANONPROC 38
4.2.3 分析 39
5.1.1 消息类型 41
5.1 消息 41
第五章 消息 41
5.1.2 需加速处理的数据 42
5.2 消息结构 42
5.2.1 消息链接 45
图5—1:消息的构成和链接 45
5.2.2 发送/接收消息 46
5.2.3 流首处理的控制 49
5.2.3.2 写偏移量 50
5.2.3.1 读任选项 50
5.3 消息队列和消息优先级 51
图5—3:具有一个优先波段的消息顺序 51
图5—2:队列中的消息排序 51
5.3.1 queue结构 54
5.3.1.1 使用queue信息 55
5.3.1.2 队列标志 55
5.3.1.3 equeue结构 56
5.3.1.4 qband结构 56
5.3.1.5 使用queue和qband信息 57
5.3.2 消息处理 58
图5—4:非EFT系统中的数据结构链接 58
5.3.2.1 流量控制 60
图5—5:流量控制 60
5.4 服务界面 63
5.4.1 服务界面的长处 64
图5—6:协议替换 64
图5—7:服务界面 65
5.4.2 服务界面库示例 66
5.4.2.1 访问服务供者 68
5.4.2.3 把数据发送给服务供者 70
5.4.2.2 关闭服务供者 70
5.4.2.4 接收数据 71
5.4.2.5 模块服务界面示例 73
5.5 消息的分配和释放 77
5.5.1 从无缓冲区中恢复 80
5.6 扩充的STREAMS缓冲区 82
6.1.1 同步输入/输出 85
第六章 轮询和信号 85
6.1 输入/输出轮询 85
6.1.2 异步输入/输出 88
6.1.3 信号 89
6.1.3.1 扩展的信号 89
6.2 流作为一个控制终端 90
6.2.1 作业控制 90
6.2.2 分配和释放 92
6.2.4 挂起信号 92
6.2.5 访问控制终端 92
6.2.3 挂断的流 92
第七章 模块和驱动程序概述 95
7.1 模块和驱动程序环境 95
7.1.1 模块和驱动程序声明 95
7.1.1.1 空模块示例 98
7.2 模块和驱动程序的ioctl 99
7.2.1 一般ioctl的处理 100
7.2.2 I_STRioctl的处理 102
7.2.3 透明的ioctl处理 103
7.2.4 透明的ioctl消息 105
7.2.5 透明的ioctl示例 106
7.2.5.1 M_COPYIN示例 107
7.2.5.2 M_COPYOUT示例 109
7.2.5.3 双向传送示例 111
7.2.6 I_LIST ioctl 115
7.3 刷清处理 116
图7—1:刷清流的写侧 118
图7—2:刷清流的读侧 119
7.4 驱动程序—核心界面 120
图7—3:影响驱动程序的界面 121
7.4.1 设备驱动程序界面和驱动程序—核心界面 122
7.4.2 STREAMS界面 122
7.5 设计准则 123
7.5.1 模块和驱动程序 123
7.5.1.1 open/close例程的规则 124
7.5.1.3 put和service过程的规则 125
7.5.1.2 ioctl的规则 125
7.5.3 前导文件 127
7.5.2.1 STREAMS数据结构的动态分配 127
7.5.2 数据结构 127
7.5.4 可访问的符号和函数 128
第八章 模块 131
8.1 模块 131
8.1.1 模块例程 131
8.1.2 过滤器模块示例 134
8.2 流量控制 137
8.3 设计准则 139
第九章 驱动程序 141
9.1 驱动程序 141
9.1.1 驱动程序概述 141
9.1.1.1 驱动程序类别 141
9.1.1.2 驱动程序配置 142
9.1.1.3 编写驱动程序 142
9.1.1.4 主设备号和次设备号 143
9.1.2 STREAMS驱动程序 144
图9—1:设备驱动程序流 145
9.1.2.1 打印机驱动程序示例 146
9.1.2.2 驱动程序流量控制 152
9.2 增殖 153
9.3 循环驱动程序 154
图9—2:循环流 154
9.4 设计准则 161
第十章 多路复用 163
10.1 多路复用 163
10.1.1 建造多路转接器 164
图10—1:协议多路转接器 164
图10—2:连接前 165
图10—3:第一次连接后的IP多路转接器 166
图10—4:IP多路转接器 167
图10—5:TP多路转接器 168
10.1.2 拆除多路转接器 169
10.2 连接/拆接下层流 170
10.1.3 通过多路转接器分路数据 170
10.2.1 连接下层流 171
10.3 多路转接器构造实例 172
10.2.2 拆接下层流 172
图10—6:连接前的Internet多路转接器 173
10.4 多路复用驱动程序 174
图10—7:连接后的Internet多路转接器 174
10.4.1 上层写put过程 177
10.4.2 上层写service过程 180
10.4.3 下层写service过程 180
10.4.4 下层读put过程 181
10.5 持续的链接 183
图10—8:MUXdriver和Driverl和open() 183
图10—9:在I_PLINK以后的多路转接器 184
图10—10:其他用户打开一个MUXdriver 185
10.6 设计准则 186
第十一章 基于STREAMS的管道和FIFO 187
11.1 创建并打开管道和FIFO 187
11.2 访问管道和FIFO 188
11.2.1 从管道或FIFO读 188
图11-1:把模块压入基于STREAMS的管道 188
11.2.2 向管道或FIFO写 189
11.2.2.1 长度为0的写 189
11.2.2.2 不可分写(atomic write) 189
11.2.3 关闭管道或FIFO 190
11.3 刷清管道和FIFO 190
11.4 命名的流 191
11.4.1 fattach 191
11.4.2 fdetach 192
11.4.3 isastream 192
11.4.4 传递文件描述字 193
11.5 唯一的连接 193
11.4.5 在远程环境中命名的流 193
图11—2:服务方建立一个管道 194
图11-3:进程X和Y打开/usr/toserv 194
第十二章 基于STREAMS的终端子系统 197
12.1 基于STREAMS的终端子系统 197
图12—1:基于STREMS的终端子系统 197
12.1.1.1 默认设置 198
12.1.1 线路规程模块 198
12.1.1.2 数据结构 199
12.1.1.3 open/close例程 199
12.1.1.4 读侧处理 200
12.1.1.5 写侧处理 201
12.1.1.6 在ldterm中的EUC处理 201
12.1.2 termiox(7)中的支持 204
12.1.3 硬件仿真模块 204
12.2 基于STREAMS的伪终端子系统 205
12.2.1 线路规程模块 206
12.2.2 伪tty仿真模块-PTEM 206
图12—2:伪tty子系统体系结构 207
12.2.2.1 数据结构 208
12.2.3 远程方式 209
12.2.2.2 open/elose例程 209
12.2.5 伪tty驱动程序-ptm和pts 210
12.2.4 分组方式 210
12.2.5.3 ptsname 213
12.2.5.2 unlockpt 213
12.2.5.1 grantpt 213
A.l streamtab 215
A.2 QUEUE结构 215
A.2.1 queue 215
附录A STREAMS数据结构 215
A.2.2 qinit 216
A.2.3 module_info 216
A.2.4 module_stat 217
A.2.5 equeue 217
A.2.6 qband 217
A.3 消息结构 218
A.4 iocblk 220
A.5 copyreq 220
A.6 copyresp 221
A.8 linkblk 222
A.7 strioctl 222
A.9 stroptions 223
B.1 消息类型 225
附录B 消息类型 225
B.2 普通消息 225
图B—1:M_PROTO和M_PCPRCTO消息结构 229
B.3 高优先级消息 233
附录C STREAMS公用程序 239
C.1 STREAMS公用程序 239
C.2 公用程序说明 239
adjmsg 调整消息中的字节 239
allocb 分配消息和数据块 240
backq 得到在给定队列之后的队列的指针 240
bcanput 在给定的优先波段内测试流量控制 240
buffcall 从allocb失败中恢复 241
canput 测试队列中的空间 241
copymsg 拷贝消息 242
datamsg 测试消息是否为数据消息 242
copyb 拷贝消息块 242
dupb 复制消息块描述字 242
enableok 重新允许队列被调度进行服务 243
esballoc 分配消息和数据块 243
dupmsg 复制消息 243
flushband 刷清在给定优先波段内的消息 243
flushq 刷清队列 244
freeb 释放单个消息块 244
freemsg 释放消息中所有消息块 244
getadmin() 返回指向模块的指针 245
getmid 返回模块id 245
getq 从队列上得到一个消息 245
insq 把一个消息放到队列上指定的地方 245
noenable 禁止队列被调度 246
msgdsize 得到消息中数据字节的数目 246
linkb 把两个消息串接成一个 246
putctl 放置一控制消息 247
putbq 把一个消息放到一个队列的开头 247
pullupmsg 串接和调整消息中的字节 247
OTHERQ 得到配偶队列的指针 247
putctll 放置一带有单字节参数的控制消息 248
putnext 把一个消息放到下一个队列上 248
putq 把一个消息放到队列上 248
qreply 以相反方向在流上发送消息 249
qsize 查出队列上消息的数目 249
qenable 启用一队列 249
RD 得到读队列的指针 250
rmvb 从消息中删除一消息块 250
rmvq 从队列上删除一消息 250
splstr 设置处理器级别 250
strlog 提交日志消息 250
strqget 获得有关队列或该队列波段的信息 251
strqset 改变有关一个队列或该队列波段的信息 252
testb 检查一个可用缓冲区 252
unbufcall 取消一个bufcall请求 252
unlinkb 从消息头删除一个消息块 252
WR 得到写队列的指针 253
C.2.1 DKI界面 253
C.3 公用程序例程汇总表 253
附录D 调试 255
D.1 crash(1M)命令 256
D.2 dump模块示例 259
D.3 出错和轨迹登记 267
图D—1:出错和轨迹登记 268
附录E 配置 269
E.1 配置STREAMS模块和驱动程序 269
E.1.1 配置示例 270
E.1.2 可调参数 272
E.2.1 用户界面 273
E.2 自动压入设施 273
附录F 手册页 277
附录G 硬件示例 329
G.1 硬件示例 329
G.1.1 3B2计算机配置机制 329
G.2 3B2基于STREAMS的端口驱动程序 329
G.2.1 数据结构 330
G.2.2 open和close例程 331
G.2.3 写put过程 332
G.2.4 写service过程 333
G.2.5 中断过程 333
G.2.6 读service过程 334
G.3 3B2基于STREAMS的控制台驱动程序 335
G.3.1 数据结构 336
G.3.2 open和close例程 336
G.3.3 读侧处理 336
G.3.3.1 中断级处理 336
G.3.3.2 服务过程处理 337
G.3.4 写侧处理 337
G.3.5 匿名方式 338
G.4 3B2基于STREAMS的XT驱动程序 338
图G—1:基于STREAMS的XT驱动程序(连接前) 339
图G—2:基于STREAMS的XT驱动程序(连接后) 340
图G—3:基于STREAMS的XT驱动程序 341
图G—4:starlan上基于STREAMS的XT驱动程序 342
G.4.1 数据结构 343
G.4.2 open处理 345
G.4.3 close处理 346
G.4.4 数据流程 346
图G—5:基于STREAMS的XT驱动程序数据流 347
G.4.5 读侧处理 347
G.4.6 写侧处理 348
G.4.8.1 STREAMS流量控制 350
G.4.8 流量控制 350
G.4.7 多路实用 350
G.4.11 编码 351
G.4.10 循环冗余检验 351
G.4.9 扫描 351
G.4.8.2 XT驱动程序协议流量控制 351
G.5 扩展的STREAMS缓冲区 352
图G—6:3B2上的UNIX I/O 353
图G—7:386上的UNIX I/O 354
词汇表 355