# 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
- 參考書目
- 索引