《GNU/Linux编程指南》PDF下载

  • 购买积分:17 如何计算积分?
  • 作  者:(美)(K.沃尔)K.Wall等著;王勇等译
  • 出 版 社:北京:清华大学出版社
  • 出版年份:2000
  • ISBN:7302039135
  • 页数:568 页
图书介绍:美国培生教育出版集团SAMS公司授权北京科海培训中心和清华大学出版社出版:本书介绍如何在Linux的内核、系统调用及应用程序层次上编写应用程序。主要内容包括:建立和定制用于Linux应用程序的GUI环境,探索X-Window系统,介绍KDE和GNOME库的强大功能,以及系统编程的各个专题。

第1章 概貌 1

1.1 Linux既往成就 1

1.2 Linux预期成就 1

第1部分 Linux编程工具包 1

1.3 Linux简史 2

1.4 Linux与UNIX 2

1.5 Linux编程 2

1.6 为何选择Linux编程 3

1.7 小结 3

第2章 设置开发系统 4

2.1 硬件选择 4

2.1.1 硬件选择上的考虑 4

2.2 处理器/主板 5

2.2.1 板上I/O 6

2.2.2 处理器 6

2.2.4 内存 7

2.2.5 机箱和电源 7

2.2.3 BIOS 7

2.3 用户交互硬件:视频、声音、键盘及鼠标 8

2.3.1 显卡 8

2.3.2 显示器 9

2.3.3 声卡 10

2.4 键盘与鼠标 10

2.5 通信设备、端口及总线 11

2.5.1 调制解调器 11

2.5.2 网络接口卡 12

2.5.5 串行卡(包括多端口) 13

2.5.3 SCSI 13

2.5.4 USB与火线(IEEE 1394) 13

2.5.6 IRDA 14

2.5.7 PCMCIA卡 14

2.5.8 ISA即插即用设备 14

2.6 存储设备 14

2.6.1 硬盘 14

2.6.2 可移动磁盘设备 14

2.7.1 打印机 15

2.7 外围设备 15

2.6.3 CD-ROM/DVD 15

2.6.4 磁带备份设备 15

2.7.2 扫描仪 16

2.7.3 数字相机 17

2.7.4 家居自动控制设备 17

2.8 完备型系统 17

2.9 便携系统 18

2.10 安装 18

2.11 小结 21

3.2 使用简介 22

第3章 使用GNU cc 22

3.1 GNU cc特性 22

3.3 常用命令行选项 24

3.3.1 函数库和包含文件 25

3.3.2 出错检查及警告 26

3.4 优化选项 27

3.5 调试选项 28

3.6 GNU C扩展 29

3.7 小结 30

4.2 缩写makefile 31

第4章 使用GNU make管理项目 31

4.1 为何使用make 31

4.3 有关makefile编写的详细规则 33

4.3.1 伪目标 33

4.3.2 变量 33

4.3.3 环境变量、自动变量及预定义变量 35

4.3.4 隐式规则 36

4.3.5 模式规则 36

4.5 调试make 37

4.4 额外的make命令行选项 37

4.3.6 注释 37

4.6 常见的make出错消息 38

4.7 有用的makefile目标 38

4.8 小结 38

第5章 使用autoconf创建自配置软件 39

5.1 理解autoconf 39

5.1.1 创建configure. in文件 40

5.1.2 构造文件 40

5.2.1 候选程序测试 41

32.1 Java简介 41

5.2 内置宏 41

5.1.3 有用的autoconf实用工具 41

5.2.2 库函数测试 42

5.2.3 头文件测试 43

5.2.4 结构测试 44

5.2.5 类型定义测试 44

5.2.6 编译器行为测试 44

5.2.7 系统服务测试 45

5.2.8 UNIX变种测试 45

5.3 普通宏 46

5.4 一个带注解的autoconf脚本 47

5.5 小结 52

第6章 比较和归并源文件 53

6.1.1 理解cmp命令 53

6.1 比较文件 53

6.1.2 理解diff命令 55

6.1.3 理解diff3命令 60

6.1.4 理解sdiff命令 63

6.2 准备源代码补丁 63

6.2.1 patch命令行选项 64

6.2.2 创建补丁 64

6.3 小结 65

6.2.3 使用补丁 65

第7章 使用RCS控制版本 66

7.1 术语 66

7.2.1 ci和co 67

