高質量嵌入式LinuxC編程

高質量嵌入式LinuxC編程

《高質量嵌入式LinuxC編程》是2015年1月電子工業出版社出版的圖書,作者是梁庚、陳明、馬小陸。

基本介紹

  • 書名:高質量嵌入式LinuxC編程
  • 作者:梁庚,陳明,馬小陸
  • 出版社:電子工業出版社
  • 出版時間:2015年1月
  • 頁數:376 頁
  • 定價:68 元 
  • 開本:16 開
  • ISBN:9787121253836
  • 字數:600千字
  • 版次:01-01
內容簡介,圖書目錄,

內容簡介

本書從嵌入式開發角度出發,以Linux作業系統為開發平台,將隱藏在系統開發背後的關於C語言、計算機組成原理、計算機作業系統等方面的機制和知識娓娓道來,不僅能讓讀者知其然,更要讓讀者知其所以然,揭開嵌入式Linux C系統開發背後鮮為人知的秘密,並讓這些知識再反作用於編程實踐,從而幫助讀者寫出高質量的嵌入式Linux C代碼。具體說來,本書主要討論了包括嵌入式C語言高級編程、嵌入式Linux系統編程、多任務解決機制、網路編程等多個方面的話內容。

圖書目錄

目 錄
第1章 嵌入式Linux C語言開發工具1
1.1 嵌入式Linux C語言開發概述1
1.2 嵌入式Linux C開發環境1
1.3 嵌入式文本編輯器2
1.3.1 基本模式2
1.3.2 基本操作3
1.3.3 實訓操作5
1.4 嵌入式編譯器6
1.4.1 初識GCC編譯器6
1.4.2 gcc命令常用選項及工作流程6
1.4.3 庫的使用10
1.5 嵌入式調試器12
1.6 工程管理器15
1.6.1 Makefile16
1.6.2 Makefile特性介紹18
1.7 Eclipse程式開發26
1.7.1 Eclipse環境安裝26
1.7.2 Eclipse C程式開發28
第2章 數據類型35
2.1 變數與常量35
2.2 變數35
2.2.1 什麼是變數35
2.2.2 變數名和變數值36
2.2.3 局部變數和全局變數38
2.3 常量40
2.4 基本內置類型41
2.4.1 數據類型大小42
2.4.2 陷阱之有符號與無符號42
2.5 聲明與定義43
2.5.1 定義43
2.5.2 聲明43
2.6 亂世梟雄:static與extern44
2.6.1 政權旗幟static44
2.6.2 外來的和尚會念經extern45
2.7 鐵布衫:const47
2.8 隱形刺客:auto48
2.9 閃電飛刀:register49
2.10 專一王子:volatile50
2.11 typedef詳解51
2.11.1 typedef與結構的問題51
2.11.2 typedef與#define的問題53
2.11.3 typedef與#define的另一例53
2.11.4 typedef與複雜的變數聲明54
2.12 枚舉55
2.12.1 枚舉類型的使用方法55
2.12.2 枚舉與#define 宏的區別56
2.13 聯合體56
2.13.1 聯合體的定義56
2.13.2 從兩道經典試題談聯合體(union)的使用57
第3章 運算符、表達式59
3.1 運算符簡介59
3.1.1 運算符優先權59
3.1.2 一些容易出錯的優先權問題61
3.1.3 邏輯運算符61
3.2 條件運算符和條件表達式62
3.3 ++、操作符63
3.4 位運算64
3.4.1 按位與運算及套用64
3.4.2 按位或運算及套用64
3.4.3 按位異或運算及套用65
3.4.4 左移和右移65
3.5 C語言性能最佳化:使用位操作65
第4章 語句67
4.1 空語句67
4.2 基礎語句68
4.2.1 表達式語句68
4.2.2 函式調用語句68
4.3 語句if68
4.3.1 布爾變數與零值比較69
4.3.2 整型變數與零值比較69
4.3.3 浮點變數與零值比較69
4.3.4 指針變數與零值比較70
4.3.5 對if語句的補充說明70
4.4 跳轉語句:goto70
4.5 循環語句71
4.5.1 do-while語句72
4.5.2 for語句72
4.5.3 循環語句的效率74
4.6 break和continue75
4.6.1 break語句75
4.6.2 continue語句75
4.7 switch語句77
第5章 數組與指針79
5.1 數組認知79
5.2 使用數組之常見問題80
5.2.1 數組的下標總是從0開始嗎80
5.2.2 可以使用數組後面第一個元素的地址嗎81
5.2.3 為什麼要小心對待位於數組後面的那些元素的地址呢82
5.2.4 數組作為參數傳遞給函式時,可以通過sizeof得到數組的大小嗎82
5.2.5 指針或帶下標的數組名都可以訪問元素,哪一種更好呢83
5.2.6 可以把另外一個地址賦給一個數組名嗎85
5.2.7 array_name和&array_name有什麼不同86
5.2.8 為什麼用const說明的常量不能用來定義一個數組的初始大小87
5.2.9 字元串和數組有什麼不同87
5.3 指針89
5.3.1 指針是變數90
5.3.2 指針的類型和指針所指向的類型90
5.3.3 指針的值91
5.3.4 指針本身所占據的記憶體區91
5.4 指針的運算92
5.4.1 指針的算術運算92
5.4.2 指針的關係運算92
5.4.3 間接引用93
5.4.4 最多可以使用幾層指針93
5.5 常量指針和指針常量95
5.5.1 常量指針與指針常量的實例95
5.5.2 常量指針的套用96
5.6 空指針及其使用97
5.6.1 NULL總是被定義為0嗎97
5.6.2 NULL總是等於0嗎97
5.6.3 空指針的使用98
5.7 指針void:萬能指針99
5.8 指針數組與數組指針100
5.9 字元串函式詳解101
5.10 函式指針與指針函式105
5.11 複雜指針聲明:“int * (* (*fp1) (int) ) [10];”106
5.11.1 基礎106
5.11.2 const修飾符107
5.11.3 typedef的妙用108
5.11.4 函式指針109
5.11.5 右左法則109
第6章 記憶體管理111
6.1 你的數據放在哪裡111
6.1.1 未初始化的全局變數(.bss段)111
6.1.2 初始化過的全局變數(.data段)112
6.1.3 常量數據(.rodata段)112
6.1.4 代碼(.text段)113
6.1.5 棧(stack)113
6.1.6 堆(heap)113
6.2 記憶體分配方式114
6.3 野指針115
6.4 常見的記憶體錯誤及對策115
6.5 段錯誤以及調試方法116
6.5.1 方法一:利用gdb逐步查找段錯誤117
6.5.2 方法二:分析core檔案118
6.5.3 方法三:段錯誤時啟動調試119
6.5.4 方法四:利用backtrace和objdump進行分析120
6.6 指針與數組的對比121
第7章 預處理、結構體125
7.1 宏定義:#define125
7.1.1 無參宏定義125
7.1.2 帶參宏定義127
7.2 檔案包含128
7.3 條件編譯129
7.4 宏定義使用技巧131
7.5 關於#和##132
7.6 結構體133
7.6.1 記憶體位元組對齊135
7.6.2 記憶體對齊正式原則138
7.7 #define和typedef的區別139
7.8 結構體和聯合體的區別139
7.9 淺談C語言中的位段139
7.9.1 位段的使用140
7.9.2 位段結構在記憶體中的存儲方式140
第8章 函式141
8.1 函式聲明與定義141
8.1.1 定義141
8.1.2 聲明與定義不同142
8.2 形式參數和實際參數143
8.3 參數傳遞143
8.3.1 簡單變數或數組元素作為函式參數143
8.3.2 指針變數或數組名作為函式參數144
8.3.3 數組名作函式參數145
8.3.4 結構體數組作函式參數146
8.4 如何編寫有多個返回值的C語言函式146
8.4.1 利用全局變數146
8.4.2 傳遞數組指針148
8.4.3 傳遞結構體指針148
8.5 回調函式149
8.6 變參函式詳解:printf的實現151
8.7 可變參數問題152
第9章 編碼規範155
9.1 排版155
9.2 注釋158
9.3 標示符名稱163
第10章 shell編程165
10.1 什麼是shell165
10.2 幾種流行的shell165
10.3 shell程式設計(基礎部分)166
10.3.1 shell基本語法166
10.3.2 shell程式的變數和參數167
10.4 shell程式設計的流程控制169
10.4.1 test測試命令169
10.4.2 if條件語句170
10.4.3 for循環171
10.4.4 while和until循環171
10.4.5 case條件選擇172
10.4.6 無條件控制語句break和continue173
10.4.7 函式定義173
10.5 命令分組174
10.6 信號174
10.7 運行shell程式的方法175
10.8 bash程式的調試175
10.9 bash的內部命令176
第11章 檔案操作179
11.1 Linux檔案結構179
11.1.1 Linux檔案系統179
11.1.2 Linux目錄結構180
11.1.3 Linux檔案分類182
11.1.4 常見檔案類型183
11.1.5 Linux檔案屬性183
11.2 系統調用184
11.3 Linux檔案描述符184
11.4 不帶快取的I/O操作185
11.4.1 creat函式185
11.4.2 open函式186
11.4.3 read函式188
11.4.4 write函式189
11.4.5 lseek函式189
11.4.6 close函式189
11.4.7 經典範例:檔案複製190
11.5 帶快取的I/O操作191
11.5.1 三種類型的緩衝191
11.5.2 fopen函式193
11.5.3 fclose函式194
11.5.4 fdopen函式194
11.5.5 fread函式195
11.5.6 fwrite函式195
11.5.7 fseek函式196
11.5.8 fgetc函式、getc函式和getchar函式197
11.5.9 fputc函式、putc函式和putchar函式198
11.6 fgets函式與gets函式比較分析199
11.7 輸出與輸入201
11.7.1 printf函式、fprintf函式和sprintf函式201
11.7.2 scanf函式、fcanf函式和sscanf函式203
第12章 進程控制編程207
12.1 為何需要多進程(或者多執行緒),為何需要並發207
12.1.1 進程207
12.1.2 進程分類208
12.1.3 進程的屬性208
12.1.4 父進程和子進程208
12.2 Linux進程管理209
12.2.1 ps監視進程工具209
12.2.2 pgrep查詢進程工具211
12.2.3 終止進程的工具kill、killall、pkill、xkill211
12.2.4 top監視系統任務的工具213
12.2.5 進程的優先權:nice和renice214
12.3 Linux進程的三態215
12.3.1 三種基本狀態215
12.3.2 三種狀態間的轉換215
12.4 Linux進程結構216
12.5 Linux進程控制塊PCB216
12.6 Linux進程調度218
12.6.1 調度的目標218
12.6.2 調度算法218
12.6.3 優先權反轉220
12.7 進程創建221
12.7.1 獲取進程221
12.7.2 啟動進程:fork( )222
12.7.3 啟動進程:vfork( )224
12.7.4 啟動進程:exec族225
12.7.5 啟動進程:system228
12.8 進程等待229
12.8.1 殭屍進程的產生229
12.8.2 如何避免殭屍進程231
12.8.3 wait函式和waitpid函式231
12.9 進程退出235
12.9.1 退出方式的不同點236
12.9.2 exit( )和_exit( )函式236
12.9.3 exit( )和_exit( )的區別237
第13章 進程間通信方式239
13.1 進程間通信方式概述239
13.1.1 進程間通信的目的239
13.1.2 Linux進程間通信方式簡介240
13.2 管道通信241
13.2.1 建立無名管道241
13.2.2 讀寫無名管道242
13.2.3 無名管道套用實例246
13.2.4 創建有名管道248
13.2.5 讀寫有名管道250
13.3 管道通信方式的套用場景253
13.4 信號254
13.4.1 信號及信號來源254
13.4.2 信號種類254
13.4.3 信號處理方式256
13.4.4 信號傳送256
13.4.5 自定義處理信號方式258
13.4.6 信號集操作262
13.4.7 使用信號注意事項264
13.5 訊息佇列265
13.5.1 訊息佇列基礎理論266
13.5.2 使用訊息佇列266
13.5.3 訊息佇列API267
13.5.4 訊息佇列的限制269
13.5.5 訊息佇列的套用實例270
13.6 信號燈273
13.6.1 信號燈概述273
13.6.2 核心實現原理274
13.6.3 使用信號燈274
13.6.4 信號燈API275
13.6.5 信號燈的限制277
13.6.6 競爭問題277
13.6.7 信號燈套用實例277
13.7 共享記憶體方式一281
13.7.1 核心實現原理281
13.7.2 mmap( )及其相關係統調用282
13.7.3 mmap( )範例283
13.7.4 對mmap( )返回地址的訪問287
13.8 共享記憶體方式二289
13.8.1 系統V共享記憶體原理289
13.8.2 系統V共享記憶體API290
13.8.3 系統V共享記憶體範例291
第14章 多執行緒編程295
14.1 執行緒概述295
14.1.1 為什麼有了進程的概念後,還要再引入執行緒呢295
14.1.2 多執行緒的優點296
14.1.3 多執行緒的缺點296
14.2 多執行緒的實現297
14.2.1 執行緒的創建297
14.2.2 終止執行緒299
14.2.3 等待執行緒終止300
14.3 執行緒屬性300
14.3.1 執行緒屬性初始化301
14.3.2 執行緒分離301
14.3.3 執行緒的繼承性302
14.3.4 執行緒的調度策略303
14.3.5 執行緒的調度參數304
14.3.6 實例分析305
14.4 執行緒同步機制306
14.4.1 互斥鎖Mutex306
14.4.2 互斥鎖使用實例308
14.4.3 條件變數Conditions310
14.4.4 條件變數使用實例311
第15章 網路編程313
15.1 TCP/IP協定概述313
15.1.1 TCP/IP 起源313
15.1.2 TCP/IP的特性與套用315
15.1.3 網際網路地址315
15.1.4 域名系統316
15.1.5 封裝317
15.1.6 TCP/IP工作模型318
15.1.7 TCP/IP 協定層318
15.1.8 TCP/IP套用320
15.1.9 網橋、路由器和網關321
15.2 TCP和UDP322
15.2.1 TCP協定322
15.2.2 三次握手協定322
15.2.3 TCP數據報頭323
15.2.4 UDP協定324
15.2.5 協定的選擇324
15.2.6 IP和連線埠號324
15.3 套接字325
15.3.1 Socket概念325
15.3.2 Socket類型325
15.3.3 Socket信息數據結構325
15.3.4 數據存儲優先順序的轉換326
15.3.5 地址格式轉化327
15.3.6 名字地址轉化328
15.4 網路編程330
15.4.1 建立Socket331
15.4.2 綁定地址332
15.4.3 監聽333
15.4.4 接受請求334
15.4.5 連線伺服器335
15.4.6 傳送數據335
15.4.7 接收數據336
15.5 採用TCP協定的C/S架構實現338
15.5.1 模組封裝338
15.5.2 伺服器的實現340
15.5.3 客戶端的實現341
15.6 並發伺服器模型342
15.6.1 多進程解決方案342
15.6.2 多執行緒解決方案342
15.6.3 調用fcntl將sockfd設定為非阻塞模式348
15.7 多路轉接模型348
15.7.1 伺服器的實現349
15.7.2 客戶端的實現354
15.8 採用UDP協定C/S架構的實現355
15.8.1 伺服器的實現355
15.8.2 客戶端的實現356
15.8.3 UDP協定傳輸檔案的實現357
參考文獻360

相關詞條

熱門詞條

聯絡我們