# 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)
- Linux C编程一站式学习
- 历史
- 前言
- 部分 I. C语言入门
- 第 1 章 程序的基本概念
- 第 2 章 常量、变量和表达式
- 第 3 章 简单函数
- 第 4 章 分支语句
- 第 5 章 深入理解函数
- 第 6 章 循环语句
- 第 7 章 结构体
- 第 8 章 数组
- 第 9 章 编码风格
- 第 10 章 gdb
- 第 11 章 排序与查找
- 第 12 章 栈与队列
- 第 13 章 本阶段总结
- 部分 II. C语言本质
- 第 14 章 计算机中数的表示
- 第 15 章 数据类型详解
- 第 16 章 运算符详解
- 第 17 章 计算机体系结构基础
- 第 18 章 x86汇编程序基础
- 第 19 章 汇编与C之间的关系
- 第 20 章 链接详解
- 第 21 章 预处理
- 第 22 章 Makefile基础
- 第 23 章 指针
- 第 24 章 函数接口
- 第 25 章 C标准库
- 第 26 章 链表、二叉树和哈希表
- 第 27 章 本阶段总结
- 部分 III. Linux系统编程
- 第 28 章 文件与I/O
- 第 29 章 文件系统
- 第 30 章 进程
- 第 31 章 Shell脚本
- 第 32 章 正则表达式
- 第 33 章 信号
- 第 34 章 终端、作业控制与守护进程
- 第 35 章 线程
- 第 36 章 TCP/IP协议基础
- 第 37 章 socket编程
- 附录 A. 字符编码
- 附录 B. GNU Free Documentation License Version 1.3, 3 November 2008
- 参考书目
- 索引