7.2 RCS基本用法 67

7.2.2 RCS关键字 69

7.2.3 ident命令 70

7.3 rcsdiff 71

7.4 其他RCS命令 73

7.4.4 rcsmerge 74

7.4.2 rlog 74

7.4.3 rcs 74

7.4.1 rcsclean 74

7.5 小结 75

第8章 在Emacs中创建程序 76

8.1 Emacs简介 76

8.1.1 启动与停止Emacs 76

8.1.2 移动 78

8.1.3 插入文本 79

8.1.4 删除文本 79

8.1.5 查找和替换 80

8.1.6 保存和打开文件 81

8.1.7 多窗口 82

8.2.1 缩进约定 83

8.2 支持编程的特性 83

8.2.2 语法高亮度显示 84

8.2.3 使用注释 84

8.2.4 使用Emacs进行编译 85

8.2.5 定制简介 87

8.3 使用Emacs Lisp自动完成Emacs操作 89

8.4 小结 91

9.2 使用文件描述符的系统调用 92

9.1 文件描述符 92

第9章 I/O例程 92

第2部分 系统编程 92

9.2.1 open()调用 93

9.2.2 close()调用 94

9.2.3 read()调用 94

9.2.4 write()调用 94

9.2.5 ioctl()调用 94

9.2.6 fcntl()调用 95

9.2.7 fsync()调用 95

9.2.8 ftruncate()调用 96

9.2.9 lseek()调用 96

9.2.10 dup()t duo2()调用 96

9.2.11 select()调用 97

9.2.12 fstat()调用 101

9.2.13 fchown()调用 102

9.2.14 fchmod()调用 102

9.2.15 fchdir()调用 103

9.2.16 flock()调用 103

9.2.17 pipe()调用 103

9.3 文件类型 104

9.3.1 普通文件 104

9.3.2 磁带I/O 106

9.3.3 串口I/O 109

9.3.4 打印机接口 109

9.3.5 声卡 109

9.4 小结 109

第10章 文件操作 110

10.1 文件操作函数 110

10.1.1 打开/关闭文件 110

10.1.2 基本的读和写 111

10.1.3 状态函数 111

10.2 格式化输出 112

10.2.1 格式化输入 114

10.2.2 基于字符和行的输入输出 115

10.2.4 缓冲区控制 116

10.2.3 文件定位 116

10.2.5 删除和改名 117

10.2.6 临时文件 117

10.3 小结 118

第11章 进程控制 119

11.1 进程的属性 119

11.2.1 fork()系统调用 120

11.2.2 exec()函数族 120

11.2 系统调用及库函数 120

11.2.3 system()和popen()函数 121

11.2.4 clone()函数调用 121

11.2.5 wait()、waitpid()、wait3()以及wait4()系统调用 122

11.2.6 select()系统调用 122

11.2.7 信号 122

11.2.8 程序的中止 124

11.2.9 闹钟和计时器 125

11.3 调度参数 126

11.4 线程 127

11.4.1 pthread-create()函数 128

11.4.2 pthread-exit()函数 128

11.4.3 pthread-join()函数 128

11.4.4 属性的控制 129

11.4.5 pthread-atfork()函数 130

11.4.6 取消线程 130

11.4.8 pthread-cond-init()函数 131

11.4.7 pthread-cleanup-push()宏 131

11.4.9 pthread-equal()函数 132

11.4.10 互斥 132

11.5 编程示例 132

11.5.1 子库 133

11.5.2 例子child-demol.c程序 143

11.5.3 例子程序child-demo2.c 145

11.5.4 例子程序child-demo3.c 150

11.6 小结 151

12.1 进程的信息 152

第12章 访问系统信息 152

12.1.1 cmdline文件 153

12.1.2 environ文件 153

12.1.3 fd目录 153

12.1.4 mem文件 153

12.1.5 stat文件 153

12.1.11 statm文件 155

12.2.2 /proc/cpuinfo文件 155

12.2.1 /proc/cmd/line文件 155

12.2 普通的系统信息 155

12.1.8 exe符号链接 155

12.1.10 root符号链接 155

12.1.9 maps文件 155

12.1.7 cwd符号链接 155

12.1.6 status文件 155

12.2.10 /proc/ksyms文件 156

12.2.9 /proc/kmsg文件 156

12.2.7 /proc/ioports文件 156

