UNIX高级编程
分類: 图书,计算机/网络,操作系统/系统开发,UNIX Solaris ,
作者:
出 版 社: 人民邮电出版社
出版时间: 2001-4-1字数:版次: 1版1次页数: 591印刷时间:开本:印次:纸张:I S B N : 9787115091505包装: 平装内容简介
本书详尽地介绍了UNIX系统编程的高级技术。通过本书的学习,读者将能够充分利用标准的UNIX开发工具,掌握UNIX操作系统的内部工作方法,包括文件系统的内部操作以及大量UNIX函数的正确使用方法和技巧。
目录
第一部分 文件和目录
第1章 编译程序注释和选项 3
1.1 在线手册页 3
1.2 本书使用的手册索引 4
1.2.1 Internet上的man(1)资源 5
1.3 本书的实例代码 5
1.4 编译C程序 6
1.4.1 C编译命令 7
1.5 管理编译程序警告11
1.5.1 利用编译程序警告信息11
1.6 编译标准18
1.6.1 FreeBSD 3.4-Realease特征测试19
1.6.2 HPUX 10.2特征测试21
1.6.3 AIX 4.3特征测试22
1.6.4 SunOS 5.6特征测试22
1.6.5 特征测试总结23
1.7 小结24
第2章 UNIX文件系统对象25
2.1 文件系统对象25
2.1.1 常规文件25
2.1.2 目录26
2.1.3 块设备27
2.1.4 字符设备28
2.1.5 有名管道(FiFos)29
2.1.6 套接口30
2.1.7 符号链接30
2.1.8 特殊文件31
2.2 权限33
2.2.1 常规文件的访问33
2.2.2 目录的访问34
2.3 使用UNIX文件35
2.3.1 打开和关闭文件36
2.3.2 打开特殊文件38
2.3.3 使用套接口38
2.3.4 复制文件描述符38
2.3.5 改变标准输入39
2.4 UNIX文件I/O40
2.5 小结41
第3章 错误处理和报告42
3.1 确定是成功还是失败42
3.1.1 出错指示的一般规则42
3.1.2 一般规则的例外42
3.1.3 成功返回值的分类43
3.1.4 其他返回指示43
3.2 确定失败的原因43
3.3 原来的errno值44
3.3.1 按名称引用错误代码45
3.3.2 正确使用errno45
3.4 新的errno值47
3.4.1 声明新的errno值47
3.4.2 使用新的errno 值47
3.5 报告errno值47
3.5.1 使用perrno(3)值48
3.5.2 使用sys_errlist[]数组49
3.5.3 strerror(3)函数51
3.6 使用stdio(3)测试错误53
3.6.1 函数ferror(3)的缺陷53
3.6.2 避免fclose(3)的缺陷53
3.6.3 推迟错误报告54
3.7 小结55
第4章 UNIX输入和输出56
4.1 umask(2)函数和umask位56
4.1.1 权限位56
4.1.2 理解对umask的需要57
4.1.3 理解umask的作用域58
4.1.4 使用umask(2)函数58
4.1.5 使用umask值的例子58
4.1.6 umask(2) 函数59
4.1.7 create(2)函数60
4.2 读和写61
4.2.1 read(2) 和write(2)初步61
4.2.2 使用UNIX I/O62
4.3 文件内查找64
4.3.1 使用lseek(2)64
4.4 截取文件66
4.5 稀疏文件67
4.5.1 创建稀疏文件67
4.6 强迫把数据写到媒介上70
4.6.1 sync(2)函数70
4.6.2 sync(2)的缺点71
4.6.3 fsync(2)函数71
4.7 分散读写72
4.7.1 readv(2)和 writev(2)函数72
4.8 确定tty名称74
4.9 小结76
第5章 文件上锁77
5.1 理解上锁类型77
5.1.1 文件上锁技术78
5.1.2 文件上锁的限制84
5.1.3 在整个文件中使用劝告性上锁84
5.1.4 使用flock(2)上锁85
5.2 记录上锁86
5.2.1 使用lockf(2)上锁86
5.3 使用fcntl(2)实现POSIX上锁89
5.3.1 初始化struct flock89
5.3.2 上锁一个区域90
5.3.3 解锁区域90
5.3.4 获得上锁信息91
5.4 强制性上锁92
5.4.1 启用强制性上锁93
5.5 小结93
第6章 管理文件及其属性94
6.1 清除文件94
6.2 链接文件95
6.3 移动文件96
6.4 获取文件系统信息97
6.4.1 函数stat(2)98
6.4.2 函数fstat(2)100
6.4.3 使用文件属性100
6.4.4 测试文件类型107
6.4.5 修改、访问及创建时间109
6.5 测试文件的访问权限109
6.6 符号链接110
6.6.1 函数symlink(2)110
6.6.2 函数lstat(2)111
6.6.3 利用readlink(2) 读取符号链接的内容111
6.7 文件权限和所有权112
6.7.1 改变权限112
6.7.2 改变所有权113
6.8 有名管道(FIFO)114
6.9 获得尺寸和配置信息115
6.10 小结118
第7章 目录管理119
7.1 获得工作目录119
7.1.1 指定空缓冲区参数120
7.2 改变当前目录120
7.2.1 保存当前目录121
7.2.2 fchdir(2)的局限性121
7.3 建立新目录122
7.4 删除目录123
7.5 打开目录进行搜索124
7.6 关闭目录125
7.7 搜索目录125
7.8 重新回到目录的开始128
7.9 保存目录中的位置128
7.10 在目录内恢复位置129
7.11 扫描目录129
7.11.1 为scandir(3)声明自己的select 函数130
7.11.2 为scandir(3)声明自己的compar函数131
7.11.3 sysV 变体131
7.11.4 scandir(3)实例132
7.12 遍历目录结构135
7.13 改变根目录137
7.14 小结140
第8章 临时目录和处理清除141
8.1 创建临时文件141
8.1.1 使用函数tmpnam(3)141
8.1.2 使用函数mktemp(3)145
8.1.3 使用函数mkstemp(3)145
8.1.4 使用函数mkstemps(3)148
8.1.5 使用函数tmpfile(3)148
8.1.6 使用函数tempnam(3)150
8.2 使文件为临时文件153
8.2.1 使用unlink(2)使文件为临时文件153
8.2.2 退出清除153
8.2.3 使用atexit(3) 函数153
8.2.4 使用C++析构函数157
8.2.5 利用_exit(2)避免清除162
8.3 小结162
第二部分 库函数
第9章 UNIX命令行处理165
9.1 命令行约定165
9.1.1 使用多个选项165
9.1.2 组合多个选项166
9.1.3 使用带有参数的选项166
9.1.4 识别选项或参数166
9.2 选项参数166
9.3 函数getopt(3)167
9.3.1 getopt(3)外部值167
9.3.2 getopt(3)函数调用168
9.3.3 定义optstring 参数169
9.3.4 定义选项处理循环169
9.4 函数getsubopt(3)171
9.4.1 确定子选项处理的结束172
9.4.2 getsubopt(3)的完整例子173
9.5 GNU长选项扩展176
9.5.1 GNU getopt_long(3)函数176
9.5.2 理解option结构177
9.5.3 建立option结构177
9.5.4 使用空的option.flag指针177
9.5.5 使用非空option.flag 指针178
9.6 小结179
第10章 转换函数180
10.1 简单的转换函数180
10.1.1 细查函数atoi(3) 和atol(3)180
10.1.2 atof(3)函数182
10.2 使用sscanf(3)转换和验证182
10.2.1 把sscanf(3)应用到数值转换183
10.2.2 使用sscanf(3) 测试数值转换184
10.2.3 改进sscanf(3)转换184
10.2.4 sscanf(3)的局限性185
10.3 函数strtol(3)和strtoul(3)185
10.3.1 使用strtol(3)函数186
10.3.2 出错测试187
10.3.3 测试转换指针187
10.3.4 多项转换187
10.3.5 使用base参数进行基数转换188
10.3.6 测试溢出和下溢191
10.3.7 测试strtoul(3)溢出192
10.4 大整数转换193
10.5 BSD的strtoq(3)和strtouq(3)函数194
10.6 strtod(3)函数194
10.6.1 使用strtod(3)函数195
10.6.2 测试算术错误195
10.6.3 算术错误测试的流程196
10.7 小结197
第11章 UNIX日期和时间机制198
11.1 时区198
11.1.1 世界时间标准初步198
11.2 定义日期和时间数据类型200
11.3 时间转换函数200
11.3.1 使用ctime(3)把时间转换为串形式204
11.3.2 函数ctime_r(3)204
11.3.3 函数localtime(3) 和gmtime(3)205
11.3.4 struct tm的成员207
11.3.5 使用函数asctime(3)把日期/时间成份转换成串208
11.3.6 函数tzset(3)209
11.3.7 利用函数mktime(3)创建Epoch时间211
11.4 用strftime(3)定制日期和时间格式212
11.4.1 strftime(3)格式说明符213
11.4.2 实现DTime::strftime(3)方法214
11.4.3 测试类DTime215
11.4.4 理解本地设置的作用217
11.5 小结217
第12章 用户ID、口令和组管理218
12.1 UNIX用户管理入门218
12.1.1 了解用户名和用户ID号218
12.1.2 了解用户名root219
12.1.3 组名和组ID号219
12.1.4 了解gid的0值219
12.2 getuid(2)函数和geteuid(2)函数219
12.3 getgid(2)函数和getegid(2)函数220
12.4 真正的、有效的和已保存的用户ID220
12.4.1 有效的用户ID220
12.4.2 真正的用户ID220
12.4.3 已保存的用户ID221
12.4.4 身份验证角色概要221
12.5 设置用户ID221
12.6 设置组ID222
12.7 FreeBSD的issetugid(2)函数223
12.8 etc/passwd文件223
12.8.1 注释字段224
12.8.2 使用注释字段的&特征225
12.9 口令数据库例程225
12.9.1 passwd结构226
12.9.2 getpwent(3)的错误处理226
12.9.3 fgetpwent(3)函数227
12.9.4 putpwent(3)函数227
12.9.5 getpwuid(3)函数228
12.9.6 getpwnam(3)函数228
12.10 组数据库229
12.10.1 /etc/group文件229
12.10.2 getgrent(3)、setgrent(3)和endgrent(3)函数230
12.10.3 了解group结构230
12.10.4 fgetgrent(3)函数231
12.10.5 getgrgid(3)函数232
12.10.6 getgrnam(3)函数232
12.11 相关的重入函数232
12.12 辅助组233
12.12.1 getgroups(2)函数233
12.12.2 使用setgroups(2)函数设置组236
12.12.3 为指定的用户名设置组236
12.13 小结237
第13章 静态库和共享库238
13.1 静态库238
13.1.1 检测进程内存映像238
13.1.2 实现静态库239
13.1.3 使用ar(1)命令创建存档文件245
13.1.4 列出存档的目录246
13.1.5 获得存档的详细列表247
13.1.6 链接静态库247
13.2 共享库248
13.2.1 静态库的局限性248
13.2.2 创建共享库249
13.2.3 链接共享库249
13.2.4 选择静态库或动态库249
13.2.5 列出共享库的引用250
13.2.6 动态加载程序250
13.2.7 位置无关的代码252
13.2.8 控制共享内容253
13.3 静态库和共享库的比较254
13.3.1 静态库的好处254
13.3.2 共享库的优点255
13.4 动态库加载256
13.4.1 打开共享库256
13.4.2 报告错误257
13.4.3 获得共享的引用指针257
13.4.4 关闭共享库257
13.4.5 初始化和析构258
13.4.6 应用动态加载258
13.4.7 HPUX 10.2动态库加载261
13.5 小结264
第14章 数据库库例程265
14.1 NDBM数据库266
14.1.1 错误处理266
14.1.2 打开NDBM数据库267
14.1.3 关闭NDBM数据库267
14.1.4 存储信息267
14.1.5 获取信息269
14.1.6 删除信息269
14.1.7 访问所有关键字270
14.1.8 使用dbm_nextkey(3)函数删除关键字271
14.2 NDBM数据库示例272
14.2.1 目录软件272
14.2.2 Dbm类276
14.2.3 InoDb类282
14.2.4 SnapShot应用程序287
14.2.5 运行SnapShot应用程序296
14.2.6 访问所有的关键字并删除299
14.3 小结301
第三部分 高级概念
第15章 信号305
15.1 了解UNIX信号305
15.2 可靠的和不可靠的信号306
15.3 不可靠的signal(3) API306
15.4 可靠的信号API309
15.4.1 清空信号集309
15.4.2 填充信号集310
15.4.3 给信号集添加信号310
15.4.4 从信号集中删除信号311
15.4.5 测试一个集合中的信号311
15.4.6 设置信号操作312
15.4.7 信号操作标志313
15.4.8 使用可靠的信号314
15.5 控制信号315
15.5.1 阻塞信号315
15.5.2 获得等待状态的信号317
15.5.3 sigsuspend(2)函数317
15.6 应用alarm(3)函数318
15.7 从信号处理程序中调用函数321
15.7.1 避免重入代码的问题322
15.7.2 在信号处理程序中用errno报告重入的问题322
15.8 应用EINTR错误代码323
15.9 唤醒信号324
15.10 小结325
第16章 有效的I/O调度326
16.1 非阻塞的I/O326
16.1.1 在非阻塞模式下打开文件326
16.1.2 设置非阻塞模式327
16.1.3 非阻塞的I/O操作328
16.1.4 使用非阻塞I/O带来的问题330
16.2 I/O调度函数330
16.2.1 文件描述符集合以及它们的宏331
16.2.2 timeval结构332
16.2.3 select(2)函数332
16.2.4 使用select(2)函数335
16.3 I/O轮询340
16.3.1 轮询事件342
16.3.2 轮询优先级343
16.3.3 poll(2)示例343
16.4 小结347
第17章 计时器348
17.1 睡眠函数348
17.2 sleep(3)的UNIX实现350
17.2.1 以微秒为单位的睡眠353
17.2.2 以纳秒为单位的睡眠356
17.3 间隔计时器函数360
17.3.1 间隔计时器API360
17.3.2 间隔计时器宏362
17.3.3 间隔计时器的制约363
17.3.4 创建只执行一次的计时器363
17.3.5 创建重复计时器366
17.4 小结370
第18章 管道和进程371
18.1 UNIX管道371
18.1.1 创建UNIX管道371
18.1.2 将管道打开到其他进程372
18.1.3 从管道读取数据374
18.1.4 将数据写到管道375
18.1.5 关闭管道378
18.1.6 处理已破坏的管道379
18.2 不用管道的外部进程380
18.2.1 解释system(3)函数的返回值381
18.2.2 调用命令381
18.2.3 仔细考查system(3)函数384
18.3 小结385
第19章 分支进程386
19.1 UNIX分支进程概述386
19.1.1 fork(2)函数388
19.1.2 使用fork(2)388
19.2 等待进程完成390
19.2.1 僵进程390
19.2.2 wait(2)函数392
19.2.3 解释退出状态394
19.2.4 其他等待系统调用395
19.3 执行新程序397
19.4 exec(2)系列的其他成员402
19.5 小结404
第20章 模式匹配405
20.1 shell模式405
20.1.1 *元字符406
20.1.2 ?元字符406
20.1.3 [元字符和]元字符406
20.1.4 !元字符407
20.1.5 带有\的转义字符408
20.2 字符串模式函数409
20.3 glob(3)函数417
20.3.1 glob(3)函数的返回值419
20.4 小结433
第21章 正则表达式434
21.1 了解正则表达式434
21.1.1 固定符434
21.1.2 集合435
21.1.3 范围436
21.1.4 字符类436
21.1.5 .元字符436
21.1.6 加上括号的匹配子表达式437
21.1.7 原子437
21.1.8 段437
21.1.9 分支438
21.1.10 表达式边界439
21.1.11 引用的字符439
21.2 正则表达式库439
21.2.1 编译正则表达式440
21.2.2 报告错误441
21.2.3 释放正则表达式442
21.2.4 匹配正则表达式443
21.2.5 应用正则表达式444
21.3 小结450
第22章 进程间的通信451
22.1 IPC的类型451
22.2 消息队列451
22.3 共享内存453
22.4 信号量454
22.5 引用IPC资源455
22.5.1 IPC关键字值456
22.5.2 创建IPC资源456
22.5.3 根据IPC关键字访问457
22.5.4 根据IPC ID访问457
22.6 撤销IPC资源457
22.7 小结458
第23章 消息队列459
23.1 控制消息队列459
23.1.1 创建消息队列459
23.1.2 访问消息队列459
23.1.3 撤销消息队列460
23.1.4 获得消息队列的信息460
23.1.5 改变消息队列461
23.2 发送消息和接收消息462
23.2.1 发送消息462
23.2.2 接收消息464
23.3 使用消息队列465
23.4 小结485
第24章 信号量486
24.1 信号量实用程序486
24.2 创建和访问信号量集合488
24.3 撤销信号量集合491
24.4 控制信号量493
24.4.1 查询信号量集合493
24.4.2 更改信号量访问499
24.4.3 查询信号量的值502
24.4.4 查询整个信号量集合的值503
24.4.5 更改信号量的值504
24.4.6 更改整个信号量集合的值505
24.4.7 查询信号量的进程ID506
24.4.8 查询等待通知的进程数508
24.4.9 查询等待0的进程数508
24.5 使用信号量508
24.5.1 等待信号量510
24.5.2 通知信号量514
24.5.3 等待0操作514
24.5.4 信号量取消处理514
24.5.5 semop实用程序516
24.6 小结526
第25章 共享内存527
25.1 globvar实用程序527
25.1.1 创建全局变量池528
25.1.2 撤销全局变量池528
25.1.3 globvar环境变量529
25.1.4 创建全局变量529
25.1.5 访问全局变量529
25.1.6 删除全局变量530
25.1.7 清除全局变量池530
25.2 共享内存系统调用530
25.2.1 创建和访问共享内存531
25.2.2 获取共享内存的信息533
25.2.3 更改共享内存属性535
25.2.4 连接共享内存536
25.2.5 释放共享内存537
25.2.6 撤销共享内存539
25.3 使用共享内存539
25.4 小结551
第26章 内存映射的文件552
26.1 确定页面的大小553
26.2 创建内存的映射554
26.3 控制内存映射的区域563
26.3.1 更改访问保护563
26.3.2 通知核心内存的使用情况564
26.3.3 查询内存中的页面567
26.3.4 同步更改568
26.4 撤销内存映射569
26.5 小结570
第27章 X Window编程571
27.1 事件驱动的编程571
27.1.1 事件驱动的模型572
27.1.2 客户/服务器处理572
27.1.3 软件层次573
27.2 Xlib客户程序575
27.3 小结591