书籍详情
Linux 应用程序开发
作者:(美)约翰逊(Johnson, M.K.), (美)特罗安(Troan, E.W.)著;武延军, 郭松柳译
出版社:电子工业出版社
出版时间:2005-11-01
ISBN:9787121017957
定价:¥59.00
购买这本书可以去
内容简介
本书介绍了Linux环境下进行应用程序开发需要掌握的知识,对许多编程实践中经常遇到的内容进行了详细的讲解,并且提供了典型的实例加以说明。 全书分为四个部分。第1部分是初学者需要了解的知识,包括Linux的历史、从事自由软件开发需要了解的版权知识和GPL等许可证,以及如何获取和使用在线文档系统。第2部分介绍了开发环境和工具。其中包括Vi,emacs编辑器,gdb调试器的使用,gcc的选项和扩展,GNU C库的基本知识,内存溢出和泄漏的调试工具,如何创建、使用、管理静态库和动态库,以及如何通过系统调用请求系统服务。第3部分详细介绍了Linux系统编程知识。其中包括进程模型,简单文件管理,信号处理,高级文件操作,目录操作,作业控制,终端与伪终端,socket网络,时I司和定时器,随机数,虚拟控制台,Linux控制台,以及如何编写安全的程序。第4部分精选了Linux编程中最常用的开发库进行介绍。其中包括字符串匹配,用于终端编程的S-lang库,基于散列的数据库函数库,命令行解析库,如何运行时动态加载共享对象,以及有关用户身份识别和验证的库。 本书内容丰富、实用,语言通俗,不仅适合初学者学习,也适合熟悉Unix环境编程的高级开发人员参考。
作者简介
MichaelK.Johson是Specifix的操作系统工程师。他曾是RedHat的操作系统开发人员,在那里他管理一个内核开发小组长达3年半,是Fedora项目基础技术的领导。他也曾做过有关Linux应用程序开发的全日制的教学工作。ErikW.Troan是Specifix的操作系统的合伙创始人和执行副总裁。他曾经是RedHat产品工程部的副总裁,负责规格描述和创建技术,例如RPM、Linux操作系统,RedHat网络、高性能服务器以及RedHat网站的基础设施。
目录
第1部分 起步
第1章 Linux的发展历史 2
1.1 自由Unix软件简史 3
1.2 Linux的发展 4
1.3 Unix系统的概念谱系 5
1.4 Linux谱系 7
第2章 许可证和版权 8
2.1 版权 8
2.2 许可 10
2.3 自由软件许可证 10
2.3.1 GNU通用公共许可证 11
2.3.2 GNU库通用公共许可证 12
2.3.3 MIT/X/BSD风格的许可证 12
2.3.4 旧BSD风格的许可证 12
2.3.5 艺术许可证 12
2.3.6 许可证的不兼容性 13
第3章 在线系统文档 14
3.1 man手册页 14
3.2 info手册页 15
3.3 其他文档 15
第2部分 开发工具和环境
第4章 开发工具 18
4.1 编辑器 19
4.1.1 Emacs 20
4.1.2 vi 21
4.2 Make 21
4.2.1 复杂命令行 24
4.2.2 变量 25
4.2.3 后缀规则 26
4.3 GNU的调试器 27
4.4 跟踪程序行为 31
第5章 gcc的选项和扩展 33
5.1 gcc选项 33
5.2 头文件 36
5.2.1 long long 36
5.2.2 内嵌函数 36
5.2.3 可选择的扩展关键字 36
5.2.4 特征 37
第6章 GNC的C语言库 38
6.1 特征选择 38
6.2 POSIX接口 40
6.2.1 POSIX要求的类型 40
6.2.2 发现运行时的权能 42
6.2.3 查找和设置基本系统信息 43
6.3 兼容性 45
第7章 内存调试工具 46
7.1 存在Bug的代码 46
7.2 glibc的内存检查工具 48
7.2.1 发现内存堆的损坏 49
7.2.2 使用mtrace()来跟踪分配情况 52
7.3 利用mpr找到内存泄露 53
7.4 利用valgrind发现内存错误 55
7.5 电网 60
7.5.1 使用电网 61
7.5.2 内存对齐 61
7.5.3 其他特性 63
7.5.4 局限性 63
7.5.5 资源消耗 63
第8章 创建和使用库 65
8.1 静态库 65
8.2 共享库 66
8.3 设计共享库 67
8.3.1 管理兼容性 67
8.3.2 不兼容的库 68
8.3.3 设计兼容的库 68
8.4 构造共享库 69
8.5 安装共享库 70
例子 71
8.6 使用共享库 72
8.6.1 使用无须安装的库 73
8.6.2 提前装载库 73
第9章 Linux系统环境 75
9.1 进程环境 75
9.2 理解系统调用 76
9.2.1 系统调用的限制 77
9.2.2 系统调用的返回码 77
9.2.3 使用系统调用 79
9.2.4 通用错误返回码 80
9.3 查找头文件和库文件 85
第3部分 系统编程
第10章 进程模型 88
10.1 定义进程 88
10.1.1 使用线程的复杂性 88
10.1.2 Linux的方式 89
10.2 进程属性 89
10.2.1 pid及其生成 89
10.2.2 信用状 90
10.2.3 文件系统用户标识符 94
10.2.4 关于uid和gid的总结 95
10.3 进程信息 96
10.3.1 程序参数 97
10.3.2 资源的使用 98
10.3.3 建立使用限制 100
10.4 进程基本元素 101
10.4.1 创建子进程 102
10.4.2 等待子进程结束 103
10.4.3 运行新程序 104
10.4.4 用vfork()更快速地创建进程 106
10.4.5 自我终止 107
10.4.6 终止其他进程 107
10.4.7 转储内核文件信息 109
10.5 简单子进程 109
10.5.1 用system()运行和等待 109
10.5.2 从进程读或写 110
10.6 会话和进程组 112
10.6.1 会话 113
10.6.2 控制终端 113
10.6.3 进程组 113
10.6.4 孤儿进程组 114
10.7 介绍ladsh 115
用ladsh运行外部程序 116
10.8 创建克隆 129
第11章 简单的文件管理 130
11.1 文件模式 132
11.1.1 文件访问权限 133
11.1.2 文件权限修饰符 134
11.1.3 文件类型 136
11.1.4 进程的umask 137
11.2 基本的文件操作 138
11.2.1 文件描述符 138
11.2.2 关闭文件 139
11.2.3 在文件系统中打开文件 139
11.2.4 文件的读、写以及位置
11.2.4 指针的移动 141
11.2.5 局部读和写 145
11.2.6 缩短文件 147
11.2.7 同步文件 147
11.2.8 其他操作 148
11.3 查询和修改Inode信息 149
11.3.1 查找Inode信息 149
11.3.2 一个使用stat()的简单示例 150
11.3.3 轻松确定访问权限 152
11.3.4 改变文件的访问权限 153
11.3.5 改变文件的所有者和组 153
11.3.6 改变文件的时间戳 154
11.3.7 Ext3扩展属性 155
11.4 操作目录项 159
11.4.1 创建设备文件以及命名管道的目录项 160
11.4.2 创建硬链接 162
11.4.3 使用符号链接 163
11.4.4 删除文件 164
11.4.5 重命名文件 164
11.5 操作文件描述符 165
11.5.1 改变打开文件的访问模式 165
11.5.2 修改close-on-exec标志 166
11.5.3 复制文件描述符 166
11.6 创建无名管道 167
11.7 对ladsh添加重定向 168
11.7.1 数据结构 168
11.7.2 修改代码 169
第12章 信号处理 172
12.1 信号的概念 173
12.1.1 信号的生命周期 173
12.1.2 简单信号 173
12.1.3 可靠信号 175
12.1.4 信号和系统调用 176
12.2 Linux(和POSIX)信号系统的API 177
12.2.1 发送信号 177
12.2.2 使用sigset_t 178
12.2.3 捕捉信号 178
12.2.4 操作一个进程的信号掩码 180
12.2.5 找到等待信号的集合 182
12.2.6 等待信号 182
12.3 有效信号 183
描述信号 187
12.4 编写信号处理程序 188
12.5 重新打开日志文件 190
12.6 实时信号 193
信号队列和排序 193
12.7 获取信号的信息 196
12.7.1 得到一个信号的上下文 196
12.7.2 使用信号发送数据 202
第13章 高级文件操作 205
13.1 多路输入输出 205
13.1.1 非阻塞I/O 208
13.1.2 用poll()的多路传输 209
13.1.3 使用select()的多路传输 213
13.1.4 比较poll()和select() 217
13.1.5 使用epoll进行多路传输 220
13.1.6 比较poll()和epoll 225
13.2 内存映射 229
13.2.1 页对齐 230
13.2.2 建立内存映射 230
13.2.3 撤销映射区域 235
13.2.4 同步内存区域到磁盘 235
13.2.5 锁定内存区域 236
13.3 文件锁定 237
13.3.1 文件锁 238
13.3.2 记录锁 239
13.3.3 强制锁 245
13.3.4 租赁文件 245
13.4 read()和write()的替代方法 249
13.4.1 分散/聚集的读和写 249
13.4.2 忽略文件指针 251
第14章 目录操作 253
14.1 当前工作目录 253
14.1.1 查找当前工作目录 253
14.1.2 特殊文件“.”和“..” 255
14.1.3 当前目录 255
14.2 改变根目录 256
14.3 创建和删除目录 256
14.3.1 创建新目录 256
14.3.2 删除目录 257
14.4 读取目录的内容 257
再次读取目录内容 259
14.5 文件名匹配搜索 259
14.5.1 使用子进程 260
14.5.2 内在匹配搜索 261
14.6 为ladsh增加目录和匹配功能 265
14.6.1 增加cd和pwd 266
14.6.2 增加文件名匹配查询 267
14.7 遍历文件系统的树结构 270
14.7.1 使用ftw() 270
14.7.2 用nftw()函数进行文件树遍历 272
14.7.3 实现find功能 274
14.8 目录变更提示 276
第15章 作业控制 284
15.1 作业控制基础 284
15.1.1 重新启动进程 284
15.1.2 停止进程 285
15.1.3 处理作业控制信号 285
15.2 ladsh中的作业控制 287
第16章 终端与伪终端 293
16.1 tty操作 294
16.1.1 终端实用函数 294
16.1.2 控制终端 295
16.1.3 终端所有权 296
16.1.4 用utemper工具进行记录 297
16.1.5 手工记录 298
16.2 termios概述 308
16.3 termios实例 309
16.3.1 密码 309
16.3.2 串行通信 311
16.4 termios调试 325
16.5 termios参考 326
16.5.1 函数 327
16.5.2 窗口尺寸 330
16.5.3 标志位 331
16.5.4 输入模式标记 332
16.5.5 输出模式标记 334
16.5.6 控制模式标记 335
16.5.7 控制模式字符 336
16.5.8 本地模式标记 338
16.5.9 控制read() 340
16.6 伪终端 341
16.6.1 打开伪终端 342
16.6.2 打开伪终端的简单方法 343
16.6.3 打开伪终端的复杂方法 344
16.6.4 伪终端范例 348
第17章 socket网络 358
17.1 协议支持 358
17.1.1 理想的网络 358
17.1.2 实际的网络 359
17.1.3 让实际的网络变得理想 360
17.1.4 地址 360
17.2 实用函数 361
17.3 基本套接字操作 362
17.3.1 建立一个套接字 362
17.3.2 建立连接 364
17.3.3 将地址绑定到套接字 364
17.3.4 等待连接 364
17.3.5 连接到一个服务器 365
17.3.6 找到连接地址 366
17.4 Unix域套接字 367
17.4.1 Unix域地址 367
17.4.2 等待一个连接 368
17.4.3 连接到一个服务器 370
17.4.4 运行Unix域的示例 371
17.4.5 未命名的Unix域套接字 371
17.4.6 传递文件描述符 372
17.5 基于TCP/IP协议的联网机器 377
17.5.1 字节存储顺序 377
17.5.2 IPv4地址 378
17.5.3 IPv6地址 380
17.5.4 IP地址的操作 382
17.5.5 转换名称到地址 384
17.5.6 转换地址到名称 395
17.5.7 监听TCP连接 400
17.5.8 TCP客户端应用程序 403
17.6 使用UDP数据报 404
17.6.1 创建一个UDP套接字 405
17.6.2 发送和接收数据报 406
17.6.3 一个简单的tftp服务器 407
17.7 套接字错误 413
17.8 旧的网络函数 415
17.8.1 IPv4地址操作 415
17.8.2 主机名解析 417
17.8.3 旧的主机信息查找范例 418
17.8.4 查找端口号 420
第18章 时间 423
18.1 获取时间和日期 423
18.1.1 时间和日期的表示 423
18.1.2 时间的转换,格式化和解析 426
18.1.3 时间的限制 429
18.2 使用计时器 431
18.2.1 休眠 431
18.2.2 间隔计时器 432
第19章 随机数 436
19.1 伪随机数 436
19.2 密码系统和随机数 437
第20章 虚拟控制台编程 439
20.1 起步 440
20.2 发出峰鸣声 442
20.3 判断终端是否为虚拟控制台 443
20.4 查找当前虚拟控制台 443
20.5 管理虚拟控制台的切换 444
20.6 范例:open命令 447
第21章 Linux控制台 449
21.1 权能数据库 450
21.2 图标,字符和映射 451
21.3 Linux控制台权能 452
21.3.1 控制字符 453
21.3.2 转义字符序列 454
21.3.3 测试序列 455
21.3.4 复杂转义字符序列 456
21.4 直接写屏幕 461
第22章 编写安全程序 464
22.1 安全何时重要 464
安全何时失效 465
22.2 最小化攻击时机 466
22.2.1 放弃权限 466
22.2.2 采用辅助手段 467
22.2.3 限制文件系统的访问 468
22.3 常见的安全漏洞 469
22.3.1 缓冲区溢出 469
22.3.2 解析文件名 474
22.3.3 环境变量 474
22.3.4 运行Shell 475
22.3.5 创建临时文件 476
22.3.6 竞争状态和信号处理 478
22.3.7 关闭文件描述符 478
22.4 作为守护进程运行 479
第4部分 开发库
第23章 字符串的匹配 482
23.1 匹配任意字符串 482
23.2 正则表达式 483
23.2.1 Linux正则表达式 483
23.2.2 正则表达式的匹配 484
23.2.3 一个简单的grep示例 489
第24章 用S-Lang来处理终端 495
24.1 输入处理 495
24.1.1 初始化S-Lang的输入处理 496
24.1.2 恢复终端状态 497
24.1.3 从终端读取字符 497
24.1.4 检查未决的输入 498
24.2 输出处理 498
24.2.1 初始化屏幕管理 499
24.2.2 更新显示 499
24.2.3 移动光标 499
24.2.4 结束屏幕管理 500
24.2.5 屏幕管理的框架程序 500
24.2.6 切换字符集 501
24.2.7 输出到屏幕 502
24.2.8 画线和画矩形 503
24.2.9 使用颜色 505
第25章 基于散列的数据库函数库 508
25.1 概述 508
25.2 基本操作 509
25.2.1 打开qdbm文件 509
25.2.2 关闭数据库 510
25.2.3 获得文件描述符 511
25.2.4 同步数据库 511
25.3 读取记录 512
25.3.1 读取特定的记录 512
25.3.2 顺序读取记录 513
25.4 修改数据库 513
25.4.1 增加记录 513
25.4.2 删除记录 514
25.5 实例 514
第26章 解析命令行选项 521
26.1 选项表 522
26.1.1 定义选项 522
26.1.2 嵌套选项表 525
26.2 使用选项表 526
26.2.1 创建上下文 526
26.2.2 解析命令行 527
26.2.3 剩余的参数 528
26.2.4 自动帮助信息 528
26.3 使用回调(callback) 531
26.4 错误处理 534
26.5 选项别名 536
26.5.1 指定别名 536
26.5.2 使别名生效 537
26.6 解析参数字符串 538
26.7 处理额外参数 538
26.8 应用程序示例 538
第27章 运行时动态加载 540
动态加载接口 541
示例 544
第28章 用户识别和验证 546
28.1 ID到名字的转换 546
示例:id命令 549
28.2 可挂接的认证模块 552
28.2.1 PAM 会话 553
28.2.2 PAM操作 555
附 录
附录A 头文件 564
附录B ladsh源文件 565
词汇表 584
参考文献 593
索引 597
第1章 Linux的发展历史 2
1.1 自由Unix软件简史 3
1.2 Linux的发展 4
1.3 Unix系统的概念谱系 5
1.4 Linux谱系 7
第2章 许可证和版权 8
2.1 版权 8
2.2 许可 10
2.3 自由软件许可证 10
2.3.1 GNU通用公共许可证 11
2.3.2 GNU库通用公共许可证 12
2.3.3 MIT/X/BSD风格的许可证 12
2.3.4 旧BSD风格的许可证 12
2.3.5 艺术许可证 12
2.3.6 许可证的不兼容性 13
第3章 在线系统文档 14
3.1 man手册页 14
3.2 info手册页 15
3.3 其他文档 15
第2部分 开发工具和环境
第4章 开发工具 18
4.1 编辑器 19
4.1.1 Emacs 20
4.1.2 vi 21
4.2 Make 21
4.2.1 复杂命令行 24
4.2.2 变量 25
4.2.3 后缀规则 26
4.3 GNU的调试器 27
4.4 跟踪程序行为 31
第5章 gcc的选项和扩展 33
5.1 gcc选项 33
5.2 头文件 36
5.2.1 long long 36
5.2.2 内嵌函数 36
5.2.3 可选择的扩展关键字 36
5.2.4 特征 37
第6章 GNC的C语言库 38
6.1 特征选择 38
6.2 POSIX接口 40
6.2.1 POSIX要求的类型 40
6.2.2 发现运行时的权能 42
6.2.3 查找和设置基本系统信息 43
6.3 兼容性 45
第7章 内存调试工具 46
7.1 存在Bug的代码 46
7.2 glibc的内存检查工具 48
7.2.1 发现内存堆的损坏 49
7.2.2 使用mtrace()来跟踪分配情况 52
7.3 利用mpr找到内存泄露 53
7.4 利用valgrind发现内存错误 55
7.5 电网 60
7.5.1 使用电网 61
7.5.2 内存对齐 61
7.5.3 其他特性 63
7.5.4 局限性 63
7.5.5 资源消耗 63
第8章 创建和使用库 65
8.1 静态库 65
8.2 共享库 66
8.3 设计共享库 67
8.3.1 管理兼容性 67
8.3.2 不兼容的库 68
8.3.3 设计兼容的库 68
8.4 构造共享库 69
8.5 安装共享库 70
例子 71
8.6 使用共享库 72
8.6.1 使用无须安装的库 73
8.6.2 提前装载库 73
第9章 Linux系统环境 75
9.1 进程环境 75
9.2 理解系统调用 76
9.2.1 系统调用的限制 77
9.2.2 系统调用的返回码 77
9.2.3 使用系统调用 79
9.2.4 通用错误返回码 80
9.3 查找头文件和库文件 85
第3部分 系统编程
第10章 进程模型 88
10.1 定义进程 88
10.1.1 使用线程的复杂性 88
10.1.2 Linux的方式 89
10.2 进程属性 89
10.2.1 pid及其生成 89
10.2.2 信用状 90
10.2.3 文件系统用户标识符 94
10.2.4 关于uid和gid的总结 95
10.3 进程信息 96
10.3.1 程序参数 97
10.3.2 资源的使用 98
10.3.3 建立使用限制 100
10.4 进程基本元素 101
10.4.1 创建子进程 102
10.4.2 等待子进程结束 103
10.4.3 运行新程序 104
10.4.4 用vfork()更快速地创建进程 106
10.4.5 自我终止 107
10.4.6 终止其他进程 107
10.4.7 转储内核文件信息 109
10.5 简单子进程 109
10.5.1 用system()运行和等待 109
10.5.2 从进程读或写 110
10.6 会话和进程组 112
10.6.1 会话 113
10.6.2 控制终端 113
10.6.3 进程组 113
10.6.4 孤儿进程组 114
10.7 介绍ladsh 115
用ladsh运行外部程序 116
10.8 创建克隆 129
第11章 简单的文件管理 130
11.1 文件模式 132
11.1.1 文件访问权限 133
11.1.2 文件权限修饰符 134
11.1.3 文件类型 136
11.1.4 进程的umask 137
11.2 基本的文件操作 138
11.2.1 文件描述符 138
11.2.2 关闭文件 139
11.2.3 在文件系统中打开文件 139
11.2.4 文件的读、写以及位置
11.2.4 指针的移动 141
11.2.5 局部读和写 145
11.2.6 缩短文件 147
11.2.7 同步文件 147
11.2.8 其他操作 148
11.3 查询和修改Inode信息 149
11.3.1 查找Inode信息 149
11.3.2 一个使用stat()的简单示例 150
11.3.3 轻松确定访问权限 152
11.3.4 改变文件的访问权限 153
11.3.5 改变文件的所有者和组 153
11.3.6 改变文件的时间戳 154
11.3.7 Ext3扩展属性 155
11.4 操作目录项 159
11.4.1 创建设备文件以及命名管道的目录项 160
11.4.2 创建硬链接 162
11.4.3 使用符号链接 163
11.4.4 删除文件 164
11.4.5 重命名文件 164
11.5 操作文件描述符 165
11.5.1 改变打开文件的访问模式 165
11.5.2 修改close-on-exec标志 166
11.5.3 复制文件描述符 166
11.6 创建无名管道 167
11.7 对ladsh添加重定向 168
11.7.1 数据结构 168
11.7.2 修改代码 169
第12章 信号处理 172
12.1 信号的概念 173
12.1.1 信号的生命周期 173
12.1.2 简单信号 173
12.1.3 可靠信号 175
12.1.4 信号和系统调用 176
12.2 Linux(和POSIX)信号系统的API 177
12.2.1 发送信号 177
12.2.2 使用sigset_t 178
12.2.3 捕捉信号 178
12.2.4 操作一个进程的信号掩码 180
12.2.5 找到等待信号的集合 182
12.2.6 等待信号 182
12.3 有效信号 183
描述信号 187
12.4 编写信号处理程序 188
12.5 重新打开日志文件 190
12.6 实时信号 193
信号队列和排序 193
12.7 获取信号的信息 196
12.7.1 得到一个信号的上下文 196
12.7.2 使用信号发送数据 202
第13章 高级文件操作 205
13.1 多路输入输出 205
13.1.1 非阻塞I/O 208
13.1.2 用poll()的多路传输 209
13.1.3 使用select()的多路传输 213
13.1.4 比较poll()和select() 217
13.1.5 使用epoll进行多路传输 220
13.1.6 比较poll()和epoll 225
13.2 内存映射 229
13.2.1 页对齐 230
13.2.2 建立内存映射 230
13.2.3 撤销映射区域 235
13.2.4 同步内存区域到磁盘 235
13.2.5 锁定内存区域 236
13.3 文件锁定 237
13.3.1 文件锁 238
13.3.2 记录锁 239
13.3.3 强制锁 245
13.3.4 租赁文件 245
13.4 read()和write()的替代方法 249
13.4.1 分散/聚集的读和写 249
13.4.2 忽略文件指针 251
第14章 目录操作 253
14.1 当前工作目录 253
14.1.1 查找当前工作目录 253
14.1.2 特殊文件“.”和“..” 255
14.1.3 当前目录 255
14.2 改变根目录 256
14.3 创建和删除目录 256
14.3.1 创建新目录 256
14.3.2 删除目录 257
14.4 读取目录的内容 257
再次读取目录内容 259
14.5 文件名匹配搜索 259
14.5.1 使用子进程 260
14.5.2 内在匹配搜索 261
14.6 为ladsh增加目录和匹配功能 265
14.6.1 增加cd和pwd 266
14.6.2 增加文件名匹配查询 267
14.7 遍历文件系统的树结构 270
14.7.1 使用ftw() 270
14.7.2 用nftw()函数进行文件树遍历 272
14.7.3 实现find功能 274
14.8 目录变更提示 276
第15章 作业控制 284
15.1 作业控制基础 284
15.1.1 重新启动进程 284
15.1.2 停止进程 285
15.1.3 处理作业控制信号 285
15.2 ladsh中的作业控制 287
第16章 终端与伪终端 293
16.1 tty操作 294
16.1.1 终端实用函数 294
16.1.2 控制终端 295
16.1.3 终端所有权 296
16.1.4 用utemper工具进行记录 297
16.1.5 手工记录 298
16.2 termios概述 308
16.3 termios实例 309
16.3.1 密码 309
16.3.2 串行通信 311
16.4 termios调试 325
16.5 termios参考 326
16.5.1 函数 327
16.5.2 窗口尺寸 330
16.5.3 标志位 331
16.5.4 输入模式标记 332
16.5.5 输出模式标记 334
16.5.6 控制模式标记 335
16.5.7 控制模式字符 336
16.5.8 本地模式标记 338
16.5.9 控制read() 340
16.6 伪终端 341
16.6.1 打开伪终端 342
16.6.2 打开伪终端的简单方法 343
16.6.3 打开伪终端的复杂方法 344
16.6.4 伪终端范例 348
第17章 socket网络 358
17.1 协议支持 358
17.1.1 理想的网络 358
17.1.2 实际的网络 359
17.1.3 让实际的网络变得理想 360
17.1.4 地址 360
17.2 实用函数 361
17.3 基本套接字操作 362
17.3.1 建立一个套接字 362
17.3.2 建立连接 364
17.3.3 将地址绑定到套接字 364
17.3.4 等待连接 364
17.3.5 连接到一个服务器 365
17.3.6 找到连接地址 366
17.4 Unix域套接字 367
17.4.1 Unix域地址 367
17.4.2 等待一个连接 368
17.4.3 连接到一个服务器 370
17.4.4 运行Unix域的示例 371
17.4.5 未命名的Unix域套接字 371
17.4.6 传递文件描述符 372
17.5 基于TCP/IP协议的联网机器 377
17.5.1 字节存储顺序 377
17.5.2 IPv4地址 378
17.5.3 IPv6地址 380
17.5.4 IP地址的操作 382
17.5.5 转换名称到地址 384
17.5.6 转换地址到名称 395
17.5.7 监听TCP连接 400
17.5.8 TCP客户端应用程序 403
17.6 使用UDP数据报 404
17.6.1 创建一个UDP套接字 405
17.6.2 发送和接收数据报 406
17.6.3 一个简单的tftp服务器 407
17.7 套接字错误 413
17.8 旧的网络函数 415
17.8.1 IPv4地址操作 415
17.8.2 主机名解析 417
17.8.3 旧的主机信息查找范例 418
17.8.4 查找端口号 420
第18章 时间 423
18.1 获取时间和日期 423
18.1.1 时间和日期的表示 423
18.1.2 时间的转换,格式化和解析 426
18.1.3 时间的限制 429
18.2 使用计时器 431
18.2.1 休眠 431
18.2.2 间隔计时器 432
第19章 随机数 436
19.1 伪随机数 436
19.2 密码系统和随机数 437
第20章 虚拟控制台编程 439
20.1 起步 440
20.2 发出峰鸣声 442
20.3 判断终端是否为虚拟控制台 443
20.4 查找当前虚拟控制台 443
20.5 管理虚拟控制台的切换 444
20.6 范例:open命令 447
第21章 Linux控制台 449
21.1 权能数据库 450
21.2 图标,字符和映射 451
21.3 Linux控制台权能 452
21.3.1 控制字符 453
21.3.2 转义字符序列 454
21.3.3 测试序列 455
21.3.4 复杂转义字符序列 456
21.4 直接写屏幕 461
第22章 编写安全程序 464
22.1 安全何时重要 464
安全何时失效 465
22.2 最小化攻击时机 466
22.2.1 放弃权限 466
22.2.2 采用辅助手段 467
22.2.3 限制文件系统的访问 468
22.3 常见的安全漏洞 469
22.3.1 缓冲区溢出 469
22.3.2 解析文件名 474
22.3.3 环境变量 474
22.3.4 运行Shell 475
22.3.5 创建临时文件 476
22.3.6 竞争状态和信号处理 478
22.3.7 关闭文件描述符 478
22.4 作为守护进程运行 479
第4部分 开发库
第23章 字符串的匹配 482
23.1 匹配任意字符串 482
23.2 正则表达式 483
23.2.1 Linux正则表达式 483
23.2.2 正则表达式的匹配 484
23.2.3 一个简单的grep示例 489
第24章 用S-Lang来处理终端 495
24.1 输入处理 495
24.1.1 初始化S-Lang的输入处理 496
24.1.2 恢复终端状态 497
24.1.3 从终端读取字符 497
24.1.4 检查未决的输入 498
24.2 输出处理 498
24.2.1 初始化屏幕管理 499
24.2.2 更新显示 499
24.2.3 移动光标 499
24.2.4 结束屏幕管理 500
24.2.5 屏幕管理的框架程序 500
24.2.6 切换字符集 501
24.2.7 输出到屏幕 502
24.2.8 画线和画矩形 503
24.2.9 使用颜色 505
第25章 基于散列的数据库函数库 508
25.1 概述 508
25.2 基本操作 509
25.2.1 打开qdbm文件 509
25.2.2 关闭数据库 510
25.2.3 获得文件描述符 511
25.2.4 同步数据库 511
25.3 读取记录 512
25.3.1 读取特定的记录 512
25.3.2 顺序读取记录 513
25.4 修改数据库 513
25.4.1 增加记录 513
25.4.2 删除记录 514
25.5 实例 514
第26章 解析命令行选项 521
26.1 选项表 522
26.1.1 定义选项 522
26.1.2 嵌套选项表 525
26.2 使用选项表 526
26.2.1 创建上下文 526
26.2.2 解析命令行 527
26.2.3 剩余的参数 528
26.2.4 自动帮助信息 528
26.3 使用回调(callback) 531
26.4 错误处理 534
26.5 选项别名 536
26.5.1 指定别名 536
26.5.2 使别名生效 537
26.6 解析参数字符串 538
26.7 处理额外参数 538
26.8 应用程序示例 538
第27章 运行时动态加载 540
动态加载接口 541
示例 544
第28章 用户识别和验证 546
28.1 ID到名字的转换 546
示例:id命令 549
28.2 可挂接的认证模块 552
28.2.1 PAM 会话 553
28.2.2 PAM操作 555
附 录
附录A 头文件 564
附录B ladsh源文件 565
词汇表 584
参考文献 593
索引 597
猜您喜欢