12.2.8 /proc/kcore文件 156

12.2.5 /proc/filesystems文件 156

12.2.4 /proc/dma文件 156

12.2.3 /proc/devices文件 156

12.2.6 /proc/interrupts文件 156

12.2.15 /proc/misc文件 157

12.2.17 /proc/mounts文件 157

12.2.16 /proc/modules文件 157

12.2.18 /proc/pci文件 157

12.2.14 /proc/meminfo文件 157

12.2.13 /proc/mdstat文件 157

12.2.12 /proc/locks文件 157

12.2.11 /proc/loadavg文件 157

12.2.19 /proc/rtc文件 158

12.2.20 /proc/stat文件 158

12.2.21 /proc/uptime文件 158

12.2.22 /proc/version文件 158

12.2.23 /proc/net子目录 158

12.2.24 /proc/scsi子目录 159

12.2.25 /proc/sys目录 159

12.3 函数库和实用工具 160

12.4 小结 160

13.2.1 assert()宏 161

第13章 出错处理 161

13.2 C语言机制 161

13.1 出错处理简述 161

13.2.2 使用预编译 163

13.2.3 标准库工具 165

13.2.4 对错误代码errno的理解 165

13.2.5 使用函数abort() 166

13.2.6 使用函数exit() 166

13.2.7 使用函数atexit() 167

13.2.9 使用函数perror() 168

13.2.8 使用函数strerror() 168

13.3 系统日志工具 169

13.3.1 用户程序 173

13.4 小结 173

第14章 内存管理 174

14.1 C内存管理的回顾 174

14.1.1 malloc()函数的使用 174

14.1.2 calloc()函数的使用 174

14.1.5 alloca()函数的使用 175

14.1.3 realloc()函数的使用 175

14.1.4 free()函数的使用 175

14.2 内存映像文件 177

14.2.1 mmap()函数的使用 177

14.2.2 munmap()函数的使用 178

14.2.3 msync()函数的使用 178

14.2.4 mprotect()函数的使用 179

14.2.5 锁住内存 179

14.2.6 mremap()函数的使用 179

14.2.7 用内存映像实现cat(1) 180

14.3 发现并修改内存管理错误 181

14.3.1 一个有问题的程序 182

14.3.2 用mpr和check定位内存错误 183

14.3.3 Electric Fence 185

14.3.4 使用Lint Brush 187

14.4 小结 188

第3部分 进程间通信和网络编程 189

第15章 IPC入门:使用管道 189

15.1 管道使用简介 190

15.1.1 无名管道 190

15.1.2 有名管道 191

15.2 小结 193

16.1 创建一个使用消息队列示例程序 194

第16章 消息队列 194

16.2 运行这个消息队列示例程序 196

16.3 小结 196

第17章 共享内存 197

17.1 把Linux配置成使用共享内存 197

17.2 创建一个使用共享内存的例子程序 197

17.3 运行共享内存示例程序 199

17.4 小结 200

18.1 使用信号灯的示例程序 201

第18章 信号灯 201

18.2 运行信号灯示例程序 205

18.3 小结 206

第19章 TCP/IP和套接口编程 207

19.1 支持套接口编程的系统调用 207

19.1.1 socket 207

19.1.2 bind 208

19.1.3 listen 209

19.1.4 connect 209

19.1.5 recv 210

19.1.6 send 210

19.2 使用套接口的客户/服务器例子程序 211

19.2.1 服务器例子程序 211

19.2.2 客户例子程序 212

19.2.4 使用Web浏览器作为客户运行服务器例子程序 213

19.2.3 运行客户和服务器例子程序 213

19.3 一个简单的Web服务器程序和Web客户程序 214

19.3.1 实现一个简单的Web服务器程序 214

19.3.2 实现一个简单的Web客户程序 216

19.3.3 测试这个Web服务器程序和Web客户程序 216

19.3.4 使用Netscape Navigator作为客户运行这个简单Web服务器程序 217

19.4 小结 218

第20章 UDP:用户数据协议 219

20.1 一个发送UDP数据的例子程序 219

20.2 一个接收UDP数据的例子程序 220

20.3 运行这两个UDP例子程序 221

20.4 小结 222

第21章 使用多播套接口 223

21.1 把Linux配置成支持多播IP 223

21.2 几个使用多播IP的例子程序 224

21.2.1 使用多播IP广播数据的例子程序 225

