第1章 Linux下c语言编程环境 1.1 Linux操作系统及相关开发工具的安装与使用 1.1.1 虚拟机软件vmware的安装 1.1.2 Linux操作系统的安装 1.2 基本Shell命令的使用 1.2.1 常用命令 1.2.2 帮助命令 1.2.3 搜索命令 1.2.4 重定向与管道 1.2.5 文件类型与权限 1.3 编辑器vim的使用 1.4 编译器gee的使用 1.4.1 gec简介 1.4.2 使用gcc 1.4.3 gee常用选项 1.5 调试器gdb的使用 1.5.1 gdb概述 1.5.2 使用gdb 1.6 make与Makefile文件 1.6.1 Makefile简介 1.6.2 Makefile基本规则 1.6.3 使用带宏的Makefile 1.6.4 Makefile隐含规则第2章 文件I/O编程 2.1 文件I/O介绍 2.2 文件描述符 2.3 基本API 2.3.1 open 2.3.2 read 2.3.3 write 2.3.4 close 2.3.5 lseek 2.3.6 基本API综合使用 2.3.7 fcntl 2.3.8 ioctl 2.3.9 select 2.3.10 poll 2.4 stat的使用 2.4.1 stat的基本使用 2.4.2 文件类型的判定 2.4.3 权限设定的判定 2.4.4 获取主、次设备号 2.4.5 获取时间及时间格式的转换 2.5 目录操作 2.5.1 打开目录 2.5.2 读取目录 2.5.3 关闭目录 2.5.4 使用范例 2.5.5 回绕目录rawinddir 2.6 文件I/O编程综合案例分析——myls.c 2.6.1 用于命令选项的宏定义 2.6.2 子函数功能 2.6.3 main函数分析 2.6.4 子函数show_link_content的实现 2.6.5 子函数show_file的实现 2.6.6 子函数show_dir的实现 2.6.7 子函数my_get_opt的实现 2.6.8 子函数get_file_list的实现第3章 多进程编程 3.1 进程基础知识 3.1.1 进程概念 3.1.2 进程的状态及其转换 3.1.3 进程标识 3.2 精解Linux下C进程内存布局 3.2.1 C进程内存布局说明 3.2.2 C进程内存布局验证 3.2.3 环境变量的获取与设置 3.3 进程控制天字第1号系统调用——fork 3.3.1 fork的机制与特性 3.3.2 fork使用实例分析 3.4 揭秘文件描述符的本质 3.4.1 文件描述符的本质是数组元素的下标 3.4.2 fork对文件描述符的影响 3.4.3 标准输入、输出文件描述符与dup2 3.5 父子进程同步的功臣——wait 3.5.1 wait的作用 3.5.2 调用wait的实例 3.5.3 waitpid 3.6 进程控制地字第1号系统调用——exec 3.6.1 exec的机制和用法 3.6.2 exec的使用实例 3.6.3 exec与fork合作 3.6.4 关于exec函数的6种形式 3.7 gdb调试多进程程序的技巧 3.8 进程的消亡 3.8.1 启动例程与main函数 3.8.2 exit函数与_exit函数 3.8.3 I/O流与I/O库缓存 3.8.4 Exit handler 3.9 守护进程的编写 3.9.1 进程组、对话期与控制终端 3.9.2 编程规则与步骤 3.9.3 出错记录第4章 进程间通信 4.1 进程间通信概述 4.2 进程间的传令兵——信号 4.2.1 信号概述 4.2.2 信号的捕获与处理 4.2.3 实例分析 4.2.4 使用gdb调试信号 4.2.5 pending signal 4.2.6 sigaction 4.3 进程间的动脉——管道 4.3.1 无名管道 4.3.2 有名(命名)管道 4.4 进程间的高速公路——共享内存 4.4.1 共享内存的原理 4.4.2 主要API 4.4.3 利用共享内存进行进程间通信的实例 4.5 高速公路上的红绿灯——信号量 4.5.1 使用共享内存存在的同步问题 4.5.2 信号量的实现原理 4.5.3 使用信号量同步共享内存访问的设计 4.5.4 信号量编程的主要API 4.5.5 使用信号量同步共享内存访问的实例分析 4.6 进程间的邮局——消息队列第5章 多线程编程初步 5.1 线程的概念和优势 5.2 多线程编程的基本API 5.2.1 创建线程pthread_create 5.2.2 结束线程pthread_exit 5.2.3 等待线程结束pthreadjoin 5.2.4 多线程编程实例分析 5.3 多线程的同步与互斥 5.3.1 互斥锁 5.3.2 信号量 5.4 线程属性 5.4.1 创建线程时指定属性 5.4.2 线程创建后改变属性 5.5 使用gdb调试多线程程序第6章 网络编程 6.1 socket编程所需网络通信基础知识 6.1.1 客户端程序和服务端程序 6.1.2 常用的命令 6.1.3 TCP/UDP介绍 6.1.4 数据封包与解包 6.1.5 TCP连接建立过程——3次握手 6.1.6 TCP连接终止过程——4分节终止序列 6.2 服务器和客户机的信息函数 6.2.1 字节序列转换 6.2.2 地址格式转换 6.2.3 IP和域名的转换 6.2.4 服务信息函数 6.3 TCP socket编程 6.3.1 编程模型 6.3.2 主要API 6.3.3 实例分析 6.3.4 令人困惑的“不能绑定到指定地址”的错误 6.3.5 套接口地址结构几点特别说明 6.3.6 迭代服务器与并发服务器 6.4 UDP socket编程 6.4.1 编程模型 6.4.2 主要API 6.4.3 实例分析 6.4.4 特别说明 6.5 高级套接字函数 6.5.1 send和recv 6.5.2 sendmsg和recvmsg 6.5.3 shutdown第7章 Linux下C开发环境使用进阶 7.1 编辑器vim的使用 7.1.1 命令行模式的操作 7.1.2 命令行模式切换到输入模式 7.1.3 最后行模式的操作 7.1.4 vim的注意事项 7.2 编译器gcc的使用 7.2.1 gcc警告提示功能 7.2.2 库依赖 7.2.3 gcc代码优化 7.2.4 gcc编译加速 7.2.5 gcc的错误类型及对策 7.3 程序库文件的制作、链接、加载精解 7.3.1 linux下ELF文件格式 7.3.2 库函数的编写者如何制作库文件 7.3.3 应用程序的编写者如何使用(链接)库文件 7.3.4 应用程序的使用者如何加载库文件 7.3.5 静态库文件的制作和使用 7.4 调试器gdb的使用 7.4.1 gdb的命令概貌 7.4.2 gdb中运行Linux的shell程序 7.4.3 在gdb中配置程序运行环境 7.4.4 调试已运行的程序 7.4.5 暂停/恢复程序运行 7.4.6 查看栈信息 7.4.7 查看源程序 7.4.8 查看运行时数据 7.4.9 改变程序的执行 7.5 autoconf和automake生成Makefile文件 7.5.1 引子 7.5.2 模拟需求 7.5.3 工具简介 7.5.4 生成Makefile的来龙去脉 7.5.5 Configure.in的八股文 7.5.6 实战Makefile.am参考文献后记