Linux C編程一站式學習

宋勁杉

北京亞嵌教育研究中心

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.

2009.6.23

修訂歷史
修訂 0.62009.2.27

添加了GFDL許可證,正式網絡發佈。第三部分還很粗糙,錯誤也有不少,有待改進。第一部分和第二部分已經比較成熟,第二部分還差三章沒寫。

修訂 0.72009.4.24

全書的章節基本完成,但有些章節還很不完善。


目錄

歷史
前言
I. C語言入門
1. 程序的基本概念
1. 程序和編程語言
2. 自然語言和形式語言
3. 程序的調試
4. 第一個程序
2. 常量、變數和表達式
1. 繼續Hello World
2. 常量
3. 變數
4. 賦值
5. 表達式
6. 字元類型與字元編碼
3. 簡單函數
1. 數學函數
2. 自定義函數
3. 形參和實參
4. 全局變數、局部變數和作用域
4. 分支語句
1. if語句
2. if/else語句
3. 布爾代數
4. switch語句
5. 深入理解函數
1. return語句
2. 增量式開發
3. 遞歸
6. 循環語句
1. while語句
2. do/while語句
3. for語句
4. break和continue語句
5. 嵌套循環
6. goto語句和標號
7. 結構體
1. 復合類型與結構體
2. 數據抽象
3. 數據類型標誌
4. 嵌套結構體
8. 數組
1. 數組的基本概念
2. 數組應用實例:統計隨機數
3. 數組應用實例:直方圖
4. 字元串
5. 多維數組
9. 編碼風格
1. 縮進和空白
2. 註釋
3. 標識符命名
4. 函數
5. indent工具
10. gdb
1. 單步執行和跟蹤函數調用
2. 斷點
3. 觀察點
4. 段錯誤
11. 排序與查找
1. 算法的概念
2. 插入排序
3. 算法的時間複雜度分析
4. 歸併排序
5. 線性查找
6. 折半查找
12. 棧與隊列
1. 資料結構的概念
2. 堆棧
3. 深度優先搜索
4. 隊列與廣度優先搜索
5. 環形隊列
13. 本階段總結
II. C語言本質
14. 計算機中數的表示
1. 為什麼計算機用二進制計數
2. 不同進制之間的換算
3. 整數的加減運算
3.1. Sign and Magnitude表示法
3.2. 1's Complement表示法
3.3. 2's Complement表示法
3.4. 有符號數和無符號數
4. 浮點數
15. 數據類型詳解
1. 整型
2. 浮點型
3. 類型轉換
3.1. Integer Promotion
3.2. Usual Arithmetic Conversion
3.3. 由賦值產生的類型轉換
3.4. 強制類型轉換
3.5. 編譯器如何處理類型轉換
16. 運算符詳解
1. 位運算
1.1. 按位與、或、異或、取反運算
1.2. 移位運算
1.3. 掩碼
1.4. 異或運算的一些特性
2. 其它運算符
2.1. 復合賦值運算符
2.2. 條件運算符
2.3. 逗號運算符
2.4. sizeof運算符與typedef類型聲明
3. Side Effect與Sequence Point
4. 運算符總結
17. 計算機體繫結構基礎
1. 內存與地址
2. CPU
3. 設備
4. MMU
5. Memory Hierarchy
18. x86彙編程序基礎
1. 最簡單的彙編程序
2. x86的寄存器
3. 第二個彙編程序
4. 定址方式
5. ELF檔案
5.1. 目標檔案
5.2. 執行檔
19. 彙編與C之間的關係
1. 函數調用
2. main函數和啟動常式
3. 變數的存儲佈局
4. 結構體和聯合體
5. C內聯彙編
6. volatile限定符
20. 連結詳解
1. 多目標檔案的連結
2. 定義和聲明
2.1. externstatic關鍵字
2.2. 標頭檔
2.3. 定義和聲明的詳細規則
3. 靜態庫
4. 共享庫
4.1. 編譯、連結、運行
4.2. 動態連結的過程
4.3. 共享庫的命名慣例
5. 虛擬內存管理
21. 預處理
1. 預處理的步驟
2. 宏定義
2.1. 函數式宏定義
2.2. 內聯函數
2.3. ###運算符和可變參數
2.4. 宏展開的步驟
3. 條件預處理指示
4. 其它預處理特性
22. Makefile基礎
1. 基本規則
2. 隱含規則和模式規則
3. 變數
4. 自動處理標頭檔的依賴關係
5. 常用的make命令行選項
23. 指針
1. 指針的基本概念
2. 指針類型的參數和返回值
3. 指針與數組
4. 指針與const限定符
5. 指針與結構體
6. 指向指針的指針與指針數組
7. 指向數組的指針與多維數組
8. 函數類型和函數指針類型
9. 不完全類型和複雜聲明
24. 函數介面
1. 本章的預備知識
1.1. strcpystrncpy
1.2. mallocfree
2. 傳入參數與傳出參數
3. 兩層指針的參數
4. 返回值是指針的情況
5. 回調函數
6. 可變參數
25. C標準庫
1. 字元串操作函數
1.1. 初始化字元串
1.2. 取字元串的長度
1.3. 拷貝字元串
1.4. 連接字元串
1.5. 比較字元串
1.6. 搜索字元串
1.7. 分割字元串
2. 標準I/O庫函數
2.1. 檔案的基本概念
2.2. fopen/fclose
2.3. stdin/stdout/stderr
2.4. errno與perror函數
2.5. 以位元組為單位的I/O函數
2.6. 操作讀寫位置的函數
2.7. 以字元串為單位的I/O函數
2.8. 以記錄為單位的I/O函數
2.9. 格式化I/O函數
2.10. C標準庫的I/O緩衝區
2.11. 本節綜合練習
3. 數值字元串轉換函數
4. 分配內存的函數
26. 鏈表、二叉樹和哈希表
1. 鏈表
1.1. 單鏈表
1.2. 雙向鏈表
1.3. 靜態鏈表
1.4. 本節綜合練習
2. 二叉樹
2.1. 二叉樹的基本概念
2.2. 排序二叉樹
3. 哈希表
27. 本階段總結
III. Linux系統編程
28. 檔案與I/O
1. 彙編程序的Hello world
2. C標準I/O庫函數與Unbuffered I/O函數
3. open/close
4. read/write
5. lseek
6. fcntl
7. ioctl
8. mmap
29. 檔案系統
1. 引言
2. ext2檔案系統
2.1. 總體存儲佈局
2.2. 實例剖析
2.3. 數據塊定址
2.4. 檔案和目錄操作的系統函數
3. VFS
3.1. 內核資料結構
3.2. dup和dup2函數
30. 進程
1. 引言
2. 環境變數
3. 進程控制
3.1. fork函數
3.2. exec函數
3.3. wait和waitpid函數
4. 進程間通信
4.1. 管道
4.2. 其它IPC機制
5. 練習:實現簡單的Shell
31. Shell腳本
1. Shell的歷史
2. Shell如何執行命令
2.1. 執行互動式命令
2.2. 執行腳本
3. Shell的基本語法
3.1. 變數
3.2. 檔案名代換(Globbing):* ? []
3.3. 命令代換:`或 $()
3.4. 算術代換:$(())
3.5. 轉義字元\
3.6. 單引號
3.7. 雙引號
4. bash啟動腳本
4.1. 作為交互登錄Shell啟動,或者使用--login參數啟動
4.2. 以交互非登錄Shell啟動
4.3. 非交互啟動
4.4. 以sh命令啟動
5. Shell腳本語法
5.1. 條件測試:test [
5.2. if/then/elif/else/fi
5.3. case/esac
5.4. for/do/done
5.5. while/do/done
5.6. 位置參數和特殊變數
5.7. 函數
6. Shell腳本的調試方法
32. 正則表達式
1. 引言
2. 基本語法
3. sed
4. awk
5. 練習:在C語言中使用正則表達式
33. 信號
1. 信號的基本概念
2. 產生信號
2.1. 通過終端按鍵產生信號
2.2. 調用系統函數向進程發信號
2.3. 由軟件條件產生信號
3. 阻塞信號
3.1. 信號在內核中的表示
3.2. 信號集操作函數
3.3. sigprocmask
3.4. sigpending
4. 捕捉信號
4.1. 內核如何實現信號的捕捉
4.2. sigaction
4.3. pause
4.4. 可重入函數
4.5. sig_atomic_t類型與volatile限定符
4.6. 競態條件與sigsuspend函數
4.7. 關於SIGCHLD信號
34. 終端、作業控制與守護進程
1. 終端
1.1. 終端的基本概念
1.2. 終端登錄過程
1.3. 網絡登錄過程
2. 作業控制
2.1. Session與進程組
2.2. 與作業控制有關的信號
3. 守護進程
35. 綫程
1. 綫程的概念
2. 綫程控制
2.1. 創建綫程
2.2. 終止綫程
3. 綫程間同步
3.1. mutex
3.2. Condition Variable
3.3. Semaphore
3.4. 其它綫程間同步機制
4. 編程練習
36. TCP/IP協議基礎
1. TCP/IP協議棧與數據包封裝
2. 乙太網(RFC 894)幀格式
3. ARP數據報格式
4. IP數據報格式
5. IP地址與路由
6. UDP段格式
7. TCP協議
7.1. 段格式
7.2. 通訊時序
7.3. 流量控制
37. socket編程
1. 預備知識
1.1. 網絡位元組序
1.2. socket地址的數據類型及相關函數
2. 基于TCP協議的網絡程序
2.1. 最簡單的TCP網絡程序
2.2. 錯誤處理與讀寫控制
2.3. 把client改為互動式輸入
2.4. 使用fork並發處理多個client的請求
2.5. setsockopt
2.6. 使用select
3. 基于UDP協議的網絡程序
4. UNIX Domain Socket IPC
5. 練習:實現簡單的Web伺服器
5.1. 基本HTTP協議
5.2. 執行CGI程序
A. 字元編碼
1. ASCII碼
2. Unicode和UTF-8
3. 在Linux C編程中使用Unicode和UTF-8
B. GNU Free Documentation License Version 1.3, 3 November 2008
參考書目
索引