21.2.2 监听多播IP广播的例子程序 226

21.2.3 运行这两个多播IP例子程序 227

21.3 小结 228

第22章 非阻塞套接口I/O 229

22.1 使用非阻塞套接口I/O的例子程序 229

22.2 运行这个非阻塞套接口I/O的例子程序 232

22.3 小结 232

23.1.1 理解客户程序的设计 233

23.1 C++客户/服务器类的设计 233

第23章 用于TCP套接口的一个C++类库 233

23.1.2 理解服务器设计 235

23.2 C++客户/服务器类的实现 236

23.2.1 实现客户程序 236

23.2.2 实现服务器 237

23.3 测试这个客户/服务器类 238

23.4 小结 240

第24章 使用库 241

24.1 比较libc5和libc6 241

24.2.2 理解ar命令 242

24.2.1 理解nm命令 242

24.2 库操作工具 242

24.2.4 理解ldconfig 243

24.2.3 理解ldd命令 243

24.2.5 环境变量和配置文件 244

24.3 编写并使用静态库 244

24.4 编写并使用享库 249

24.5 使用动态加载的共享对象 251

24.5.1 理解dl接口 251

24.5.2 加载共享对象 251

24.5.6 使用dl接口 252

24.5.4 检查错误 252

24.5.5 卸载共享对象 252

24.5.3 使用共享对象 252

24.6 小结 254

第25章 设备驱动程序 255

25.1 驱动程序类型 255

25.1.1 静态链接的内核设备驱动程序 255

25.1.2 可加载的内核模块 255

25.1.5 特权用户模式程序 256

25.1.4 无特权用户模式程序 256

25.1.3 共享库 256

25.2 演示用的硬件 257

25.1.6 守护进程 257

25.1.7 字符设备与块设备 257

25.2.1 步进电机工作原理 258

25.2.2 标准或双向并口 260

25.3 开发配置 262

25.4 低层端口I/O 262

25.5 引发使用设备驱动程序的中断 264

25.7 一个简单的用户模式测试驱动程序 265

25.6 使用DMA访问内存 265

25.8 调试内核级驱动程序 266

25.9 下半部与上半部 267

25.10 创建一个内核驱动程序 267

25.10.1 查看源代码 267

25.10.2 编译驱动程序 291

25.10.3 使用内核驱动程序 291

25.10.4 未来发展方向 292

25.12 小结 293

25.11 其他信息来源 293

第26章 底层终端控制 294

26.1 终端接口 294

第4部分 用户界面编程 294

26.2 控制终端 295

26.2.1 属性控制函数 296

26.2.2 速度控制函数 297

26.2.3 行控制函数 297

26.2.4 进程控制函数 298

26.3 使用终端接口 299

26.4 改变终端模式 301

26.5.1 terminfo能力 303

26.5 使用terminfo 303

26.5.2 使用terminfo 304

26.5.3 发挥terminfo能力 307

26.6 小结 310

第27章 使用ncurses操纵屏幕 311

27.1 ncurses简史 311

27.2 使用ncurses编译程序 312

27.3 调试ncurses程序 312

27.4 关于窗口 312

27.4.1 ncurses的窗口设计 313

27.4.2 ncurses的函数命名约定 314

27.5.2 ncurses终止 315

27.5 初始化与终止 315

27.5.1 ncurses初始化结构 315

27.5.3 说明ncurses的初始化与终止 316

27.6 输入与输出 318

27.6.1 输出例程 318

27.6.2 输入例程 326

27.7 颜色例程 329

27.8 窗口管理 331

27.9 其他实用函数 331

27.10 小结 334

第28章 X Window编程 335

28.1 X的概念 335

28.2 Xlib API 336

28.2.1 XopenDisplay 337

28.2.2 XcreateSimpleWindow和XcreateWindow 337

28.2.5 事件处理 338

28.2.4 撤消窗口 338

28.2.3 映射窗口和撤消映射窗口 338

28.2.6 初始化图形设备上下文和字体 340

28.2.7 在X窗口中绘图 340

28.2.8 一个Xlib的示例程序 341

28.3 X工具包API 344

28.3.1 准备使用X工具包 344

28.3.2 使用X工具包设置窗口部件参数 345

28.4 小结 346

第29章 使用Athena和Motif的窗口部件 347

29.1.1 Athena的标签窗口部件 347

