第1部分 Linux编程工具包
第1章 概貌
1.1 Linux既往成就
1.2 Linux预期成就
1.3 Linux简史
1.4 Linux与UNIX
1.5 Linux编程
1.6 为何选择Linux编程
1.7 小结
第2章 设置开发系统
2.1 硬件选择
2.1.1 硬件选择上的考虑
2.2 处理器/王板
2.2.1 板上I/O
2.2.2 处理器
2.2.3 BIOS
2.2.4 内存
2.2.5 机箱和电源
2.3 用户交互硬件:视频、声音、键盘及鼠标
2.3.1 显卡
2.3.2 显示器
2 3.3 声卡
2.4 键盘与鼠标
2.5 通信设备、端口及总线
2.5.1 调制解调器
2.5.2 网络接口卡
2.5.3 SCSI
2.5.4 USB与火线(IEEE 1394)
2.5.5 串行卡(包括多端口)
2.5.6 IRDA
2.5.7 PCMCIA卡
2.5.8 ISA即插即用设备
2.6 存储设备
2.6.1 硬盘
2.6.2 可移动磁盘设备
2.6.3 CD-ROM/DVD
2.6.4 磁带备份设备
2.7 外围设备
2.7.1 打印机
2.7.2 扫描仪
2.7.3 数字相机
2 7.4 家居自动控制设备
2.8 完备型系统
2.9 便携系统
2.10 安装
2.11 小结
第3章 使用GNU cc
3.1 GNU cc特性
3.2 使用简介
3.3 常用命令行选项
3.3.1 函数库和包含文件
3.3.2 出错检查及警告
3.4 优化选项
3.5 调试选项
3.6 GNU C扩展
3.7 小结
第4章 使用GNU make管理项目
4.1 为何使用make
4.2 编写makefile
4.3 有关makefile编写的详细规则
4.3.1 伪目标
4.3.2 变量
4.3.3 环境变量、自动变量及预定义变量
4.3.4 隐式规则
4.3.5 模式规则
4.3.6 注释
4.4 额外的make命令行选项
4.5 调试make
4.6 常见的make出错消息
4.7 有用的makefile目标
4.8 小结
第5章 使用autoconf创建自配置软件
5.1.1 创建configure.in文件
5.1.2 构造文件
5.1.3 有用的autoconf实用工具
5.2 内置宏
5.2.1 候选程序测试
5.2.2 库函数测试
5.2.3 头文件测试
5.2.4 结构测试
5.2.5 类型定义测试
5.2.6 编译器行为测试
5.2.7 系统服务测试
5.2.8 UNIX变种测试
5.3 普通宏
5.4 一个带注解的autoconf脚本
5.5 小结
第6章 比较和归并原文件
6.1 比较文件
6.1.1 理解cmp命令
6.1.2 理解diff命令
6.1.3 理解diff3命令
6.1.4 理解sdiff命令
6.2 准备源代码补丁
6.2.1 Patch命令行选项
6.2.2 创建补丁
6.2.3 使用补丁
6.3 小结
第7章 使用RCS控制版本
7.1 术语
7.2 RCS基本用法
7.2.1 Ci和C
7.2.2 RCS关键字
7.2.3 ident命令
7.3 rcsdiff
7.4 其他RCS命令
7.4.1 rcsclean
7.4.2 rlog
7.4.3 rcs
7.4.4 rcsmerge
第8章 在Emacs中创建程序
8.1 Emacs简介
8.1.1 启动与停止Emacs
8.1.2 移动
8.1.3 插入文本
8.1.4 删除文本
8.1.5 查找和替换
8.1.6 保存和打开文件
8.1.7 多窗口
8.2 支持编程的特性
8.2.1 缩进约定
8.2.2 语法高亮度显示
8.2.3 使用注释
8.2.4 使用Emacs进行编译
8.2.5 定制简介
8.3 使用Emacs Lisp自动完成Emacs操作
8.4 小结
第2部分 系统编程
第9章 I/O例程
9.1 文件描述符
9.2 使用文件描述符的系统调用
9.2.1 open()调用
9.2.2 close()调用
9.2.3 read()调用
9.2.4 write()调用
9.2.5 ioctl()调用
9.2.6 fcntl()调用
9.2.7 fsync()调用
9.2.8 ftruncate()调用
9.2.9 lseek()调用
9.2.10 dup()和 dUp2()调用
9.2.11 select()调用
9.2.12 fstat()调用
9.2.13 fchown()调用
9.2.14 fchmod()调用
9.2.15 fchdir()调用
9.2.16 flock()调用
9.2.17 pipe()调用
9.3 文件类型
9.3.1 普通文件
9.3.2 磁带I/O
9.3.3 串口I/O
9.3.4 打印机接口
9.3.5 声卡
9.4 小结
第10章 文件操作
10.1 文件操作函数
10.1.1 打开/关闭文件
10.1.2 基本的读和写
10.1.3 状态函数
10.2 格式化输出
10.2.1 格式化输入
10.2.2 基于字符和行的输入输出
10.2.3 文件定位
10.2.4 缓冲区控制
10.2.5 删除和改名
10.2.6 临时文件
10.3 小结
第11章 进程控制
11.1 进程的属性
11.2 系统调用及库函数
11.2.1 fork()系统调用
11.2.2 exec()函数族
11.2.3 system()和popen()函数
11.2.4 clone()函数调用
11.2.5 wait()、waitpid()、wait3()以及wait4()系统调用
11.2.6 select()系统调用
11.2.7 信号
11.2.8 程序的中止
11.2.9 闹钟和计时器
11.3 调度参数
11.4 线程
11.4.1 pthread-create()函数
11.4.2 pthread-exit()函数
11.4.3 pthread-join()函数
11.4.4 属性的控制
11.4.5 pthread一atfork()函数
11.4.6 取消线程
11.4.7 othread_cleanup一push()宏
11.4.8 pthread-cond-init()函数
11.4.9 Pthread-equal()函数
11.4.10 互斥
11.5 编程示例
11.5.1 子库
11.5.2 例子child一demol.c程序
11.5.3 例子程序child-demo2.c
11.5.4 例子程序child.demo3.c
11.6 小结
第12章 访问系统信息
12.1 进程的信息
12.1.1 cmdline文件
12.1.2 environ文件
12.1.3 fd目录
12.1.4 mem文件
12.1.5 stat文件
12.1.6 status文件
12.1.7 CWd符号链接
12.1.8 exe符号链接
12.1.9 maps文件
12.1.10 root符号链接
12.1.11 statm文件
12.2 普通的系统信息
12.2.1 /proc/cmd/line文件
12.2.2 /proc/cpuinfo文件
12.2.3 /proc/devices文件
12.2.4 /proc/dma文件
12.2.5 /proc/filesystems文件
12.2.6 /proc/Interrupts文件
12.2.7 /proc/ioports文件
12.2.8 /proc/kcore文件
12.2.9 /proc从/Kmsg文件
12.2.10 /proc/ksyms文件
12.2.11 /proc/loadavg文件
12 2.12 /proc/locks文件
12.2.13 /proc/mdstat文件
12.2.14 /proc/meminfo文件
12.2.15 /proc/misc文件
12.2.16 /proc/modules文件
12.2.17 /proc/mounts文件
12.2.18 /proc/pci文件
12.2.19 /proc/rtc文件
12.2.20 /proc/stat文件
12.2.21 /proc/uptime文件
12.2.22 /proc/version文件
12.2.23 /Proc/net子目录
12.2.24 /proc/sesi子目录
12.2.25 /proc/sys目录
12.3 函数库和实用工具
12.4 小结
第13章 出错处理
13.1 出错处理简述
13.2 C语言机制
13.2.1 assert()宏
13.2.2 使用预编译
13.2.3 标准库工具
13.2.4 对错误代码errno的理解
13.2.5 使用函数abort()
13.2.6 使用函数exit()
13.2.7 使用函数atexit()
13.2.8 使用函数strerror()
13.2.9 使用函数perror()
13.3 系统日志工具
13.3.1 用户程序
13.4 小结
第14章 内有管理
14.1 C内存管理的回顾
14.1.1 malloc()函数的使用
14.1.2 calloc()函数的使用
14.1.3 realloc()函数的使用
14.1.4 free()函数的使用
14.1.5 alloca()函数的使用
14.2 内存映像文件
14.2.l mmaP()函数的使用
14.2.2 munmap()函数的使用
14.2.3 msync()函数的使用
14.2.4 mprotect()函数的使用
14.2.5 锁住内存
14.2.6 mremap()函数的使用
14.2.7 用内存映像实现cat( l)
14.3 发现并修改内存管理错误
14.3.2 用mpr和check定位内存错误
14.3.3 Electric Fence
14.3.4 使用Lint Brush
14.4 小结
第3部分 进程间通信和网络编程
第15章 IPC入门:使用管道
15.1 管道使用简介
15.1.1 无名管道
15.1.2 有名管道
15.2 小结
第16章 消息队列
16.1 创建一个使用消息队列示例程序
16.2 运行这个消息队列示例程序
16.3 小结
第17章 共享内存
17.1 把Linux配置成使用共享内存
17.2 创建一个使用共享内存的例子程序
17.3 运行共享内存示例程序
17.4 小结
第18章 信号灯
18.1 使用信号灯的示例程序
18.2 运行信号灯示例程序
18.3 小结
第19章 TCP/IP和自接口编程
19.1 支持套接口编程的系统调用
19.1.1 socket
19.1.2 bind
19.1.3 listen
19.1.4 connect
19.1.5 recv
19.1.6 send
19.2 使用套接口的客户/服务器例子程序
19.2.1 服务器例子程序
19.2.2 客户例子程序
19.2.3 运行客户和服务器例子程序
19.2.4 使用Web浏览器作为客户运行服务器例子程序
19.3 一个简单的Web服务器程序和Web客户程序
19.3.1 实现一个简单的Web服务器程序
19.3.2 实现一个简单的Web客户程序
19.3.3 测试这个Web服务器程序和Web客户程序
19.3.4 使用Netscape Navigator作为客户运行这个简单Web服务器程序
19.4 小结
第20章 UDP:用户数据协议
20.1 一个发送UDP数据的例子程序
20.2 一个接收UDP数据的例子程序
20.3 运行这两个UDP例子程序
20.4 小结
第21章 使用多播套接口
21.1 把Linux配置成支持多播IP
21.2 几个使用多播IP的例子程序
21.2.1 使用多播IP广播数据的例子程序
21.2.2 监听多播IP广播的例子程序
21.2.3 运行这两个多播IP例子程序
21.3 小结
第22章 非阻塞套接口I/O
22.1 使用非阻塞套接口I/O的例子程序
22.2 运行这个非阻塞套接口I/O的例子程序
22.3 小结
第23章 用于TCP套接口的一个C++类库
23.1 C++客户/服务器类的设计
23.1.1 理解客户程序的设计
23.1.2 理解服务器设计
23.2 C++客户/服务器类的实现
23.2.1 实现客户程序
23.2.2 实现服务器
23.3 测试这个客户/服务器类
23.4 小结
第24章 使用库
24.1 比较libc5和libc6
24.2 库操作工具
24.2.1 理解nm命令
24.2.3 理解ldd命令
24.2.4 理解ldconfig
24.2.5 环境变量和配置文件
24.3 编写并使用静态库
24.4 编写并使用共享库
24.5 使用动态加载的共享对象
24.5.1 理解dl接口
24.5.2 加载共享对象
24.5.3 使用共享对象
24 5.4 检查错误
24.5.5 卸载共享对象
24.5.6 使用dl接口
24.6 小结
第25章 设备驱动程序
25.1 驱动程序类型
25.1.1 静态链接的内核设备驱动程序
25.1.2 可加载的内核模块
25.1.3 共享库
25.1.4 无特权用户模式程序
25.1.5 特权用户模式程序
25.1.6 守护进程
25.1.7 字符设备与块设备
25.2 演示用的硬件
25.2.1 步进电机工作原理
25.2.2 标准或双向井口
25.3 开发配置
25.4 低层端口I/O
25.5 引发使用设备驱动程序的中断
25.6 使用DMA访问内存
25.7 一个简单的用户模式测试驱动程序
25.8 调试内核级驱动程序
25.9 下半部与上半部
25.10 创建一个内核驱动程序
25.10.1 查看源代码
25.10.2 编译驱动程序
25.10.3 使用内核驱动程序
25.10.4 未来发展方向
25.11 其它他信自来源
25.12 小结
第4部分 用户界面编程
第26章 底层终端控制
26.1 终端接口
26.2 控制终端
26.2.1 属性控制函数
26.2.2 速度控制函数
26.2.3 行控制函数
26.2.4 进程控制函数
26.3 使用终端接口
26.4 改变终端模式
26.5 使用terminfo
26.5.1 terminfo能力
26.5.2 使用terminfo
26.5.3 发挥terminfo能力
26.6 小结
第27章 使用ncurses操纵屏幕
27.1 ncurses简史
27.2 使用ncurses编译程序
27.3 调试ncursea程序
27.4 关于窗口
27.4.1 ncurses的窗口设计
274.2 ncurses的函数命名约定
27.5 初始化与终止
27.5.1 ncurses初始化结构
27.5.2 ncurses终止
27.5.3 说明ncurses的初始化与终止
27.6 输入与输出
27.6.1 输出例程
27.6.2 输入例程
27.7 颜色例程
27.8 窗口管理
27.9 其他实用函数
27.10 小结
第28章 X Window编程
28.1 X的概念
28.2 Xlib API
28.2.1 XopenDisplay
28.2.2 XcreateSimpleWindow和Xcreatewindow
28.2.3 映射窗口和撤消映射窗口
28.2.4 撤消窗口
28.2.5 事件处理
28.2.6 初始化图形设备上下文和字体
28.2.7 在X窗口中绘图
28.2.8 一个Xlib的示例程序
28.3 XI具包API
28.3.1 准备使用X工具包
28.3.2 使用X工具包设置窗口部件参数
28.4 小结
第29章 使用Athena和Motif的窗口部件
29.1 使用Athena的窗口部件
29.1.1 Athena的标签窗口部件
29.1.2 Athena的命令按钮窗口部件
29.1.3 Athena的列表窗口部件
29.1.4 Athena的文本窗口部件
29.1.5 Athena的简单菜单窗口部件
29.2 使用Motif的窗口部件
29.2.1 Motif的标签窗口部件
29.2.2 Motif的列表窗口部件
29.2.3 Motif的文本窗口部件
29.3 编写一个定制的Athena窗口部件
29.3.1 使用fetch-url.c文件
29.3.2 使用URL.h文件
29.3.3 使用URLP.h文件
29.3.4 使用URL.C文件
29.3.5 测试URL窗口部件
29.4 在C++程序中同时使用Athena和Motif
29.5 使用封装Athena窗口部件的一个C++类库
29.5.1 Component类
29.5.2 PanedWindow类
29.5.3 Label类
29.5.4 Button类
29.5.5 Text类
29.6 小结
第30章 使用GTK进行GUI编程
30.1 GTK简介
30.1.1 处理GTK中的事件
30.1.2 使用GTK的示例程序
30.1.3 其他GTK窗口部件
30.1.4 GTK容器窗口部件
30.2 用于显示XML文件的GTK程序
30.2.1 XML简介
30.2.2 James Clark的XML分析器Expat
30.2.3 GTK的XML显示程序实现
30.2.4 运行GTK的XML显示程序
30.3 使用Notebook窗口部件的GUI程序
30.3.1 Notebook窗口部件示例程序的实现
30.3.2 实现绘图窗口部件
30.3.3 运行GTK Notebook窗口部件示例程序
第31章 使用Qt进行GUI编程
31.1 通过重载QWidget类方法处理事件
31.1.1 QWidget类概述
31.1.2 实现DrawWidget类
31.1.3 测试DrawWidget
31.2 使用Qt槽和信号处理事件
31.2.1 派生StateLCDWidget类
31.2.2 使用信号和糟
31.2.3 运行信号/槽示例程序
31.3 小结
第32章 使用Java进行GUI编程
32.1 Java简介
32.1.1 Java是一种面向对象的语言
32.1.2 在Java中使用包
32.1.3 使用java读写文件
32.1.4 在Java中使用多个线程
32.1.5 在Java中进行套接口编程
32.2 使用Java编写一个聊天引擎
32.3 AWT简介
32.4 使用AWT编写一个聊天程序
32.5 JFC简介
32.6 使用JFC编写一个聊天程序
32.7 使用本机Java编译器
32.8 小结
第33章 OpenGL/Mesa图形编程
33.1 OpenGL是一个图形硬件的软件接口
33.2 Orbits示例程序
33.2.1 为OpenGL图形创建窗口以及对OpenGL初始化
33.2.2 使用GLUT创建简单的三维物体
33.2.3 在三维空间中使用X-Y-Z坐标放置物体
33.2.4 沿着X-Y-Z一中的任何轴或所有轴旋转物体
33.2.5 启用材料属性
33.2.6 启用深度值测试
33.2.7 处理键盘事件
33.2.8 为获得动画效果对OPenGL图形进行更新
33.2.9 示例程序清单
第5部分 特殊编程技术
第34章 使用GNU hash进行Shell编程
34.1 为何使用bashi
34.2 bash基础知识
34.2.1 通配符
34.2.2 花括弧展开式
34.2.3 特殊字符
34.3 使用bash变量
34.4 使用bash操作符
34.4.1 字符串操作符
34.4.2 模式匹配操作符
34.5 流控制
34.5.1 条件执行:if
34.5.2 确定性循环:for
34.5.3 非确定性循环:while和until
34.5.4 选择结构:case和 select
34.6 shell函数
34.7 输入与输出
34.7.1 I/O重定向
34.7.2 字符串I/O
34.8 命令行处理
34.9 进程和作业控制
34.9.1 shell的信号处理
34.9.2 使用trap
34.10 小结
第35章 有关安全性的编程
35.1应用程序类型
35.1.1 setuid程序
35.1.2 网络服务器(守护进程)
35.1.3 网络客户程序
35.1.4 邮件用户代理程序
35.1.5 CGI程序
35.1.6 工具程序
35.1.7 应用程序
35.2 特殊的代码问题
35.2.1 shell脚本和system()系统调用
35.2.2 来自不信任用户的输入
35.2.3 缓冲区溢出
35.2.4 环境变量
35.2.5 gethostbyname()函数
35.2.6 信号
35.2.7 user ID和group ID
35.2.8 函数库的脆弱性
35.2.9 执行其他程序
35.2.10 /tmp竞争
35.2.11 拒绝服务型攻击
35.2.12 随机数
35.2.13 令牌
35.1.14 密码
35.2.15 文件名
35.2.16 符号链接
35.2.17 chroot()环境
35.2.18 分割程序
35.2.19 进程间通信
35.2.20 identd守护进程
35.2.21 TCP与UDP
35.2.22 动态与静态内存分配
35.2.23 安全级别
35.2.24 POSIX.le的能力
35.3 擦除缓冲区
35.4 穿越防火墙提交HTML表单
35.5 窃听、盗取及中间人攻击
35.6 HTML服务器包含特性
35.7 预先派生子进程的服务器的问题
35.8 超时
35.9 三因素认证
35.10 可插入的认证模块
35.11 一般的程序健壮性问题
35.12 加密技术
35.12.1 加密算法的类型
35.12.2 加密系统
35.12.3 加密的脆弱性
35.13 小结
第36章 调试:GNU gdb
36.1 为使用gdb进行编译
36.2 使用基本的gdb命令
36.2.1 启动gdb
36.2.2 在调试器中查看代码
36.2.3 检查数据
36.2.4 设置断点
36.2.5 检查并更改运行中的代码
36.3 高级gdb概念和命令
36.3.1 变量的作用域和上下文
36.3.2 遍历函数调用栈
36.3.3 操纵源文件
36.3.4 与Shell进行通信
36.3.5 附加到某个运行中的程序
36.4 小结
第6部分 补充内容
第37章 软件包管理
37.1 理解tar文件
37.1.1 创建tar文件
34.1.2 更新tar文件
37.1.3 列出tar文件的内容
37.2 理解install命令
37.3 理解Red Hat软件包管理器
37.3.1 最小要求
37.3.2 配置RPM
37.3.3 控制构造过程:使用spec文件
37.3.4 分析一个spec文件
37.3.5 构造软件包
37.4 小结
第38章 建档
38.1 手册页面
38.1.1 手册页面的组成
38.1.2 手册页面例子及解释
38.1.3 使用groff命令
38.1.4 Linux约定
38.2 使用SGMLI具创建SGML文档
38.2.1 SGML工具
38.2.2 SGML工具的标记
38.2.3 格式化SGML文档
38.3 小结
第39章 许可证的发放
39.1 MIT/X风格的许可证
39.2 BSD风格的许可证
39.3 ArtistiC许可证
39.4 GNU通用公共许可证
39.4.1 GNU通用公共许可证(GPL)
39.4.2 GNU库通用公共许可证(LGPL)
39.5 开放源代码的定义
39.6 选择正确的许可证
第7部分附录
附录A 符号表函数库
A.1 可用的文档
A.1.1 示例程序:userchange
A.1.2 定义一个符号表来描述一个结构类型
A.1.3 定义一个变量的随机集
A.1.4 包含另一个符号表
A.1.5 出错报告
A.1.6 智能指针
A.1.7 符号表库函数
A.1.8 执行例子
附录B GNU通用公共许可证(General Public License )