# Linux C编程一站式学习 ### 宋劲杉 北京亚嵌教育研究中心 <[songjinshan AT akaedu DOT org](mailto:songjinshan AT akaedu DOT org)> 版权 © 2008, 2009 宋劲杉, 北京亚嵌教育研究中心 Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with the Invariant Sections being 前言, with no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in [附录 B, _GNU Free Documentation License Version 1.3, 3 November 2008_](apb.html#app-gfdl). 2009.6.23 | **修订历史** | | :-- | :-- | | 修订 0.6 | 2009.2.27 | | 添加了GFDL许可证,正式网络发布。第三部分还很粗糙,错误也有不少,有待改进。第一部分和第二部分已经比较成熟,第二部分还差三章没写。 | | 修订 0.7 | 2009.4.24 | | 全书的章节基本完成,但有些章节还很不完善。 | * * * **目录** + [历史](pr01.html) + [前言](pr02.html) + [I. C语言入门](pt01.html) + [1\. 程序的基本概念](ch01.html) + [1\. 程序和编程语言](intro.program.html) + [2\. 自然语言和形式语言](intro.naturalformal.html) + [3\. 程序的调试](ch01s03.html) + [4\. 第一个程序](intro.helloworld.html) + [2\. 常量、变量和表达式](ch02.html) + [1\. 继续Hello World](ch02s01.html) + [2\. 常量](ch02s02.html) + [3\. 变量](expr.variable.html) + [4\. 赋值](ch02s04.html) + [5\. 表达式](expr.expression.html) + [6\. 字符类型与字符编码](ch02s06.html) + [3\. 简单函数](ch03.html) + [1\. 数学函数](ch03s01.html) + [2\. 自定义函数](ch03s02.html) + [3\. 形参和实参](ch03s03.html) + [4\. 全局变量、局部变量和作用域](ch03s04.html) + [4\. 分支语句](ch04.html) + [1\. if语句](ch04s01.html) + [2\. if/else语句](ch04s02.html) + [3\. 布尔代数](ch04s03.html) + [4\. switch语句](ch04s04.html) + [5\. 深入理解函数](ch05.html) + [1\. return语句](ch05s01.html) + [2\. 增量式开发](ch05s02.html) + [3\. 递归](ch05s03.html) + [6\. 循环语句](ch06.html) + [1\. while语句](ch06s01.html) + [2\. do/while语句](ch06s02.html) + [3\. for语句](ch06s03.html) + [4\. break和continue语句](ch06s04.html) + [5\. 嵌套循环](ch06s05.html) + [6\. goto语句和标号](ch06s06.html) + [7\. 结构体](ch07.html) + [1\. 复合类型与结构体](ch07s01.html) + [2\. 数据抽象](ch07s02.html) + [3\. 数据类型标志](ch07s03.html) + [4\. 嵌套结构体](ch07s04.html) + [8\. 数组](ch08.html) + [1\. 数组的基本概念](ch08s01.html) + [2\. 数组应用实例:统计随机数](ch08s02.html) + [3\. 数组应用实例:直方图](ch08s03.html) + [4\. 字符串](ch08s04.html) + [5\. 多维数组](ch08s05.html) + [9\. 编码风格](ch09.html) + [1\. 缩进和空白](ch09s01.html) + [2\. 注释](ch09s02.html) + [3\. 标识符命名](ch09s03.html) + [4\. 函数](ch09s04.html) + [5\. indent工具](ch09s05.html) + [10\. gdb](ch10.html) + [1\. 单步执行和跟踪函数调用](ch10s01.html) + [2\. 断点](ch10s02.html) + [3\. 观察点](ch10s03.html) + [4\. 段错误](ch10s04.html) + [11\. 排序与查找](ch11.html) + [1\. 算法的概念](ch11s01.html) + [2\. 插入排序](ch11s02.html) + [3\. 算法的时间复杂度分析](ch11s03.html) + [4\. 归并排序](ch11s04.html) + [5\. 线性查找](ch11s05.html) + [6\. 折半查找](ch11s06.html) + [12\. 栈与队列](ch12.html) + [1\. 数据结构的概念](ch12s01.html) + [2\. 堆栈](ch12s02.html) + [3\. 深度优先搜索](ch12s03.html) + [4\. 队列与广度优先搜索](ch12s04.html) + [5\. 环形队列](ch12s05.html) + [13\. 本阶段总结](ch13.html) + [II. C语言本质](pt02.html) + [14\. 计算机中数的表示](ch14.html) + [1\. 为什么计算机用二进制计数](ch14s01.html) + [2\. 不同进制之间的换算](ch14s02.html) + [3\. 整数的加减运算](ch14s03.html) + [3.1\. Sign and Magnitude表示法](ch14s03.html#id2753623) + [3.2\. 1's Complement表示法](ch14s03.html#id2753761) + [3.3\. 2's Complement表示法](ch14s03.html#id2753996) + [3.4\. 有符号数和无符号数](ch14s03.html#id2754091) + [4\. 浮点数](ch14s04.html) + [15\. 数据类型详解](ch15.html) + [1\. 整型](ch15s01.html) + [2\. 浮点型](ch15s02.html) + [3\. 类型转换](ch15s03.html) + [3.1\. Integer Promotion](ch15s03.html#id2757955) + [3.2\. Usual Arithmetic Conversion](ch15s03.html#id2758200) + [3.3\. 由赋值产生的类型转换](ch15s03.html#id2758516) + [3.4\. 强制类型转换](ch15s03.html#id2758655) + [3.5\. 编译器如何处理类型转换](ch15s03.html#id2758764) + [16\. 运算符详解](ch16.html) + [1\. 位运算](ch16s01.html) + [1.1\. 按位与、或、异或、取反运算](ch16s01.html#id2761062) + [1.2\. 移位运算](ch16s01.html#id2761805) + [1.3\. 掩码](ch16s01.html#id2761995) + [1.4\. 异或运算的一些特性](ch16s01.html#id2762114) + [2\. 其它运算符](ch16s02.html) + [2.1\. 复合赋值运算符](ch16s02.html#id2762352) + [2.2\. 条件运算符](ch16s02.html#id2762537) + [2.3\. 逗号运算符](ch16s02.html#id2762598) + [2.4\. sizeof运算符与typedef类型声明](ch16s02.html#id2762676) + [3\. Side Effect与Sequence Point](ch16s03.html) + [4\. 运算符总结](ch16s04.html) + [17\. 计算机体系结构基础](ch17.html) + [1\. 内存与地址](ch17s01.html) + [2\. CPU](ch17s02.html) + [3\. 设备](ch17s03.html) + [4\. MMU](ch17s04.html) + [5\. Memory Hierarchy](ch17s05.html) + [18\. x86汇编程序基础](ch18.html) + [1\. 最简单的汇编程序](ch18s01.html) + [2\. x86的寄存器](ch18s02.html) + [3\. 第二个汇编程序](ch18s03.html) + [4\. 寻址方式](ch18s04.html) + [5\. ELF文件](ch18s05.html) + [5.1\. 目标文件](ch18s05.html#id2770854) + [5.2\. 可执行文件](ch18s05.html#id2771639) + [19\. 汇编与C之间的关系](ch19.html) + [1\. 函数调用](ch19s01.html) + [2\. `main`函数和启动例程](ch19s02.html) + [3\. 变量的存储布局](ch19s03.html) + [4\. 结构体和联合体](ch19s04.html) + [5\. C内联汇编](ch19s05.html) + [6\. volatile限定符](ch19s06.html) + [20\. 链接详解](ch20.html) + [1\. 多目标文件的链接](ch20s01.html) + [2\. 定义和声明](ch20s02.html) + [2.1\. `extern`和`static`关键字](ch20s02.html#id2787367) + [2.2\. 头文件](ch20s02.html#id2788051) + [2.3\. 定义和声明的详细规则](ch20s02.html#id2788815) + [3\. 静态库](ch20s03.html) + [4\. 共享库](ch20s04.html) + [4.1\. 编译、链接、运行](ch20s04.html#id2789691) + [4.2\. 动态链接的过程](ch20s04.html#id2790795) + [4.3\. 共享库的命名惯例](ch20s04.html#id2791032) + [5\. 虚拟内存管理](ch20s05.html) + [21\. 预处理](ch21.html) + [1\. 预处理的步骤](ch21s01.html) + [2\. 宏定义](ch21s02.html) + [2.1\. 函数式宏定义](ch21s02.html#id2797214) + [2.2\. 内联函数](ch21s02.html#id2797661) + [2.3\. `#`、`##`运算符和可变参数](ch21s02.html#id2797840) + [2.4\. 宏展开的步骤](ch21s02.html#id2798306) + [3\. 条件预处理指示](ch21s03.html) + [4\. 其它预处理特性](ch21s04.html) + [22\. Makefile基础](ch22.html) + [1\. 基本规则](ch22s01.html) + [2\. 隐含规则和模式规则](ch22s02.html) + [3\. 变量](ch22s03.html) + [4\. 自动处理头文件的依赖关系](ch22s04.html) + [5\. 常用的`make`命令行选项](ch22s05.html) + [23\. 指针](ch23.html) + [1\. 指针的基本概念](ch23s01.html) + [2\. 指针类型的参数和返回值](ch23s02.html) + [3\. 指针与数组](ch23s03.html) + [4\. 指针与`const`限定符](ch23s04.html) + [5\. 指针与结构体](ch23s05.html) + [6\. 指向指针的指针与指针数组](ch23s06.html) + [7\. 指向数组的指针与多维数组](ch23s07.html) + [8\. 函数类型和函数指针类型](ch23s08.html) + [9\. 不完全类型和复杂声明](ch23s09.html) + [24\. 函数接口](ch24.html) + [1\. 本章的预备知识](ch24s01.html) + [1.1\. `strcpy`与`strncpy`](ch24s01.html#id2819066) + [1.2\. `malloc`与`free`](ch24s01.html#id2820062) + [2\. 传入参数与传出参数](ch24s02.html) + [3\. 两层指针的参数](ch24s03.html) + [4\. 返回值是指针的情况](ch24s04.html) + [5\. 回调函数](ch24s05.html) + [6\. 可变参数](ch24s06.html) + [25\. C标准库](ch25.html) + [1\. 字符串操作函数](ch25s01.html) + [1.1\. 初始化字符串](ch25s01.html#id2827594) + [1.2\. 取字符串的长度](ch25s01.html#id2827671) + [1.3\. 拷贝字符串](ch25s01.html#id2827741) + [1.4\. 连接字符串](ch25s01.html#id2828376) + [1.5\. 比较字符串](ch25s01.html#id2828656) + [1.6\. 搜索字符串](ch25s01.html#id2828881) + [1.7\. 分割字符串](ch25s01.html#id2829046) + [2\. 标准I/O库函数](ch25s02.html) + [2.1\. 文件的基本概念](ch25s02.html#id2829671) + [2.2\. fopen/fclose](ch25s02.html#id2829869) + [2.3\. stdin/stdout/stderr](ch25s02.html#id2830485) + [2.4\. errno与perror函数](ch25s02.html#id2830807) + [2.5\. 以字节为单位的I/O函数](ch25s02.html#id2831236) + [2.6\. 操作读写位置的函数](ch25s02.html#id2831814) + [2.7\. 以字符串为单位的I/O函数](ch25s02.html#id2832034) + [2.8\. 以记录为单位的I/O函数](ch25s02.html#id2832480) + [2.9\. 格式化I/O函数](ch25s02.html#id2832755) + [2.10\. C标准库的I/O缓冲区](ch25s02.html#id2834346) + [2.11\. 本节综合练习](ch25s02.html#id2834904) + [3\. 数值字符串转换函数](ch25s03.html) + [4\. 分配内存的函数](ch25s04.html) + [26\. 链表、二叉树和哈希表](ch26.html) + [1\. 链表](ch26s01.html) + [1.1\. 单链表](ch26s01.html#id2844144) + [1.2\. 双向链表](ch26s01.html#id2845376) + [1.3\. 静态链表](ch26s01.html#id2845707) + [1.4\. 本节综合练习](ch26s01.html#id2845773) + [2\. 二叉树](ch26s02.html) + [2.1\. 二叉树的基本概念](ch26s02.html#id2845875) + [2.2\. 排序二叉树](ch26s02.html#id2846120) + [3\. 哈希表](ch26s03.html) + [27\. 本阶段总结](ch27.html) + [III. Linux系统编程](pt03.html) + [28\. 文件与I/O](ch28.html) + [1\. 汇编程序的Hello world](ch28s01.html) + [2\. C标准I/O库函数与Unbuffered I/O函数](ch28s02.html) + [3\. open/close](ch28s03.html) + [4\. read/write](ch28s04.html) + [5\. lseek](ch28s05.html) + [6\. fcntl](ch28s06.html) + [7\. ioctl](ch28s07.html) + [8\. mmap](ch28s08.html) + [29\. 文件系统](ch29.html) + [1\. 引言](ch29s01.html) + [2\. ext2文件系统](ch29s02.html) + [2.1\. 总体存储布局](ch29s02.html#id2857323) + [2.2\. 实例剖析](ch29s02.html#id2858019) + [2.3\. 数据块寻址](ch29s02.html#id2859212) + [2.4\. 文件和目录操作的系统函数](ch29s02.html#id2859394) + [3\. VFS](ch29s03.html) + [3.1\. 内核数据结构](ch29s03.html#id2860264) + [3.2\. dup和dup2函数](ch29s03.html#id2860911) + [30\. 进程](ch30.html) + [1\. 引言](ch30s01.html) + [2\. 环境变量](ch30s02.html) + [3\. 进程控制](ch30s03.html) + [3.1\. fork函数](ch30s03.html#id2866212) + [3.2\. exec函数](ch30s03.html#id2866732) + [3.3\. wait和waitpid函数](ch30s03.html#id2867242) + [4\. 进程间通信](ch30s04.html) + [4.1\. 管道](ch30s04.html#id2867812) + [4.2\. 其它IPC机制](ch30s04.html#id2868153) + [5\. 练习:实现简单的Shell](ch30s05.html) + [31\. Shell脚本](ch31.html) + [1\. Shell的历史](ch31s01.html) + [2\. Shell如何执行命令](ch31s02.html) + [2.1\. 执行交互式命令](ch31s02.html#id2872017) + [2.2\. 执行脚本](ch31s02.html#id2872211) + [3\. Shell的基本语法](ch31s03.html) + [3.1\. 变量](ch31s03.html#id2872666) + [3.2\. 文件名代换(Globbing):* ? []](ch31s03.html#id2872839) + [3.3\. 命令代换:`或 $()](ch31s03.html#id2872936) + [3.4\. 算术代换:$(())](ch31s03.html#id2872971) + [3.5\. 转义字符\](ch31s03.html#id2873001) + [3.6\. 单引号](ch31s03.html#id2873083) + [3.7\. 双引号](ch31s03.html#id2873112) + [4\. bash启动脚本](ch31s04.html) + [4.1\. 作为交互登录Shell启动,或者使用--login参数启动](ch31s04.html#id2873231) + [4.2\. 以交互非登录Shell启动](ch31s04.html#id2873387) + [4.3\. 非交互启动](ch31s04.html#id2873571) + [4.4\. 以sh命令启动](ch31s04.html#id2873616) + [5\. Shell脚本语法](ch31s05.html) + [5.1\. 条件测试:test [](ch31s05.html#id2873722) + [5.2\. if/then/elif/else/fi](ch31s05.html#id2874121) + [5.3\. case/esac](ch31s05.html#id2874366) + [5.4\. for/do/done](ch31s05.html#id2874526) + [5.5\. while/do/done](ch31s05.html#id2874637) + [5.6\. 位置参数和特殊变量](ch31s05.html#id2874685) + [5.7\. 函数](ch31s05.html#id2874943) + [6\. Shell脚本的调试方法](ch31s06.html) + [32\. 正则表达式](ch32.html) + [1\. 引言](ch32s01.html) + [2\. 基本语法](ch32s02.html) + [3\. sed](ch32s03.html) + [4\. awk](ch32s04.html) + [5\. 练习:在C语言中使用正则表达式](ch32s05.html) + [33\. 信号](ch33.html) + [1\. 信号的基本概念](ch33s01.html) + [2\. 产生信号](ch33s02.html) + [2.1\. 通过终端按键产生信号](ch33s02.html#id2884244) + [2.2\. 调用系统函数向进程发信号](ch33s02.html#id2884400) + [2.3\. 由软件条件产生信号](ch33s02.html#id2884567) + [3\. 阻塞信号](ch33s03.html) + [3.1\. 信号在内核中的表示](ch33s03.html#id2884694) + [3.2\. 信号集操作函数](ch33s03.html#id2884876) + [3.3\. sigprocmask](ch33s03.html#id2885022) + [3.4\. sigpending](ch33s03.html#id2885205) + [4\. 捕捉信号](ch33s04.html) + [4.1\. 内核如何实现信号的捕捉](ch33s04.html#id2885289) + [4.2\. sigaction](ch33s04.html#id2885439) + [4.3\. pause](ch33s04.html#id2885627) + [4.4\. 可重入函数](ch33s04.html#id2885983) + [4.5\. sig_atomic_t类型与volatile限定符](ch33s04.html#id2886197) + [4.6\. 竞态条件与sigsuspend函数](ch33s04.html#id2886686) + [4.7\. 关于SIGCHLD信号](ch33s04.html#id2887260) + [34\. 终端、作业控制与守护进程](ch34.html) + [1\. 终端](ch34s01.html) + [1.1\. 终端的基本概念](ch34s01.html#id2890359) + [1.2\. 终端登录过程](ch34s01.html#id2891132) + [1.3\. 网络登录过程](ch34s01.html#id2891618) + [2\. 作业控制](ch34s02.html) + [2.1\. Session与进程组](ch34s02.html#id2892071) + [2.2\. 与作业控制有关的信号](ch34s02.html#id2892541) + [3\. 守护进程](ch34s03.html) + [35\. 线程](ch35.html) + [1\. 线程的概念](ch35s01.html) + [2\. 线程控制](ch35s02.html) + [2.1\. 创建线程](ch35s02.html#id2895632) + [2.2\. 终止线程](ch35s02.html#id2896029) + [3\. 线程间同步](ch35s03.html) + [3.1\. mutex](ch35s03.html#id2896462) + [3.2\. Condition Variable](ch35s03.html#id2895424) + [3.3\. Semaphore](ch35s03.html#id2897332) + [3.4\. 其它线程间同步机制](ch35s03.html#id2897423) + [4\. 编程练习](ch35s04.html) + [36\. TCP/IP协议基础](ch36.html) + [1\. TCP/IP协议栈与数据包封装](ch36s01.html) + [2\. 以太网(RFC 894)帧格式](ch36s02.html) + [3\. ARP数据报格式](ch36s03.html) + [4\. IP数据报格式](ch36s04.html) + [5\. IP地址与路由](ch36s05.html) + [6\. UDP段格式](ch36s06.html) + [7\. TCP协议](ch36s07.html) + [7.1\. 段格式](ch36s07.html#id2900865) + [7.2\. 通讯时序](ch36s07.html#id2900917) + [7.3\. 流量控制](ch36s07.html#id2901189) + [37\. socket编程](ch37.html) + [1\. 预备知识](ch37s01.html) + [1.1\. 网络字节序](ch37s01.html#id2902826) + [1.2\. socket地址的数据类型及相关函数](ch37s01.html#id2902915) + [2\. 基于TCP协议的网络程序](ch37s02.html) + [2.1\. 最简单的TCP网络程序](ch37s02.html#id2902690) + [2.2\. 错误处理与读写控制](ch37s02.html#id2903656) + [2.3\. 把client改为交互式输入](ch37s02.html#id2903862) + [2.4\. 使用fork并发处理多个client的请求](ch37s02.html#id2903959) + [2.5\. setsockopt](ch37s02.html#id2904007) + [2.6\. 使用select](ch37s02.html#id2904122) + [3\. 基于UDP协议的网络程序](ch37s03.html) + [4\. UNIX Domain Socket IPC](ch37s04.html) + [5\. 练习:实现简单的Web服务器](ch37s05.html) + [5.1\. 基本HTTP协议](ch37s05.html#id2904532) + [5.2\. 执行CGI程序](ch37s05.html#id2904687) + [A. 字符编码](apa.html) + [1\. ASCII码](apas01.html) + [2\. Unicode和UTF-8](apas02.html) + [3\. 在Linux C编程中使用Unicode和UTF-8](apas03.html) + [B. GNU Free Documentation License Version 1.3, 3 November 2008](apb.html) + [参考书目](bi01.html) + [索引](ix01.html)