29.1 使用Athena的窗口部件 347

29.1.2 Athena的命令按钮窗口部件 348

29.1.3 Athena的列表窗口部件 351

29.1.4 Athena的文本窗口部件 352

29.1.5 Athena的简单菜单窗口部件 355

29.2 使用Motif的窗口部件 357

29.2.1 Motif的标签窗口部件 358

29.2.2 Motif的列表窗口部件 359

29.2.3 Motif的文本窗口部件 360

29.3.1 使用fetch-url.c文件 363

29.3 编写一个定制的Athena窗口部件 363

29.3.2 使用URL.h文件 365

29.3.3 使用URLP.h文件 366

29.3.4 使用URL.c文件 367

29.3.5 测试URL窗口部件 369

29.4 在C++程序中同时使用Athena和Motif 370

29.5 使用封装Athena窗口部件的一个C++类库 371

29.5.1 Conmponent类 372

29.5.2 PanedWindow类 373

29.5.3 Label类 375

29.5.4 Button类 376

29.5.5 Text类 377

29.6 小结 379

第30章 使用GTK进行GUI编程 380

30.1 GTK简介 381

30.1.1 处理GTK中的事件 382

30.1.2 使用GTK的示例程序 383

30.1.4 GTK容器窗口部件 385

30.1.3 其他GTK窗口部件 385

30.2 用于显示XML文件的GTK程序 386

30.2.1 XML简介 387

30.2.2 James Clark的XML分析器Expat 388

30.2.3 GTK的XML显示程序实现 389

30.2.4 运行GTK的XML显示程序 394

30.3 使用Notebook窗口部件的GUI程序 394

30.3.1 Notebook窗口部件示例程序的实现 394

30.3.2 实现绘图窗口部件 396

30.3.3 运行GTK Notebook窗口部件示例程序 398

第31章 使用Qt进行GUI编程 400

31.1 通过重载QWidget类方法处理事件 401

31.1.1 QWindget类概述 401

31.1.2 实现DrawWidget类 403

31.1.3 测试DrawWidget 405

31.2 使用Qt槽和信号处理事件 405

31.2.1 派生StateLCDWidget类 406

31.2.2 使用信号和槽 408

31.3 小结 410

31.2.3 运行信号/槽示例程序 410

第32章 使用Java进行GUI编程 412

32.1.1 Java是一种面向对象的语言 412

32.1.2 在Java中使用包 415

32.1.3 使用java读写文件 416

32.1.4 在Java中使用多个线程 419

32.1.5 在Java中进行套接口编程 420

32.2 使用Java编写一个聊天引擎 424

32.3 AWT简介 428

32.4 使用AWT编写一个聊天程序 430

32.5 JFC简介 434

32.6 使用JFC编写一个聊天程序 437

32.7 使用本机Java编译器 440

32.8 小结 440

第33章 OpenGL/Mesa图形编程 441

33.1 OpenGL是一个图形硬件的软件接口 441

33.2 Orbits示例程序 442

33.2.1 为OpenGL图形创建窗口以及对OpenGL初始化 442

33.2.2 使用GLUT创建简单的三维物体 443

33.2.4 沿着X-,Y-,Z-中的任何轴或所有轴旋转物体 445

33.2.3 在三维空间中使用X-Y-Z坐标放置物体 445

33.2.5 启用材料属性 446

33.2.6 启用深度值测试 447

33.2.7 处理键盘事件 447

33.2.8 为获得动画效果对OpenGL图形进行更新 447

33.2.9 示例程序清单 447

34.2 bash基础知识 451

34.2.1 通配符 451

第34章 使用GNU bash进行Shell编程 451

34.1 为何使用bash 451

第5部分 特殊编程技术 451

34.2.2 花括弧展开式 452

34.2.3 特殊字符 452

34.3 使用bash变量 453

34.4 使用bash操作符 455

34.4.1 字符串操作符 456

34.4.2 模式匹配操作符 457

34.5.1 条件执行:if 458

34.5 流控制 458

34.5.2 确定性循环:for 462

34.5.3 非确定性循环:while和until 462

34.5.4 选择结构:case和select 463

34.6 shell函数 465

34.7 输入与输出 466

34.7.1 I/O重定向 466

34.7.2 字符串I/O 467

34.8 命令行处理 469

34.9 进程和作业控制 471

