1.2 应用编程 1
前言 1
0.1 目的 1
0.2 读者和所需的预备知识 1
0.3 组织 1
图2—3 终端I/O的系统调用 (1 1
图2—2 高级文件I/O的系统调用 (1 1
目录 1
第一章 应用编程介绍 1
1.1 引言 1
1.4 UNIX系统环境支持的语言及其有关资料 2
1.3 UNIX系统工具以及有关资料 2
1.3.1 本指南中涉及的工具和未涉及的工具 2
0.6 记号约定 2
0.5 硬件/软件依赖性 2
0.4 与C的关系 2
0.8 示例信息 3
0.7 命令索引 3
1.4.1 C语言 3
1.4.2 shell 3
1.4.3 awk 3
1.4.4 lex 4
1.4.5 yacc 4
1.4.6 m4 4
1.4.7 bc和dc 5
1.4.8 curses 5
1.4.9 FM LI 5
1.4.10 ETI 5
图和表 7
图1—1 一个简单的ETI程序 7
1.4.11 XWIN图形窗口系统 7
1.4.12 OPEN LOOK图形用户界面 7
2.1 引言 9
2.2 系统调用 9
第二章 UNIX系统环境中的应用编程 9
图2—1 基本的文件I/O的系统调用 10
2.2.3 高级的文件I/O 10
2.2.2 基本的文件I/O 10
2.2.1 出错处理 10
2.2.5 进程 11
2.2.4 终端I/O 11
图2—4 进程的系统调用 12
2.2.5.1 进程概述 12
2.2.5.2 exec(2) 13
图2—5 进程状态 13
2.2.5.3 fork(2) 14
图2—6 fork的例子 14
2.2.7 高级的进程间通信 15
2.2.6 基本的进程间通信 15
图2—7 高级进程间通信的系统调用 15
2.2.8 存储管理 15
2.2.9 文件系统控制 16
2.2.10 信号 16
图2—8 存储管理的系统调用 16
图2—9 文件系统控制的系统调用 16
图2—10 信号的系统调用 16
2.2.10.2 信号类型 17
2.2.10.1 信号概述 17
2.2.10.3 信号处理程序 18
2.2.10.5 保护临界区 19
2.2.10.4 发送信号 19
2.2.11 杂类系统调用 20
2.2.10.6 信号栈 20
图2—11 杂类系统调用 21
2.3.1 文件和记录加锁 21
2.3 应用软件的开发 21
2.3.1.1 何处能找到详细信息 22
2.3.2 进程间通信 22
2.3.3 进程调度 23
2.3.3.1 何处能找到详细信息 23
2.3.2.1 何处能找到详细信息 23
2.3.4 符号连结 24
2.3.6 数据合法性确认工具 25
2.3.5.2 何处能找到详细信息 25
2.3.5.1 存储映象界面 25
2.3.5 存储管理 25
2.3.4.1 何处能找到详细信息 25
2.4.1 打包应用软件 26
2.3.6.1 何处能找到详细信息 26
2.4 软件包的开发和安装 26
2.4.1.1 何处能找到详细信息 27
2.4.2 修改sysadm界面 27
2.4.2.1 何处能找到详细信息 28
第三章 文件和记录的加锁 29
3.1 引言 29
3.2 术语 29
3.3 文件保护 30
3.3.1 为记录加锁打开一文件 30
3.3.2 设置文件锁 31
3.3.3 设置和取消记录锁 33
3.3.4 获取加锁信息 37
3.3.5 死锁处理 39
3.4 选择咨询加锁或强制加锁 39
3.4.2 记录加锁和未来的U NIX系统 本 40
3.4.1 强制加锁使用注意事项 40
4.1 引言 41
第四章 进程间通信 41
4.2.1 使用消息 42
4.2 消息 42
图4—1 ipc-perm数据结构 44
4.2.2.1 使用msgget 45
4.2.2 得到消息队列 45
图4—2 操作权限代码 46
4.2.2.2 实例程序 47
图4—3 msgget系统调用实例 48
4.2.3 控制消息队列 49
4.2.3.1 使用msgctl 49
4.2.3.2 实例程序 50
图4—4 msgctl系统调用实例 52
4.2.4 对消息的操作 54
4.2.4.1 使用msgop 54
4.2.4.2 实例程序 56
8.7.2 安装参数 (1 59
图4—5 msgop系统调用实例 59
4.3 信号量 62
4.3.1 使用信号量 64
4.3.2 得到信号量 66
4.3.2.1 使用semget 66
图4—6 操作权限代码 67
4.3.2.2 实例程序 68
图4—7 semget系统调用实例 69
4.3.3.1 使用semctl 71
4.3.3 控制信号量 71
4.3.3.2 实例程序 72
图4—8 semctl系统调用实例 75
4.3.4 信号量上的操作 79
4.3.4.1 使用semop 80
4.3.4.2 实例程序 81
图4—9 semop系统调用实例 82
4.4 共享内存 84
4.4.1 使用共享内存 85
4.4.2 得到共享内存段 87
4.4.2.1 使用shmget 87
图4—10 操作权限代码 88
4.4.2.2 实例程序 89
图4—11 shmget系统调用实例 90
4.4.3 控制共享内存 91
4.4.3.1 使用shmctl 92
4.4.3.2 实例程序 92
图4—12 shmctl系统调用实例 94
4.4.4 对共享内存的操作 97
4.4.4.1 使用shmop 97
4.4.4.2 实例程序 98
图4—13 shmop系统调用实例 100
第五章 进程调度程序 103
5.1 引言 103
5.2 进程调度程序概述 104
图5—1 系统V4.0版的进程调度程序 104
5.2.2 系统类调度 105
5.2.1 分时类调度 105
图5—2 进程优先级(程序员角度) 106
5.2.3 实时类调度 106
5.3 命令与函数调用 106
5.3.1 priocnl命令 108
5.3.2 priocnl系统调用 111
5.3.2.1 PC-GETCID PC-GETCLINFO 112
5.3.2.2 PC-GETPARMS PC-SETPARMS 116
图5—3 PC-CETPARMS的返回值 117
5.3.3 priocntlset系统调用 120
5.4 与其他函数的相互作用 123
5.4.1 核心进程 123
5.4.2 fork,exec 123
5.4.3 nice 123
5.4.4 init 123
5.5 性能 123
5.5.1 进程状态转换 124
图5—4 进程状态转换图 124
5.5.2 软件延时 125
5.5.3 用于实时U块的内存 126
6.1 引言 127
第六章 符号连结 127
6.2 符号连结的使用 128
6.2.1 符号连结的特征 128
6.2.2 符号连结的创建 129
6.2.2.1 语义规则和语法规则 129
图6—1 符号连结文件树 129
6.2.2.2 例子 130
6.2.3 符号连结的删除 131
6.2.4 符号连结的存取 131
6.2.5 符号连结的拷贝 131
6.2.6 符号连结的连结 131
6.2.7 符号连结的改名 132
6.2.8 归档命令 132
6.2.9 文件属主和存取权限 133
6.2.10 在RFS中使用符号连结 133
图6—2 RFS中的符号连结例1 134
图6—3 RFS中的符号连结例2 135
第七章 存贮管理 137
7.1 虚拟存贮系统概述 137
7.1.1 虚存、地址空间和映射 137
7.1.2 网络、异机种和一致性 138
7.2 存贮管理界面 138
7.2.1 创建和使用映射 139
7.2.2 删除映射 142
7.2.3 高速缓存控制 142
7.3 地址空间的布局 145
7.2.4 其他映射函数 145
第八章 打包应用软件 147
8.1 软件打包概述 147
8.2 软件包的内容 147
8.2.1 必要的成分 147
8.2.2 可选的软件包信息文件 148
图8—1 软件包的内容 148
8.2.3 可选的安装脚本 149
8.3 软件包的结构生命周期 149
8.4 打包工具 150
8.4.1 pkgmk命令 150
8.4.3 pkgproto命令 151
8.5 安装工具 151
8.4.2 pkgtrans命令 151
图8—2 样本pkginfo文件 152
8.6.1 pkginfo文件 152
8.6 软件包信息文件 152
8.6.2.1 描述行 153
8.6.2 prototype文件 153
图8—3 样本#1prototype文件 154
8.6.2.2 命令行 154
图8—4 样本#2protoype文件 155
图8—5 样本compver文件 155
8.6.3 compver文件 155
8.6.5 depend文件 156
8.6.4 copyright文件 156
图8—6 样本copyright文件 156
图8—7 样本depend文件 157
图8—8 样本space文件 157
8.6.6 space文件 157
8.6.7 pkgmap文件 158
8.7 安装脚本 158
8.7.1 脚本处理 158
8.7.3 为脚本获取软件包信息 160
8.7.4 脚本的退出码 160
8.7.5 请求脚本 160
8.7.5.1 请求脚本的命名约定 161
8.7.6 类动作脚本 161
8.7.5.2 请求脚本的使用规则 161
图8—9 把参数存放到安装环境中 161
8.7.6.1 类动作脚本的命名约定 162
8.7.6.2 类动作脚本的使用规则 162
8.7.6.3 类的安装 162
8.7.6.4 类的删除 163
8.7.7 特别系统类 164
8.7.7.1 sed类脚本 164
图8—10 sed脚本格式 164
图8—11 awk脚本格式 165
8.7.8 过程脚本 165
8.7.7.2 awk类脚本 165
8.7.7.3 build类脚本 165
8.7.8.1 过程脚本的命名约定 166
8.7.8.2 过程脚本的使 用规则 166
8.8 打包的基本步骤 166
8.9 指定软件包的缩写名 168
8.10 定义软件包实例 168
8.10.1 标识一个软件包实例 168
8.10.2 在你的脚本中存取实例标识符 169
8.11 编写安装脚本 169
8.12 使软件包对象可重定位 169
8.12.1 定义群体可重定位对象 170
8.12.2 定义个别可重定位对象 170
8.13 对象分类 170
8.14 定义软件包的依赖性 171
8.15 编写版权信息 171
8.17 创建pkginfo文件 172
8.18 创建prototype文件 172
8.16 在安装机器上保留附加空间 172
8.18.1.2 映射开发路径名到安装路径名上 173
8.18.1.1 创建连接 173
8.18.1.3 定义pkgadd创建的对象 173
8.18.1 手工创建prototype文件 173
8.18.2 用pkgproto创建文件 174
8.18.2.1 创建一个基本的prototype文件 174
8.18.1.4 使用命令行 174
8.18.2.2 为对象指定类 175
8.18.2.3 用pkgproto重新命名路径名 175
8.19 把软件包分布在多个卷上 176
8.20 用pkgmk创建软件包 176
8.18.2.4 pkgproto和links 176
8.20.2 帮助pkgmk确定软件包内容 177
8.21 用pkgtrans创建软件包 177
8.20.1 创建软件包实例 177
8.21.1 创建数据流软件包 178
8.21.2 转换软件包实例 178
8.22 打包过程的快速引用 179
9.1.1 工具介绍 181
9.1 sysadm修改的概述 181
9.1.1.1 edsysadm命令 181
第九章 修改sysadm界面 181
9.1.1.2 delsysadm命令 182
9.1.1.3 数据合法性确认工具 182
9.1.2 打包修改文件的介绍 183
9.1.3 界面修改过程的概述 183
9.2 设计你的界面修改 184
9.2.1 决定是否你应该修改界面 184
9.2.2 设计你的修改位置 184
9.2.2.1 界面结构概貌 184
9.2.2.2 设计你的管理结构 185
9.2.3 命名你的界面修改 186
9.2.3.1 如何命名你的修改 186
9.2.3.2 界面命名的要求 186
9.2.3.3 系统如何处理命名冲突 186
9.4.1 条目求助文件 187
9.3 编写管理操作 187
9.4 编写求助消息 187
9.4.1.2 默认标题格式 188
9.4.1.1 菜单条目求助的消息格式 188
9.4.1.3 字段条目求助的消息格式 189
9.4.2 标题层次 190
9.4.3 在FACE对象中建立条目求助 190
图9—1 一个表格的项目求助文件 191
9.4.4 条目求助文件的举例 191
图9—2 多个表格的条目求助文件 192
9.5 打包你的界面修改 193
9.5.1 打包你的修改的基本步骤 193
9.5.2 为一个菜单项建立或改变打包 193
9.5.2.1 为一个菜单项建立打包 193
9.5.2.2 为一个菜单项改变打包 194
9.5.2.4 菜单定义表格 195
9.5.2.3 联机测试你的菜单改变 195
9.5.3 为一个任务项建立或改变打包 196
9.5.3.1 为一个任务项建立打包 196
9.5.3.2 为一个任务项改变打包 197
9.5.3.3 任务定义表格 198
9.6 准备你的软件包 199
9.7 删除界面修改 200
10.3 工具的特性 201
10.2 工具的类型 201
10.1 工具的介绍 201
第十章 数据合法性确认工具 201
10.3.2 数据合法性确认工具求助消息 202
10.3.1 数据合法性确认工具提示符 202
10.3.5 shell命令 203
10.3.4 消息格式化 203
10.3.3 数据合法性确认工具的出错消息 203
图10—1 shell命令 204
图10—2 直观工具 205
10.3.6 直观工具 205
附录A liber,一个图书馆系统 207
附录B 命令手册页 219
C.1 引言 273
附录C 软件包安装实例分析 273
C.2 实例#1 273
C.2.1 技术 273
C.2.2 方法 273
C.2.3 样本文件 274
图C—1 实例#1pkginfo文件 274
图C—2 实例#1prototype文件 275
图C—3 实例分析#1请求脚本 276
C.3 实例#2 277
C.3.1 技术 277
C.3.2 方法 277
图C—5 实例#2 pkginfo文件 278
C.3.3 样本文件 278
图C—4 实例#2prototype文件 278
图C—6 实例#2 请求脚本 279
图C—7 实例#2 postinstall脚本 280
C.4 实例#3 281
C.4.2 方法 281
C.4.1 技术 281
图C—8 实例#3 pkginfo文件 282
图C—9 实例#3 prototype文件 282
C.4.3 样本文件 282
图C—10 实例#3 space文件 283
图C—11 实例#3 安装类动作脚本(i·admin) 283
图C—12 实例#删除类动作脚本(r·cfgdata) 284
C.5 实例#4 284
C.5.1 技术 284
C.5.2 方法 284
图C—13 实例#4 pkginfo文件 285
图C—14 实例#4 copright文件 285
C.5.3 样本文件 285
图C—15 实例#4 compver文件 286
C.6 实例#5a 286
C.6.1 技术 286
图C—16 实例#4 depend文件 286
C.6.2 方法 287
图C—17 实例#5a pkginfo文件 288
图C—18 实例#5a prototype文件 288
图C—19 实例#5a sed脚本(/sbin/inittab) 288
C.6.3 样本文件 288
图C—20 实例#5a postinstall脚本 289
C.7 实例#5b 289
C.7.1 技术 289
C.7.2 方法 289
图C—21 实例#5b pkginfo文件 290
图C—22 实例#5b prototype文件 290
C.7.3 样本文件 290
图C—23 实例#5b安装类动作脚本(i.inittab) 291
图C—24 实例#5b删除类动作脚本(r·inittanb) 291
图C—25 实例#5c inittab文件 292
C.8.2 方法 292
C.8 实例#5c 292
C.8.1 技术 292
C.8.3 样本文件 293
图C—26 实例#5c pkginfo文件 293
图C—27 实例#5c prototype文件 293
C.9.2 方法 294
C.9.1 技术 294
C.9 实例#6 294
图C—28 实例#5c balld脚本(/sbin/init) 294
C.9.3 样本文件 295
图C—29 实例#6pkginfo文件 295
图C—30 实例#6prototype文件 296
图C—31 实例#6安装类别动作脚本(i·cron) 296
图C—32 实例#6删除类别动作脚本(r·cron) 297
图C—33 实例#6根crontab文件(与软件包一起传送) 297
图C—34 实例#6syscrontab文件(与软件包一起传送) 297