宣傳語
深入淺出,依靠深厚行業經驗講透技術原理
循序漸進,詳解典型套用案例提升實戰能力
內 容 簡 介
本書深入淺出、循序漸進地講解了Linux平台下的C程式設計,並通過大量的程式實例,以及綜合開發案例的演示,幫助讀者快速掌握Linux下C語言編程的方法和技巧。
本書內容翔實,共分為三大部分。第一部分為基礎篇,共有5章,主要講解了Linux系統的概述、C語言編程基礎、Linux下的兩種常用文本編輯器vi和Emacs、程式編譯器gcc和調試器gdb,以及make管理工具。第二部分為提高篇,共有7章,主要講解了Linux系統下各種操作的系統調用,包括檔案操作、進程控制、進程間通信、網路編程、GTK+圖形界面編程等。第三部分為實踐篇,共有5章,分別為5個不同的Linux平台下C程式開發的綜合案例,向讀者詳細闡述了Linux檔案操作、GTK+圖形界面編程、Linux網路編程,以及基於Linux平台的嵌入式軟體開發的方法和技巧。
本書是由作者根據多年來的開發工作經驗編著而成,語言通俗易懂,內容豐富,注重實例講解,知識涵蓋面廣。非常適合Linux平台下C語言編程的初學者以及高校本科生、研究生閱讀,也適合在Linux系統下進行C程式開發的工程師查閱和學習。
前 言
Linux誕生於1991年,由UNIX發展而來。幾乎每天Linux都會以某種方式出現在我們的生活中,我們已經數不清在Linux上有多少應用程式,以及有多少機構在使用Linux。國內外無數大型企業都在使用Linux系統作為伺服器解決方案,尤其是在嵌入式開發領域,Linux的套用更是在不斷增加。在百度上搜尋“Linux 軟體工程師”的相關網頁約有1,230,000篇,由此可見,在Linux平台下進行程式開發的需求之大。
作者根據自己多年來在Linux下進行C程式開發所積累的經驗,並融合大量的程式實例而著成此書。本書由淺入深,適合各個水平階段的讀者學習。
本書特點
1.配套視頻講解光碟
為了讓讀者更加快速、直觀地學習本書內容,作者專門為本書錄製了全程多媒體視頻教學,包括各個技術知識點,以及程式案例的分析。結合視頻的講解,能夠幫助讀者更高效地掌握Linux下C編程的技巧與方法。
2.循序漸進,由淺入深
從Linux系統的安裝、C語言編程基礎、Linux下的基本編輯器、程式編譯器和調試器、make工具管理器,到Linux系統的各種函式調用,再到Linux下具體程式案例的設計開發,本書內容由淺入深,囊括了Linux下C程式開發的各個環節。
3.程式實例豐富,實踐性強
在本書中,幾乎每個知識點都會伴隨一個或多個程式實例,通過實例來加深和鞏固讀者對知識點的理解和掌握。對於每個程式實例,作者都添加了十分詳細的注釋,方便讀者理解。並且,所有的實例讀者都可以在自己的實驗環境中完整實現。尤其是第3部分的五個項目案例,更是完整地向讀者演示了Linux環境下項目實例的設計與開發。
4.技術全面,知識點闡述到位
網路編程和圖形界面編程是C程式學習中比較深入的知識,也是本書重點講解的內容。在第3部分,我們將這些知識點與實際的項目開發結合,通過逐步設計與實現,深化和鞏固讀者對它們的理解與掌握。將Linux系統開發技術、C語言開發技術、軟體工程思想融會貫通,使得本書成為思想和內容都極其豐富的計算機教程。
本書內容
第1章:介紹Linux系統的基本概念和安裝方法,Linux下的常用命令,以及Shell的使用。這些是使用Linux的基礎,幫助讀者為本書後續的學習打下紮實的基礎。
第2章:詳細講述了C語言的編程基礎,它們是熟悉和掌握這些信息與學習C語言的必經之路,同時也方便了讀者在閱讀本書時查閱C語言中的相關知識點。
第3章:講述Linux下最常用的兩種文本編輯器vi和Emacs,通過實例套用講解讓讀者一步一步地學會如何使用這些編輯器的使用。
第4章:講解Linux系統下的程式編譯器gcc和程式調試器gdb,二者是在Linux下進行C程式開發所必備的工具。
第5章:講述Linux下的工程管理器make,以及Makefile的書寫規則。make工具大大提高了實際項目的工作效率,幾乎所有Linux下的項目編程都會涉及它。
第6章:講解基於檔案描述符的檔案I/O操作,以及Linux中檔案系統的概念。檔案操作是Linux系統中最常見的操作之一,在Linux中,所有的內容都被看成檔案,所有的操作都可以歸結為對檔案的操作。
第7章:講述基於流的檔案I/O操作。基於流的I/O操作是由標準C函式館提供的,與基於檔案描述符的I/O操作相比,基於流的I/O更簡單、方便。在大多數情況下,程式設計師更願意使用基於流的輸入輸出方法。
第8章:詳細闡述了Linux下進程控制的原理。進程是作業系統中一個非常重要的概念,熟悉使用進程的操作和進程控制的相關係統調用,會使用戶在使用Linux系統完成各種工作時更加得心應手。
第9章:講解Linux信號的基本概念,以及Linux下信號處理的機制。信號的使用對於靈活使用C語言在Linux環境下進行程式開發是非常有益的,在編寫大型的程式時,經常會需要處理多個進程之間的異步事件,所以是離不開信號的使用的。
第10章:詳細講述了Linux進程間通信的概念,以及Linux下5中最常用的進程間通信方式,它們包括:管道、命名管道、訊息佇列、共享記憶體、信號量等。
第11章:詳細講述了Linux網路編程的原理與方法,通過大量的程式實例演示了Socket編程中常用API的使用方法。
第12章:講述GTK+圖形界面編程。GTK+是Linux下基於C的圖形界面開發庫,通過程式實例向讀者演示了使用GTK+庫創建各種界面元件的方法。
第13章:通過講述一個計算器軟體的設計案例,進一步向讀者演示圖形界面編程的技巧,以及GTK+信號與回調函式的原理。
第14章:通過設計一個類似於QQ的聊天軟體,向讀者演示了小型項目工程軟體的模組劃分方法,以及Linux下的C程式開發的步驟。使讀者能夠更深層次地掌握GTK+圖形界面編程,以及Linux網路編程的原理方法。
第15章:講述Linux下一種基於C/S模式實現的遠程管理工具的設計。使讀者對Linux下的檔案I/O操作、相關係統服務的管理有更深層次的了解和認識,並進一步掌握GTK+圖形界面編程,套接字Socket網路編程的使用方法。
第16章:講述了在Linux-2.4.20-8核心下利用Netfilter數據控制過濾機制完成簡易防火牆軟體的設計,實現了對固定連線埠、網頁訪問,以及不同協定類型的數據報文的管理和控制。
第17章:講述基於Linux的嵌入式家庭網關遠程互動操作平台的設計。向讀者闡述了嵌入式系統,以及家庭網關的概念,採用B/S結構的開發模式,嵌入式Web伺服器選取Boa,並結合CGI技術,實現了動態的具體智慧型設備的訪問和控制。
本書適合的讀者:
Linux及C程式設計初學者。
大中專院校計算機及相關專業的學生。
高校計算機及相關專業本科生、研究生。
Linux軟體開發從業人員。
開源軟體開發愛好者。
社會培訓學生。
最後,我要感謝我的家人及好友陳曦在我最困難的時候帶給我快樂與動力,支持我一直堅持下來,並最終完成這部著作。
本書主要由張繁主持編寫,參加本書編寫工作的還有高淑娟、王麗娜、周毅、林小峰、劉剛、馬海波、李強、吳慧、馬玉剛、馮浩、唐愛琴、李子龍、王明明、蔣志等,在此,編者對以上人員致以誠摯的謝意!
作者力圖使本書案例功能翔實,並儘量使用關鍵編程技術進行程式設計和簡化程式代碼。但由於水平有限,書中難免有錯誤、紕漏之處,歡迎廣大讀者、同仁批評斧正。
編著者
目 錄
第1部分 基礎篇
第1章 Linux系統概述 1
1.1 什麼是Linux 2
1.2 Linux系統特點及主要功能 2
1.2.1 Linux系統特點 3
1.2.2 Linux系統的主要功能 3
1.3 Linux的核心版本和發行版本 5
1.4 系統的安裝 6
1.4.1 系統安裝前的準備工作 6
1.4.2 從光碟安裝Linux 6
1.4.3 從硬碟安裝Linux 22
1.4.4 在虛擬機下安裝Linux 22
1.5 Shell的使用 27
1.5.1 Shell簡介 27
1.5.2 常見Shell的種類 28
1.5.3 Shell的簡單使用 29
1.5.4 通配符 30
1.5.5 引號 31
1.5.6 注釋符 33
1.6 Linux常用命令 33
1.6.1 與目錄相關的命令 33
1.6.2 與檔案相關的命令 34
1.6.3 與網路服務相關的命令 35
1.7 本章小結 35
實戰演練 36
第2章 C語言編程基礎 37
2.1 C語言的歷史背景 38
2.2 C語言的特點 38
2.3 C語言的基本數據類型 39
2.3.1 整型 39
2.3.2 實型 40
2.3.3 字元型 41
2.4 運算符與表達式 43
2.4.1 算術運算符與算術表達式 43
2.4.2 賦值運算符與賦值表達式 44
2.4.3 逗號運算符與逗號表達式 45
2.5 C程式的3種基本結構 46
2.5.1 順序結構 46
2.5.2 選擇結構 47
2.5.3 循環結構 51
2.6 C語言中的數據輸入與輸出 54
2.6.1 字元輸出函式putchar 54
2.6.2 字元輸入函式getchar 54
2.6.3 格式輸出函式printf 54
2.6.4 格式輸入函式scanf 56
2.7 函式 57
2.7.1 函式的定義 57
2.7.2 函式的調用 58
2.7.3 變數的存儲類別 59
2.8 數組 62
2.8.1 一維數組的定義和使用 63
2.8.2 二維數組的定義和使用 64
2.8.3 字元數組和字元串 65
2.8.4 常用字元串處理函式 66
2.9 指針 69
2.9.1 地址和指針 69
2.9.2 指針的定義和使用 70
2.9.3 數組與指針 71
2.9.4 字元串與指針 72
2.9.5 指向函式的指針 72
2.10 結構體和共用體 73
2.10.1 定義和引用結構體 73
2.10.2 結構體數組 74
2.10.3 指向結構體的指針 74
2.10.4 共用體 75
2.10.5 使用typedef定義類型 77
2.11 鍊表 77
2.11.1 鍊表概述 77
2.11.2 建立動態單向鍊表 78
2.11.3 單向鍊表的輸出 80
2.11.4 對單向鍊表的刪除操作 80
2.11.5 對單向鍊表的插入操作 81
2.11.6 循環鍊表 82
2.11.7 雙向鍊表 82
2.12 位運算符和位運算 83
2.12.1 “按位與”運算符(&) 84
2.12.2 “按位或”運算符(|) 84
2.12.3 “取反”運算符(~) 84
2.12.4 “異或”運算符(^) 84
2.12.5 移位運算符(<<和>>) 85
2.12.6 位域 85
2.13 C語言預處理命令 86
2.13.1 宏定義 86
2.13.2 檔案包含 87
2.13.3 條件編譯 88
2.13.4 #error等其他常用預處理命令 89
2.14 本章小結 89
實戰演練 89
第3章 vi與Emacs編輯器 91
3.1 vi的使用 92
3.1.1 啟動與退出vi 92
3.1.2 vi的命令行模式 93
3.1.3 vi的插入模式 96
3.1.4 vi的底行模式 96
3.2 vi使用實例 97
3.3 Emacs的使用 100
3.3.1 啟動與退出Emacs 101
3.3.2 Emacs下的基本操作 102
3.4 Emacs使用實例 107
3.5 本章小結 109
實戰演練 109
第4章 gcc編譯器與gdb調試器 110
4.1 gcc編譯器簡介 111
4.2 如何使用gcc 112
4.2.1 gcc編譯初步 112
4.2.2 警告提示功能 114
4.2.3 最佳化gcc 116
4.2.4 連線庫 119
4.2.5 同時編譯多個源程式 120
4.2.6 管道 120
4.2.7 調試選項 121
4.3 gdb調試器 122
4.3.1 gdb簡介 122
4.3.2 gdb常用命令 123
4.3.3 gdb調試初步 124
4.4 gdb的使用詳解 126
4.4.1 調用gdb 127
4.4.2 使用斷點 127
4.4.3 查看運行時數據 129
4.4.4 查看源程式 133
4.4.5 改變程式的執行 135
4.5 xxgdb調試器簡介 138
4.6 本章小結 139
實戰演練 139
第5章 make的使用和Makefile的編寫 141
5.1 什麼是make 142
5.1.1 make機制概述 142
5.1.2 make與Makefile的關係 144
5.2 Makefile的書寫規則 147
5.2.1 Makefile的基本語法規則 148
5.2.2 在規則中使用通配符 149
5.2.3 偽目標 149
5.2.4 多目標 151
5.2.5 自動生成依賴性 151
5.3 Makefile的命令 152
5.4 變數 154
5.4.1 變數的基礎 154
5.4.2 賦值變數 154
5.4.3 define關鍵字 156
5.4.4 override指示符 156
5.4.5 目標變數和模式變數 157
5.5 常用函式調用 158
5.5.1 字元串處理函式 158
5.5.2 檔案名稱操作函式 162
5.5.3 循環函式 164
5.5.4 條件判斷函式 165
5.5.5 其他常用函式 166
5.6 隱式規則 168
5.6.1 隱式規則舉例 168
5.6.2 隱式規則中的變數 169
5.6.3 使用模式規則 170
5.7 本章小結 173
實戰演練 173
第2部分 提高篇
第6章 檔案I/O操作 174
6.1 Linux檔案系統簡介 175
6.1.1 Linux的檔案系統結構 175
6.1.2 檔案類型 176
6.1.3 檔案訪問許可權 179
6.2 基於檔案描述符的I/O操作 179
6.2.1 檔案描述符 180
6.2.2 標準輸入、標準輸出和標準出錯 180
6.2.3 檔案重定向 181
6.2.4 檔案的創建、打開與關閉 182
6.2.5 檔案的定位 186
6.2.6 檔案的讀寫 188
6.3 檔案的屬性操作 192
6.3.1 改變檔案訪問許可權 192
6.3.2 改變檔案所有者 193
6.3.3 重命名 193
6.3.4 修改檔案長度 194
6.4 檔案的其他操作 195
6.4.1 stat、fstat和lstat函式 195
6.4.2 dup和dup2函式 196
6.4.3 fcntl函式 197
6.4.4 sync和fsync函式 197
6.5 特殊檔案的操作 198
6.5.1 目錄檔案的操作 198
6.5.2 連結檔案的操作 201
6.5.3 管道檔案的操作 204
6.5.4 設備檔案 204
6.6 本章小結 205
實戰演練 205
第7章 基於流的I/O操作 206
7.1 流與快取 207
7.1.1 流和FILE對象 207
7.1.2 標準輸入、標準輸出和標準出錯 207
7.1.3 快取 207
7.1.4 對快取的操作 210
7.2 流的打開與關閉 212
7.2.1 流的打開 212
7.2.2 流的關閉 214
7.2.3 流關閉前的工作 216
7.3 流的讀寫 216
7.3.1 基於字元的I/O 217
7.3.2 基於行的I/O 220
7.3.3 直接I/O 222
7.3.4 格式化I/O 224
7.4 本章小結 226
實戰演練 227
第8章 進程控制 228
8.1 進程的基本概念 229
8.1.1 Linux進程簡介 229
8.1.2 進程與作業 230
8.1.3 進程標識 230
8.2 進程控制的相關函式 232
8.2.1 fork和vfork函式 232
8.2.2 exec函式 237
8.2.3 exit和_exit函式 242
8.2.4 wait和waitpid函式 245
8.2.5 進程的一生 251
8.2.6 用戶ID和組ID 251
8.2.7 system函式 253
8.3 多個進程間的關係 255
8.3.1 進程組 255
8.3.2 會話期 256
8.3.3 控制終端 257
8.4 本章小結 259
實戰演練 259
第9章 信號 260
9.1 Linux信號簡介 261
9.1.1 信號的基本概念 261
9.1.2 信號處理機制 265
9.2 信號操作的相關函式 267
9.2.1 信號的處理 267
9.2.2 信號的傳送 274
9.2.3 信號的阻塞 282
9.2.4 計時器與信號 284
9.3 本章小結 286
實戰演練 287
第10章 進程間通信 288
10.1 進程間通信簡介 289
10.2 管道 290
10.2.1 管道的概念 290
10.2.2 管道的創建與關閉 291
10.2.3 管道的讀寫 292
10.3 命名管道 297
10.3.1 命名管道的概念 297
10.3.2 命名管道的創建 297
10.3.3 命名管道的讀寫 299
10.4 訊息佇列 303
10.4.1 訊息佇列的概念 303
10.4.2 訊息佇列的創建與打開 305
10.4.3 訊息佇列的讀寫 306
10.4.4 獲得或設定訊息佇列屬性 308
10.5 共享記憶體 312
10.5.1 共享記憶體的概念 312
10.5.2 共享記憶體的相關操作 313
10.6 信號量 318
10.6.1 信號量的概念 319
10.6.2 信號量集的相關操作 320
10.7 本章小結 325
實戰演練 326
第11章 網路編程 327
11.1 網路編程的基礎知識 328
11.1.1 計算機網路體系結構 328
11.1.2 傳輸控制協定TCP 333
11.1.3 用戶數據報協定UDP 335
11.1.4 客戶機/伺服器模式 336
11.2 套接口編程基礎 336
11.2.1 什麼是套接口 337
11.2.2 連線埠號的概念 338
11.2.3 套接口的數據結構 338
11.2.4 基本函式 340
11.3 TCP套接口編程 343
11.3.1 TCP套接口通信工作流程 343
11.3.2 TCP套接口Client/Server程式實例 356
11.4 UDP套接口編程 360
11.4.1 UDP套接口通信工作流程 360
11.4.2 UDP套接口Client/Server程式實例 362
11.5 原始套接口編程 365
11.5.1 原始套接口的創建 365
11.5.2 原始套接口程式實例 365
11.6 本章小結 376
實戰演練 376
第12章 Linux圖形界面編程 377
12.1 Linux下的圖形界面編程簡介 378
12.1.1 Qt簡介 378
12.1.2 GTK+簡介 378
12.2 界面基本元件 381
12.2.1 一個簡單的例子 381
12.2.2 視窗 383
12.2.3 標籤 385
12.2.4 按鈕 386
12.2.5 文本框 387
12.3 界面布局元件 389
12.3.1 表格 390
12.3.2 框 393
12.3.3 窗格 395
12.4 其他常用元件 398
12.4.1 進度條、微調按鈕、組合框 398
12.4.2 單選按鈕、複選按鈕 402
12.4.3 下拉選單 404
12.5 信號與回調函式 406
12.6 本章小結 409
實戰演練 409
第3部分 實戰篇
第13章 設計Linux下的計算器 411
13.1 軟體功能分析 412
13.2 程式模組的劃分 413
13.3 軟體的具體實現 415
13.3.1 頭檔案 415
13.3.2 十六進制界面顯示函式 416
13.3.3 十進制界面顯示函式 417
13.3.4 八進制界面顯示函式 418
13.3.5 二進制界面顯示函式 419
13.3.6 進制間轉換函式 420
13.3.7 信號處理模組 423
13.3.8 主函式 432
13.4 軟體使用效果演示 438
13.5 本章小結 439
第14章 Linux平台下聊天軟體的設計 440
14.1 軟體功能概述 441
14.1.1 伺服器端功能需求 441
14.1.2 客戶端功能需求 442
14.1.3 錯誤處理需求 442
14.2 Glade集成開發工具簡介 443
14.3 軟體功能模組劃分 444
14.3.1 伺服器功能模組劃分 444
14.3.2 客戶端功能模組劃分 445
14.3.3 訊息標識的定義 445
14.3.4 訊息結構體的設計 446
14.4 伺服器程式的具體實現 447
14.4.1 伺服器訊息處理流程 447
14.4.2 伺服器主要函式和變數 448
14.4.3 伺服器訊息處理模組的設計與實現 449
14.4.4 伺服器數據存儲的方法 450
14.4.5 用戶註冊流程 450
14.5 客戶端程式的具體實現 451
14.5.1 客戶端操作流程 451
14.5.2 客戶端傳送和接收訊息流程 451
14.5.3 客戶端主要函式和變數 452
14.5.4 客戶端功能模組的設計與實現 453
14.6 聊天軟體使用效果演示 455
14.7 本章小結 459
第15章 Linux遠程管理工具的設計 460
15.1 軟體功能概述 461
15.1.1 Webmin簡介 461
15.1.2 軟體總體設計 461
15.2 伺服器端程式設計 463
15.2.1 伺服器端工作流程 463
15.2.2 系統用戶管理操作 464
15.2.3 系統用戶組的管理操作 466
15.2.4 系統服務啟動管理 468
15.2.5 DNS管理操作 469
15.2.6 Apache服務管理操作 471
15.2.7 FTP服務管理操作 474
15.3 客戶端程式 475
15.3.1 連線界面 475
15.3.2 主界面 477
15.4 本章小結 479
第16章 Linux下簡易防火牆軟體的設計 480
16.1 Netfilter基礎 481
16.1.1 什麼是Netfilter 481
16.1.2 Netfilter的HOOK機制 482
16.1.3 HOOK的調用 485
16.1.4 HOOK的實現 486
16.1.5 IPTables簡介 488
16.1.6 Netfilter可以實現的控制功能 489
16.2 軟體設計概述 491
16.2.1 軟體整體框架 491
16.2.2 管理端的設計 492
16.2.3 控制端的設計 493
16.3 用Netfilter設計控制端功能模組 495
16.3.1 ICMP管理控制模組 495
16.3.2 FTP管理控制模組 497
16.3.3 HTTP管理控制模組 499
16.3.4 模組的編譯、載入與卸載 499
16.4 軟體功能測試 501
16.5 本章小結 503
第17章 基於Linux的嵌入式家庭網關遠程互動操作平台的設計 504
17.1 嵌入式技術簡介 505
17.1.1 嵌入式系統的概念 505
17.1.2 嵌入式作業系統 506
17.1.3 嵌入式處理器 507
17.2 家庭網關的概念及其網路體系結構 509
17.2.1 智慧型家庭網路的概念 509
17.2.2 家庭網關的遠程互動操作技術簡介 510
17.2.3 嵌入式家庭網關的網路體系結構 510
17.3 嵌入式家庭網關的開發平台 511
17.3.1 S3C2410微處理器簡介 511
17.3.2 交叉編譯環境的建立 513
17.4 遠程互動平台的設計 515
17.4.1 套用軟體的開發模式 515
17.4.2 嵌入式Web伺服器 516
17.4.3 通用網關接口CGI 519
17.5 Linux下軟體模組的具體實現 520
17.5.1 登錄驗證模組 521
17.5.2 串口通信模組 521
17.5.3 中央空調控制模組 522
17.5.4 智慧型水錶數據採集模組 528
17.5.5 試驗結果 528
17.6 本章小結 529