34.9.1 shell的信号处理 471

34.9.2 使用trap 471

34.10 小结 473

第35章 有关安全性的编程 474

35.1 应用程序类型 474

35.1.1 setuid程序 474

35.1.2 网络服务器(守护进程) 474

35.1.6 工具程序 475

35.1.5 CGI程序 475

35.1.4 邮件用户代理程序 475

35.1.3 网络客户程序 475

35.1.7 应用程序 476

35.2 特殊的代码问题 476

35.2.1 shell脚本和system()系统调用 476

35.2.2 来自不信任用户的输入 477

35.2.3 缓冲区溢出 477

35.2.4 环境变量 480

35.2.5 gethostbyname()函数 482

35.2.6 信号 482

35.2.7 user ID和group ID 483

35.2.8 函数库的脆弱性 485

35.2.9 执行其他程序 485

35.2.10 /tmp竞争 485

35.2.11 拒绝服务型攻击 485

35.2.12 随机数 487

35.2.13 令牌 487

35.2.14 密码 487

35.2.15 文件名 488

35.2.16 符号链接 489

35.2.17 chroot()环境 498

35.2.19 进程间通信 499

35.2.18 分割程序 499

35.2.20 identd守护进程 500

35.2.21 TCP与UDP 500

35.2.22 动态与静态内存分配 501

35.2.23 安全级别 502

35.2.24 POSIX.le的能力 502

35.3 擦除缓冲区 502

35.4 穿越防火墙提交HTML表单 502

35.7 预先派生子进程的服务器的问题 503

35.6 HTML服务器包含特性 503

35.5 窃呼、盗取及中间人攻击 503

35.8 超时 504

35.9 三因素认证 504

35.10 可插入的认证模块 505

35.11 一般的程序健壮性问题 505

35.12 加密技术 505

35.12.1 加密算法的类型 506

35.12.2 加密系统 507

35.12.3 加密的脆弱性 507

35.13 小结 508

第36章 调试:GNU gdb 509

36.1 为使用gdb进行编译 509

36.2 使用基本的gdb命令 509

36.2.1 启动gdb 510

36.2.2 在调试器中查看代码 511

36.2.3 检查数据 512

36.2.4 设置断点 513

36.2.5 检查并更改运行中的代码 515

36.3.1 变量的作用域和上下文 516

36.3 高级gdb概念和命令 516

36.3.2 遍历函数调用栈 517

36.3.3 操纵源文件 518

36.3.4 与Shell进行通信 519

36.3.5 附加到某个运行中的程序 520

36.4 小结 520

第6部分 补充内容 521

第37章 软件包管理 521

37.1 理解tar文件 521

37.1.1 创建tar文件 522

37.2 理解install命令 523

37.1.3 列出tar文件的内容 523

37.1.2 更新tar文件 523

37.3 理解Red Hat软件包管理器 525

37.3.1 最小要求 526

37.3.2 配置RPM 526

37.3.3 控制构造过程:使用spec文件 527

37.3.4 分析一个spec文件 528

37.3.5 构造软件包 530

37.4 小结 531

38.1.1 手册页面的组成 532

38.1.2 手册页面例子及解释 532

38.1 手册页面 532

第38章 建档 532

38.1.3 使用groff命令 534

38.1.4 Linux约定 535

38.2 使用SGML工具创建SGML文档 536

38.2.1 SGML工具 537

38.2.2 SGML工具的标记 540

38.2.3 格式化SGML文档 541

38.3 小结 541

39.1 MIT/X风格的许可证 542

第39章 许可证的发放 542

39.3 Artistic许可证 543

39.2 BSD风格的许可证 543

39.4 GNU通用公共许可证 544

39.4.1 GNU通用公共许可证(GPL) 544

39.4.2 GNU库通用公共许可证(LGPL) 545

39.5 开放源代码的定义 546

39.6 选择正确的许可证 547

附录A 符号表函数库 548

A.1 可用的文档 548

第7部分 附录 548

A.1.1 示例程序:userchange 549

A.1.2 定义一个符号表来描述一个结构类型 549

A.1.3 定义一个变量的随机集 551

A.1.4 包含另一个符号表 553

A.1.5 出错报告 554

A.1.6 智能指针 555

A.1.7 符号表库函数 555

A.1.8 执行例子 560

附录B GNU通用公共许可证(General Public License) 562