內容簡介
Linux C程式設計王者歸來共28章,分6篇。第1篇Linux下C語言基礎,介紹了Linux發展、控制結構、C語言中的函式、指針與字元串及C語言高級技術等;第2篇C語言開發環境,介紹了vi編輯器、gcc編譯器、構建makefile檔案和gdb調試器等;第3篇Linux進程操作,介紹了進程環境、進程控制、時間和日曆歷程、信號及信號處理、進程間通信、執行緒和執行緒高級操作等;第4篇Linux檔案操作,介紹了檔案I/O、檔案管理、目錄操作、特殊檔案和基於流的I/O等;第5篇Linux網路編程,介紹了TCP和UDP協定、網路編程基礎、網路編程進階、實現檔案傳輸程式實例和簡單的Web伺服器實例;第6篇介紹了shell腳本基礎和腳本中的控制結構等。
本書由淺入深,全面細緻地講述了Linux環境C程式設計從基本概念到實際操作,從核心原理到具體實踐,再到實際案例開發等內容,涵蓋了LinuxC程式設計的所有重要知識點。本書講解時結合大量實例,便於讀者通過動手實踐更加深刻地理解所學知識。另外,本書配1張DVD光碟,內容為作者專門為本書錄製的16.8小時高清配套教學視頻、本書涉及的實例源檔案及其他相關學習資料。
本書適合所有想全面學習LinuxC開發技術的人員閱讀,也適合各種使用LinuxC做開發的工程技術人員閱讀。對於長期在Linux平台做開發的程式設計師,本書更是一本不可多得的案頭必備參考書。
前 言
Linux系統以其免費、開源等特點,在伺服器解決方案、嵌入式開發和計算機安全等領域的優勢已經越來越明顯,也越來越被更多的開發人員所認同。在Linux系統下,最為有效的開發方式是採用C語言開發。IT行業的人才招聘也可以印證這一點。很明顯,基於Linux系統開發的人員需求量不斷增加,尤其對Linux環境C程式設計人員的需求尤為明顯。
儘管Linux環境C語言開發越來越被企業和開發人員所認同,而且關注的人數也越來越多,但實際上真正了解和掌握Linux環境C程式設計的人員卻是少數,在整個程式設計師隊伍中所占比例依然較低。這可能也是由於Linux環境C程式設計對於大多數人來說並不是一件容易的事,開發人員要在陌生的戰場(Linux作業系統),使用陌生的武器(gcc和vi等開發工具),和陌生的敵人(要遇到作業系統層面的相關技術)作戰。
為了讓廣大Linux環境C程式設計愛好者和程式設計師更加系統、深入和透徹地學習這門技術,筆者總結了自己親身學習Linux系統函式接口的經驗,並結合了多年從事Linux環境C程式設計的經驗,編寫了本書。在本書中,筆者將通過28章的學習規劃,讓讀者更快速地掌握Linux環境C程式設計的基本知識和編程技巧。
本書特色
1.技術翔實,內容突出
本書從實際開發者的角度出發,全面、系統、深入地介紹了Linux環境C語言編程方方面面的知識。書中除了涉及Linux系統函式的各個方面外,還選擇了當前最熱門、套用最廣的技術進行了深入的討論。
2.概念準確,理解深刻
本書對每個核心概念都使用通俗、形象的語言進行解釋,對很多關鍵概念還配有相關插圖,讓讀者更加直觀地掌握概念的含義。另外,鑒於廣大讀者對Windows比較熟悉,本書在多處概念講解中將Linux和Windows系統開發中的相關概念進行了對比講解,以加深讀者對Linux開發的理解。
3.實例豐富,強調實踐
為了讓讀者易於掌握Linux環境下C語言編程的技巧,本書列舉了大量實例進行講解。通過這些實例,讀者可以更加深入地理解相關概念,從而達到靈活使用Linux系統函式接口編寫程式的目的。另外,本書重點強調實踐性,書中的很多例子都來源於作者的實際開發,大多數實例都是一些實際項目中截取的一部分子功能。通過對這些例子的學習,可以增強讀者的動手實踐能力。
4.代碼規範,注釋詳細
為了讓讀者了解Linux環境下開發的要求,本書在講解代碼時十分注意代碼規範。書中所有的代碼都取自實際開發經驗,符合規範。為了幫助讀者理解代碼含義,書中對代碼進行了詳細的注釋,讀者可以通過注釋十分便利地了解代碼的結構和流程。
5.視頻教學,高效直觀
筆者專門為本書錄製了長達16.8小時的配套高清多媒體教學視頻,便於讓讀者更加輕鬆、直觀地學習,從而提高學習效率。這些視頻與本書原始碼一起收錄於配書光碟中。
本書內容
第1篇 Linux下C語言基礎(第1~5章)
本篇主要內容包括:Linux簡介、控制結構、C語言中的函式、C語言中的指針與字元串及C語言的高級技術。通過本篇的學習,讀者可以了解Linux的發展過程,掌握Linux下C語言的基礎知識。
第2篇 C語言開發環境(第6~9章)
本篇主要內容包括:vi編輯器、gcc編譯器、構建makefile檔案及gdb調試器。通過本篇的學習,讀者可以掌握Linux下C語言開發環境的使用。
第3篇 Linux進程操作(第10~16章)
本篇主要內容包括:進程環境、進程控制、時間和日曆歷程、信號及信號處理、進程間通信、執行緒及執行緒高級操作。通過本篇的學習,讀者可以掌握Linux下C語言編程的進程操作技術。
第4篇 Linux檔案操作(第17~21章)
本篇主要內容包括:檔案I/O、檔案管理、目錄操作、特殊檔案及基於流的I/O。通過本篇的學習,讀者可以掌握Linux下C語言的檔案操作。
第5篇 Linux網路編程(第22~26章)
本篇主要內容包括:TCP和UDP協定、網路編程基礎、網路編程進階及兩個編程實例。通過本篇的學習,讀者可以熟練掌握Linux下C語言的網路編程技術。
第6篇 shell腳本知識(第27~28章)
本篇主要內容包括:shell腳本基礎和shell腳本中的控制結構。通過本篇的學習,讀者可以初步掌握shell腳本的知識。
學習建議
為了提高讀者的學習效率,增強學習效果,特別提出以下學習建議。
* 仔細看圖:為了幫助讀者理解概念,本書中多次使用了圖示的方法來講解概念。請讀者認真查看這些示意圖,可以更加深刻地理解所講解的知識點。
* 親自動手:本書中的所有實例都有實際的開發背景,所以需要讀者親自完成書中的實例,這樣才能身臨其境地感受到實際項目對開發者的要求。
* 技術交流:Linux本身就是開源的系統,從誕生之日起,就和技術交流密切相關。根據筆者的經驗,技術交流和網路資源對開發者而言是至關重要的。希望讀者一開始就能注意到技術交流的重要性。
* 堅持編程:程式設計是實踐性很強的事,除了要掌握好基本的語法和理論外,還需要長期堅持動手實踐,只有這樣才能避免“紙上談兵”,勝任實際的工作要求。
本書讀者對象
* Linux環境C語言編程的初學者;
* 研究Linux系統函式接口的人員;
* Linux桌面套用開發人員;
* Linux伺服器程式開發人員;
* 嵌入式Linux程式開發人員;
* 在Linux環境下做畢業設計的學生;
* Linux環境C語言編程愛好者;
* 大中專院校和社會培訓班的學生;
* 需要一本案頭必備手冊的程式設計師。
作者簡介
本書由吳岳主筆編寫。其他參與編寫的人員有梁勝斌、林陽、林珍珍、劉愛軍、劉海峰、羅明英、馬奎林、喬建軍、施迎、石小勇、宋曉薇、蘇亞光、譚東平、王守信、王向軍、王曉東、王曉倩、王曉艷、魏來科、吳俊、閆芳、楊丹、楊艷、宜亮、余柏山、張春傑、張春曉、張娜、趙東、鍾曉鳴、朱翠紅、朱萍玉、龔力、黃茂發、邢岩、符滔滔。
希望各位讀者通過閱讀本書,能很好地掌握Linux環境C語言開發技術,成為這個領域中的“王者”,筆者將倍感欣慰!所學授之於人,不亦樂乎?最後祝讀書快樂!
編者
目 錄
第1篇 Linux下C語言基礎
第1章 Linux簡介( 教學視頻:16分鐘)2
1.1 GNU簡介2
1.2 Linux簡介2
1.2.1 Linux 發展史2
1.2.2 Linux發行版4
1.2.3 Linux核心版本5
1.2.4 Linux與UNIX的關係5
1.2.5 Linux在伺服器方面的發展5
1.2.6 Linux在嵌入式系統方面的發展6
1.2.7 Linux在桌面系統方面的發展6
1.3 Linux 環境下的其他程式語言7
1.3.1 C++7
1.3.2 Java9
1.3.3 Perl11
1.3.4 Python12
1.3.5 Ruby13
1.3.6 PHP13
第2章 控制結構( 教學視頻:56分鐘)16
2.1 goto語句16
2.1.1 C語言中的無條件跳轉16
2.1.2 使用goto語句進行出錯處理17
2.1.3 出錯處理的一般模型19
2.2 C語言中的分支結構20
2.2.1 分支結構的翻譯20
2.2.2 使用goto語句實現分支結構22
2.3 短路計算22
2.3.1 短路計算22
2.3.2 &&運算的短路計算23
2.3.3 ||運算的短路計算24
2.4 C語言中的循環結構26
2.4.1 while循環26
2.4.2 do…while循環28
2.4.3 for循環30
2.5 switch語句32
2.5.1 switch語句的套用32
2.5.2 使用goto語句實現switch語句33
2.6 最佳化控制結構34
2.6.1 表達式最佳化——使用替換程式中的乘除法34
2.6.2 表達式最佳化——常量摺疊35
2.6.3 表達式最佳化——使用數學公式36
2.6.4 表達式最佳化——存儲問題37
2.6.5 分支最佳化——改變判斷順序38
2.6.6 分支最佳化——使用switch語句41
2.6.7 循環最佳化——一次性計算42
第3章 C語言中的函式( 教學視頻:56分鐘)46
3.1 函式的本質46
3.2 變數的作用域和生命期47
3.2.1 全局變數47
3.2.2 局部變數48
3.3 變數的初始值50
3.3.1 全局變數的初始值50
3.3.2 局部變數的初始值50
3.4 與函式有關的最佳化51
3.4.1 函式調用與程式最佳化52
3.4.2 變數存儲最佳化54
3.5 編寫多檔案程式——變數的存儲類別56
3.5.1 存儲類別56
3.5.2 static變數的作用——改變變數的生命期56
3.5.3 static變數的作用——實現封裝和模組化設計58
3.6 編寫多檔案的程式——連結的作用61
3.6.1 連結多個檔案61
3.6.2 連結時符號解析規則63
3.6.3 連結規則的套用63
3.7 可變參數66
3.7.1 可變參數的概念66
3.7.2 實現一個簡單的可變參數的函式67
3.7.3 可變參數實例69
3.7.4 關於printf()函式的疑問——缺少整型參數74
3.7.5 關於printf()函式的疑問——缺少字元串地址參數75
第4章 C語言中的指針與字元串( 教學視頻:48分鐘)78
4.1 sizeof運算符78
4.1.1 sizeof運算符的套用——得到內置類型的大小78
4.1.2 sizeof運算符的套用——得到複合類型的大小79
4.2 指針的套用80
4.2.1 指針與別名陷阱80
4.2.2 數組的指針82
4.2.3 指針的指針83
4.2.4 指針與參數傳遞85
4.2.5 指針類型的意義90
4.2.6 void*型指針91
4.3 函式的指針94
4.3.1 C語言中的函式指針94
4.3.2 函式指針的套用——回調函式97
4.3.3 函式指針數組102
4.4 字元串103
4.4.1 字元串與字元數組103
4.4.2 字元串與指針104
4.4.3 限定修飾符const106
4.4.4 const關鍵字修飾指針——在指針定義之前107
4.4.5 const關鍵字修飾指針——在指針定義之中107
4.4.6 const關鍵字修飾指針——在指針定義之前和定義之中107
4.4.7 使用const關鍵字的意義108
第5章 C語言的高級技術( 教學視頻:30分鐘)111
5.1 結構體與共同體111
5.1.1 結構體中成員變數的存儲分布111
5.1.2 記憶體對齊112
5.2 位運算115
5.2.1 掩碼運算115
5.2.2 不安全的位運算117
5.2.3 異或運算的特性119
5.2.4 移位運算的陷阱121
5.2.5 移位運算的實例122
5.3 預處理124
5.3.1 常用的代碼組織形式124
5.3.2 調試開關129
5.4 C99新標準關鍵字詳解130
5.4.1 inline關鍵字的概念131
5.4.2 inline關鍵字實例131
5.4.3 inline關鍵字使用總結132
5.4.4 restrict關鍵字的概念133
5.4.5 restrict關鍵字的套用134
第2篇 C語言開發環境
第6章 vi編輯器( 教學視頻:44分鐘)136
6.1 vi編輯器入門136
6.1.1 vi簡介136
6.1.2 vi的工作模式136
6.2 vi一般操作137
6.2.1 進入vi137
6.2.2 文本插入操作140
6.2.3 文本刪除操作141
6.2.4 文本複製操作143
6.2.5 撤銷命令144
6.2.6 重複命令145
6.2.7 退出vi145
6.3 vi的增強操作147
6.3.1 替換命令147
6.3.2 游標移動148
6.3.3 按行移動游標148
6.3.4 按字移動游標149
6.3.5 按句移動游標150
6.3.6 按段移動游標151
6.3.7 文本行的移動151
6.3.8 文本的異行移動153
6.3.9 螢幕滾動153
6.3.10 查找命令154
6.3.11 替換命令155
6.3.12 視窗的切分157
6.3.13 設定環境157
第7章 gcc編譯器( 教學視頻:27分鐘)159
7.1 初探gcc編譯器159
7.1.1 從經典的hello world開始159
7.1.2 gcc編譯流程160
7.2 gcc常用選項160
7.2.1 gcc常用選項匯總161
7.2.2 -c選項161
7.2.3 -S選項162
7.2.4 -E選項163
7.2.5 -o選項164
7.2.6 -I選項165
7.2.7 -g選項165
7.3 連結原理165
7.3.1 連結器的任務165
7.3.2 目標檔案165
7.3.3 ELF格式的可重定位目標檔案167
7.3.4 目標檔案中的符號表168
7.3.5 重定位的概念172
7.3.6 符號的重定位信息172
7.4 關於庫173
7.4.1 使用庫的優勢173
7.4.2 靜態庫的概念175
7.4.3 創建靜態庫175
7.4.4 使用靜態庫176
7.4.5 動態庫的概念177
7.4.6 創建動態庫178
7.4.7 使用動態庫180
7.5 gcc工具鏈181
第8章 構建makefile檔案( 教學視頻:46分鐘)183
8.1 makefile檔案入門183
8.1.1 makefile檔案的組成內容183
8.1.2 makefile檔案包含183
8.1.3 make工具的退出碼184
8.2 書寫makefile規則185
8.2.1 使用基本規則185
8.2.2 使用隱式規則186
8.2.3 使用偽目標187
8.2.4 使用通配符188
8.2.5 搜尋源檔案189
8.3 使用命令190
8.3.1 顯示命令190
8.3.2 執行命令190
8.3.3 命令出錯192
8.4 使用變數192
8.4.1 使用普通變數192
8.4.2 變數中的變數194
8.4.3 追加變數的值196
8.4.4 自動化變數197
8.5 使用條件判斷197
8.5.1 條件表達式197
8.5.2 表達式實例199
8.6 使用函式200
8.6.1 函式調用的語法200
8.6.2 字元串處理函式201
8.6.3 檔案名稱操作函式206
8.6.4 foreach 函式209
8.6.5 if函式210
8.6.6 call函式210
8.6.7 origin函式211
8.6.8 shell函式211
8.7 makefile實例212
8.7.1 makefile實例——項目中的總makefile212
8.7.2 makefile實例——makefile模板214
第9章 gdb調試器( 教學視頻:27分鐘)216
9.1 列出源程式216
9.1.1 不帶參數的list命令216
9.1.2 帶一個參數的list命令217
9.1.3 帶兩個參數的list命令217
9.2 運行程式的命令218
9.3 操作斷點的命令220
9.3.1 設定斷點220
9.3.2 顯示當前gdb的斷點信息222
9.3.3 刪除指定的斷點223
9.3.4 禁止或啟用斷點223
9.3.5 清除斷點223
9.3.6 觀察點224
9.3.7 設定斷點實例225
9.4 查看運行時數據228
9.4.1 數據觀察命令229
9.4.2 對程式中函式的調用230
9.4.3 查看錶達式的值231
9.4.4 查看數組的值231
9.4.5 變數的輸出格式232
9.4.6 查看記憶體233
9.4.7 自動顯示變數233
9.4.8 設定顯示選項237
9.4.9 顯示變數的歷史記錄239
9.4.10 查看暫存器239
9.4.11 查看使用gdb環境變數240
9.4.12 查看數據實例241
9.5 改變程式的執行245
9.5.1 修改變數的值246
9.5.2 跳轉執行246
9.5.3 信號的產生及處理248
9.5.4 強制調用函式248
9.5.5 強制函式返回249
9.6 gdb高級套用249
9.6.1 產生core檔案250
9.6.2 跟蹤棧上數據250
9.6.3 綁定運行進程252
9.6.4 源檔案搜尋254
9.6.5 機器語言工具254
9.6.6 其他有用的調試命令255
第3篇 Linux進程操作
第10章 進程環境( 教學視頻:44分鐘)258
10.1 程式的啟動和退出258
10.1.1 在shell中啟動一個程式258
10.1.2 載入一個程式259
10.1.3 載入地址260
10.1.4 退出程式261
10.1.5 進程終止處理函式262
10.2 Linux進程記憶體管理263
10.2.1 數據的內部存儲263
10.2.2 C程式的存儲布局——代碼段265
10.2.3 C程式的存儲布局——數據段和緩衝段267
10.2.4 C程式的存儲布局——棧268
10.2.5 C程式的存儲布局——堆269
10.2.6 常量的存儲270
10.2.7 動態記憶體管理271
10.2.8 動態記憶體分配的深入研究273
10.3 shell環境276
10.3.1 命令行參數277
10.3.2 得到程式檔案名稱278
10.3.3 環境變數278
10.3.4 得到指定的環境變數280
10.3.5 設定一個環境變數280
10.3.6 得到進程結束狀態285
10.3.7 使用errno調試程式286
10.3.8 輸出錯誤原因288
10.4 全局跳轉289
10.4.1 局部跳轉的局限性289
10.4.2 使用全局跳轉291
10.4.3 使用全局跳轉代替局部跳轉292
第11章 進程控制( 教學視頻:45分鐘)295
11.1 進程標識符295
11.1.1 進程ID295
11.1.2 進程中重要的ID值296
11.2 進程操作297
11.2.1 創建一個進程298
11.2.2 父子進程的共享資源299
11.2.3 fork()函式的出錯情況302
11.2.4 創建一個共享空間的子進程303
11.2.5 在函式內部調用vfork()函式304
11.2.6 退出進程305
11.2.7 使用exit()函式檢查進程出錯信息306
11.2.8 exit()函式與核心函式的關係307
11.2.9 設定進程所有者307
11.2.10 調試多進程——設定跟蹤流309
11.2.11 調試多進程——使用gdb的attach命令309
11.3 執行程式310
11.3.1 執行一個新程式310
11.3.2 執行解釋器檔案313
11.3.3 在程式中執行shell命令315
11.3.4 實現system()函式317
11.4 關係操作318
11.4.1 等待進程退出318
11.4.2 等待指定的進程321
11.4.3 殭屍進程的概念323
11.4.4 產生一個殭屍進程324
11.4.5 避免殭屍進程的產生325
11.4.6 輸出進程統計信息327
第12章 時間和日曆歷程( 教學視頻:7分鐘)330
12.1 系統時間330
12.2 日曆時間332
第13章 信號及信號處理( 教學視頻:48分鐘)335
13.1 信號的基礎335
13.1.1 信號的基本概念335
13.1.2 產生信號336
13.1.3 處理信號336
13.1.4 常用信號的使用方法337
13.2 信號的影響338
13.2.1 重入339
13.2.2 原子操作341
13.2.3 中斷系統調用343
13.3 信號處理函式343
13.3.1 設定信號處理函式343
13.3.2 傳送信號347
13.3.3 向進程本身傳送信號348
13.3.4 設定Linux定時器349
13.3.5 定時等待I/O350
13.3.6 掛起進程352
13.3.7 進程休眠353
13.4 信號集與禁止信號356
13.4.1 信號集和信號集處理函式356
13.4.2 禁止信號358
13.4.3 處理未決信號360
13.4.4 高級信號註冊函式362
13.4.5 信號選項實例——SA_NOCLDWAIT選項363
13.4.6 信號選項實例——SA_NODEFER選項364
13.4.7 信號選項實例——SA_RESETHAND選項366
第14章 進程間通信( 教學視頻:52分鐘)368
14.1 進程間通信概述368
14.1.1 進程間通信簡介368
14.1.2 進程間通信的難點369
14.1.3 IPC的多種方式369
14.2 管道370
14.2.1 管道的概念370
14.2.2 匿名半雙工管道370
14.2.3 匿名半雙工管道的讀寫操作371
14.2.4 創建管道的標準庫函式375
14.3 FIFO管道377
14.3.1 FIFO的概念377
14.3.2 創建FIFO378
14.3.3 FIFO的讀寫操作379
14.3.4 FIFO的缺點382
14.4 System V IPC/POSIX IPC383
14.4.1 IPC對象的概念383
14.4.2 IPC對象的問題385
14.4.3 IPC對象系統命令385
14.5 共享記憶體386
14.5.1 共享記憶體的概念386
14.5.2 共享記憶體的創建387
14.5.3 共享記憶體的操作388
14.5.4 共享記憶體使用注意事項390
14.6 信號量391
14.6.1 信號量的概念391
14.6.2 信號量的創建392
14.6.3 信號量集的操作394
14.7 訊息佇列396
14.7.1 訊息佇列的概念396
14.7.2 創建訊息佇列397
14.7.3 讀寫訊息佇列399
第15章 執行緒( 教學視頻:34分鐘)403
15.1 執行緒與進程403
15.1.1 執行緒的概念403
15.1.2 執行緒的優勢404
15.2 執行緒標識符405
15.3 執行緒基本操作405
15.3.1 創建執行緒405
15.3.2 向執行緒體函式傳遞參數407
15.3.3 執行緒訪問資源的限制409
15.3.4 終止執行緒412
15.3.5 正確得到執行緒退出信息的方法415
15.3.6 取消一個執行緒的運行417
15.3.7 執行緒退出函式420
第16章 執行緒高級操作( 教學視頻:28分鐘)423
16.1 執行緒同步——使用互斥量423
16.1.1 初始化與銷毀互斥量423
16.1.2 得到與釋放互斥量424
16.1.3 使用互斥量的實例425
16.2 執行緒同步——使用讀寫鎖430
16.2.1 初始化與銷毀讀寫鎖430
16.2.2 得到與釋放互斥鎖431
16.2.3 使用互斥量與讀寫鎖的比較432
16.3 執行緒屬性438
16.3.1 創建和銷毀屬性結構438
16.3.2 執行緒的分離狀態439
16.3.3 分離一個已經創建的執行緒440
16.3.4 執行緒棧的屬性442
第4篇 Linux檔案操作
第17章 檔案I/O( 教學視頻:71分鐘)446
17.1 檔案描述符的概念446
17.2 檔案I/O操作446
17.2.1 打開一個檔案446
17.2.2 打開檔案的出錯情況450
17.2.3 關閉一個檔案450
17.2.4 創建一個新檔案451
17.2.5 檔案定位453
17.2.6 檔案截短455
17.2.7 清空一個檔案458
17.2.8 檔案的讀寫操作460
17.2.9 檔案同步463
17.3 檔案描述符操作465
17.3.1 複製檔案描述符465
17.3.2 I/O重定向概念及其套用466
17.3.3 控制檔案469
17.3.4 修改打開檔案的檔案狀態470
17.4 非阻塞檔案I/O473
17.4.1 非阻塞I/O的概念473
17.4.2 以非阻塞方式打開檔案474
17.4.3 將一個打開檔案設定為非阻塞方式475
17.5 記憶體映射I/O477
17.5.1 記憶體映射I/O的概念477
17.5.2 創建一個記憶體映射478
17.5.3 撤銷一個記憶體映射480
17.5.4 記憶體映射同步482
17.5.5 更改記憶體映射的許可權485
第18章 檔案管理( 教學視頻:42分鐘)487
18.1 檔案狀態487
18.2 檔案類型488
18.3 檔案許可權490
18.3.1 訪問許可權491
18.3.2 設定用戶ID位和設定組ID位492
18.3.3 設定用戶ID位的作用493
18.3.4 使用設定用戶ID位的實例494
18.4 檔案許可權操作496
18.4.1 測試檔案訪問許可權497
18.4.2 設定用戶ID位與檔案許可權測試499
18.4.3 使用檔案許可權禁止字499
18.4.4 在shell中使用檔案許可權禁止字500
18.4.5 在程式中使用檔案許可權禁止字501
18.4.6 改變檔案訪問許可權502
18.4.7 在shell中改變檔案許可權503
18.4.8 在程式中改變檔案許可權504
18.4.9 改變一個打開的檔案許可權505
18.5 檔案系統結構509
18.6 檔案的硬連結513
18.6.1 創建一個硬連結513
18.6.2 刪除一個硬連結515
18.7 改變檔案所有者519
18.8 操作檔案的時間522
第19章 目錄操作( 教學視頻:30分鐘)526
19.1 目錄的許可權526
19.1.1 目錄的訪問許可權526
19.1.2 測試目錄的訪問許可權527
19.2 目錄操作528
19.2.1 創建一個目錄528
19.2.2 刪除一個目錄529
19.2.3 目錄項結構530
19.2.4 打開與關閉目錄531
19.2.5 讀目錄531
19.2.6 讀目錄操作的實例——實現自己的ls命令534
19.2.7 得到目錄檔案的讀寫位置536
19.2.8 定位目錄537
19.2.9 回卷目錄檔案539
19.3 進程的工作目錄540
19.3.1 工作目錄的概念540
19.3.2 改變進程的工作目錄541
19.3.3 得到進程的當前工作目錄542
19.3.4 子進程工作目錄對父進程的影響545
第20章 特殊檔案( 教學視頻:32分鐘)548
20.1 符號連結操作548
20.1.1 符號連結548
20.1.2 符號連結的功能549
20.1.3 創建符號連結549
20.1.4 創建指向不存在檔案的符號連結550
20.1.5 讀寫符號連結的目的檔案551
20.1.6 讀寫多重符號連結的目的檔案553
20.1.7 讀寫符號連結555
20.1.8 取得符號連結的狀態558
20.1.9 更改符號連結的所有者562
20.2 proc檔案系統566
20.2.1 proc檔案系統566
20.2.2 常用的核心信息567
20.2.3 讀取核心信息568
20.2.4 進程狀態信息575
20.2.5 讀取進程狀態576
20.2.6 proc檔案系統編程實例——實現自己的ps命令578
第21章 基於流的I/O( 教學視頻:30分鐘)581
21.1 流與緩衝581
21.2 基於流的檔案操作583
21.2.1 打開和關閉流583
21.2.2 檔案內容的沖洗585
21.2.3 以字元為單位讀寫數據587
21.2.4 以行為單位讀寫數據588
21.2.5 gets()函式的漏洞589
21.2.6 逐行讀取檔案內容590
21.2.7 輸出XML形式的配置檔案591
21.2.8 讀寫數據塊593
21.2.9 檔案讀寫實例——實現cp命令594
21.2.10 檔案讀寫實例——字元統計596
21.2.11 檔案讀寫實例——目錄下所有檔案的字元統計597
第5篇 Linux網路編程
第22章 TCP和UDP協定( 教學視頻:22分鐘)602
22.1 計算機網路的體系結構簡介602
22.1.1 計算機網路體系結構簡介602
22.1.2 OSI 參考模型中各層功能描述603
22.1.3 TCP/IP參考模型的各層功能描述603
22.1.4 面向連線服務和無連線服務604
22.2 客戶/伺服器方式簡介604
22.3 用戶數據報協定UDP605
22.3.1 用戶數據報的格式605
22.3.2 用戶數據報檢驗和的計算606
22.3.3 UDP用戶數據報的特性及用途607
22.4 傳輸控制協定 TCP608
22.4.1 TCP簡介608
22.4.2 TCP報文段的首部608
22.4.3 TCP數據編號與確認609
22.4.4 TCP的流量控制與擁塞控制610
22.4.5 TCP的運輸連線管理612
第23章 網路編程基礎( 教學視頻:50分鐘)614
23.1 套接字概念614
23.2 準備工作615
23.2.1 位元組序615
23.2.2 地址格式616
23.2.3 地址形式轉換617
23.2.4 獲得主機信息619
23.2.5 地址映射620
23.3 套接字基礎編程621
23.3.1 建立和銷毀套接字描述符621
23.3.2 地址綁定623
23.3.3 建立一個連線624
23.3.4 最簡單的網路應用程式——伺服器端626
23.3.5 最簡單的網路應用程式——客戶端629
23.3.6 使用檔案讀寫函式讀寫套接字631
23.3.7 使用完整讀寫函式的網路應用程式634
23.3.8 面向連線的數據傳輸637
23.3.9 面向連線的網路應用程式——伺服器端638
23.3.10 面向連線的網路應用程式——客戶端641
23.3.11 無連線的數據傳輸643
23.3.12 無連線的網路應用程式——伺服器端644
23.3.13 無連線的網路應用程式——客戶端646
23.4 非阻塞套接字649
23.4.1 非阻塞網路應用程式——伺服器端649
23.4.2 非阻塞網路應用程式——客戶端651
第24章 網路編程進階( 教學視頻:32分鐘)654
24.1 套接字編程深入654
24.1.1 bind函式的作用654
24.1.2 並發伺服器655
24.1.3 UDP協定的connect()函式套用657
24.2 多路選擇I/O660
24.2.1 多路選擇I/O的概念660
24.2.2 實現多路選擇I/O661
24.2.3 使用多路選擇I/O處理多個連線663
24.2.4 禁止信號的多路選擇I/O666
24.2.5 對比select()函式和pselect()函式667
24.2.6 輪詢I/O669
24.3 非網路通信套接字670
24.3.1 非命名UNIX域套接字671
24.3.2 命名UNIX域套接字672
24.3.3 UNIX域套接字實例——伺服器端673
24.3.4 UNIX域套接字實例——客戶端677
第25章 網路編程實例——實現檔案傳輸程式( 教學視頻:18分鐘)679
25.1 程式設計679
25.1.1 整體程式設計679
25.1.2 客戶端程式設計679
25.1.3 伺服器端程式設計680
25.2 檔案傳輸程式的實現683
25.2.1 客戶端程式的實現——頭檔案683
25.2.2 客戶端程式的實現——程式主函式684
25.2.3 客戶端程式的實現——命令拆分函式686
25.2.4 客戶端程式的實現——命令處理模組687
25.2.5 伺服器端程式的實現——頭檔案697
25.2.6 伺服器端程式的實現——程式主函式698
25.2.7 伺服器端程式的實現——客戶端命令處理模組699
25.3 測試和驗證706
第26章 網路編程實例——簡單的Web伺服器( 教學視頻:10分鐘)707
26.1 程式設計707
26.1.1 整體程式設計707
26.1.2 步驟1——解析客戶端傳送的內容708
26.1.3 步驟2——尋找客戶端需要的檔案709
26.1.4 步驟3——將客戶端信息返回709
26.2 Web伺服器的實現710
26.2.1 Web伺服器程式的實現——頭檔案710
26.2.2 Web伺服器程式的實現——程式主函式711
26.2.3 Web伺服器程式的實現——請求處理模組715
26.3 測試和驗證719
第6篇 shell腳本知識
第27章 shell腳本基礎( 教學視頻:32分鐘)722
27.1 編寫最簡單的shell腳本722
27.1.1 使用shell腳本的原因722
27.1.2 腳本內容723
27.1.3 運行一段腳本724
27.2 shell中的變數724
27.2.1 用戶自定義變數725
27.2.2 引用變數726
27.2.3 為表達式求值727
27.2.4 變數的類型729
27.2.5 操作自定義變數730
27.2.6 位置變數731
27.2.7 重新分配位置變數732
27.3 退出狀態734
27.4 條件測試736
27.4.1 測試檔案狀態736
27.4.2 測試時使用邏輯操作符738
27.4.3 字元串測試739
27.4.4 測試數值741
第28章 shell腳本中的控制結構( 教學視頻:29分鐘)743
28.1 shell腳本中的命令替換743
28.2 分支結構744
28.2.1 if/else分支結構744
28.2.2 多重分支結構745
28.2.3 使用case結構的分支語句747
28.2.4 在case語句中使用邏輯表達式749
28.3 條件測試命令的值750
28.3.1 測試整數與字元串751
28.3.2 測試字元串和空值752
28.3.3 測試未初始化的變數752
28.3.4 測試“false”的值753
28.4 循環結構754
28.4.1 while循環結構754
28.4.2 until循環結構757
28.4.3 for循環結構759
28.4.4 break和continue命令762
28.5 定義函式和使用函式764