目 錄第1章 嵌入式Linux C語言開發(fā)工具11.1 嵌入式Linux C語言開發(fā)概述11.2 嵌入式Linux C開發(fā)環(huán)境11.3 嵌入式文本編輯器21.3.1 基本模式21.3.2 基本操作31.3.3 實訓操作51.4 嵌入式編譯器61.4.1 初識GCC編譯器61.4.2 gcc命令常用選項及工作流程61.4.3 庫的使用101.5 嵌入式調試器121.6 工程管理器151.6.1 Makefile161.6.2 Makefile特性介紹181.7 Eclipse程序開發(fā)261.7.1 Eclipse環(huán)境安裝261.7.2 Eclipse C程序開發(fā)28第2章 數據類型352.1 變量與常量352.2 變量352.2.1 什么是變量352.2.2 變量名和變量值362.2.3 局部變量和全局變量382.3 常量402.4 基本內置類型412.4.1 數據類型大小422.4.2 陷阱之有符號與符號422.5 聲明與定義432.5.1 定義432.5.2 聲明432.6 亂世梟雄:static與extern442.6.1 政權旗幟static442.6.2 外來的和尚會念經extern452.7 鐵布衫:const472.8 隱形刺客:auto482.9 閃電飛刀:register492.10 專一王子:volatile502.11 typedef詳解512.11.1 typedef與結構的問題512.11.2 typedef與#define的問題532.11.3 typedef與#define的另一例532.11.4 typedef與復雜的變量聲明542.12 枚舉552.12.1 枚舉類型的使用方法552.12.2 枚舉與#define 宏的區(qū)別562.13 聯合體562.13.1 聯合體的定義562.13.2 從兩道經典試題談聯合體(union)的使用57第3章 運算符、表達式593.1 運算符簡介593.1.1 運算符優(yōu)先級593.1.2 一些容易出錯的優(yōu)先級問題613.1.3 邏輯運算符613.2 條件運算符和條件表達式623.3 ++、操作符633.4 位運算643.4.1 按位與運算及應用643.4.2 按位或運算及應用643.4.3 按位異或運算及應用653.4.4 左移和右移653.5 C語言性能優(yōu)化:使用位操作65第4章 語句674.1 空語句674.2 基礎語句684.2.1 表達式語句684.2.2 函數調用語句684.3 語句if684.3.1 布爾變量與零值比較694.3.2 整型變量與零值比較694.3.3 浮點變量與零值比較694.3.4 指針變量與零值比較704.3.5 對if語句的補充說明704.4 跳轉語句:goto704.5 循環(huán)語句714.5.1 do-while語句724.5.2 for語句724.5.3 循環(huán)語句的效率744.6 break和continue754.6.1 break語句754.6.2 continue語句754.7 switch語句77第5章 數組與指針795.1 數組認知795.2 使用數組之常見問題805.2.1 數組的下標總是從0開始嗎805.2.2 可以使用數組后面第一個元素的地址嗎815.2.3 為什么要小心對待位于數組后面的那些元素的地址呢825.2.4 數組作為參數傳遞給函數時,可以通過sizeof得到數組的大小嗎825.2.5 指針或帶下標的數組名都可以訪問元素,哪一種更好呢835.2.6 可以把另外一個地址賦給一個數組名嗎855.2.7 array_name和&array_name有什么不同865.2.8 為什么用const說明的常量不能用來定義一個數組的初始大小875.2.9 字符串和數組有什么不同875.3 指針895.3.1 指針是變量905.3.2 指針的類型和指針所指向的類型905.3.3 指針的值915.3.4 指針本身所占據的內存區(qū)915.4 指針的運算925.4.1 指針的算術運算925.4.2 指針的關系運算925.4.3 間接引用935.4.4 最多可以使用幾層指針935.5 常量指針和指針常量955.5.1 常量指針與指針常量的實例955.5.2 常量指針的應用965.6 空指針及其使用975.6.1 NULL總是被定義為0嗎975.6.2 NULL總是等于0嗎975.6.3 空指針的使用985.7 指針void:萬能指針995.8 指針數組與數組指針1005.9 字符串函數詳解1015.10 函數指針與指針函數1055.11 復雜指針聲明:“int * (* (*fp1) (int) ) ;”1065.11.1 基礎1065.11.2 const修飾符1075.11.3 typedef的妙用1085.11.4 函數指針1095.11.5 右左法則109第6章 內存管理1116.1 你的數據放在哪里1116.1.1 未初始化的全局變量(.bss段)1116.1.2 初始化過的全局變量(.data段)1126.1.3 常量數據(.rodata段)1126.1.4 代碼(.text段)1136.1.5 棧(stack)1136.1.6 堆(heap)1136.2 內存分配方式1146.3 野指針1156.4 常見的內存錯誤及對策1156.5 段錯誤以及調試方法1166.5.1 方法一:利用gdb逐步查找段錯誤1176.5.2 方法二:分析core文件1186.5.3 方法三:段錯誤時啟動調試1196.5.4 方法四:利用backtrace和objdump進行分析1206.6 指針與數組的對比121第7章 預處理、結構體1257.1 宏定義:#define1257.1.1 參宏定義1257.1.2 帶參宏定義1277.2 文件包含1287.3 條件編譯1297.4 宏定義使用技巧1317.5 關于#和##1327.6 結構體1337.6.1 內存字節(jié)對齊1357.6.2 內存對齊正式原則1387.7 #define和typedef的區(qū)別1397.8 結構體和聯合體的區(qū)別1397.9 淺談C語言中的位段1397.9.1 位段的使用1407.9.2 位段結構在內存中的存儲方式140第8章 函數1418.1 函數聲明與定義1418.1.1 定義1418.1.2 聲明與定義不同1428.2 形式參數和實際參數1438.3 參數傳遞1438.3.1 簡單變量或數組元素作為函數參數1438.3.2 指針變量或數組名作為函數參數1448.3.3 數組名作函數參數1458.3.4 結構體數組作函數參數1468.4 如何編寫有多個返回值的C語言函數1468.4.1 利用全局變量1468.4.2 傳遞數組指針1488.4.3 傳遞結構體指針1488.5 回調函數1498.6 變參函數詳解:printf的實現1518.7 可變參數問題152第9章 編碼規(guī)范1559.1 排版1559.2 注釋1589.3 標示符名稱163第10章 shell編程16510.1 什么是shell16510.2 幾種流行的shell16510.3 shell程序設計(基礎部分)16610.3.1 shell基本語法16610.3.2 shell程序的變量和參數16710.4 shell程序設計的流程控制16910.4.1 test測試命令16910.4.2 if條件語句17010.4.3 for循環(huán)17110.4.4 while和until循環(huán)17110.4.5 case條件選擇17210.4.6 條件控制語句break和continue17310.4.7 函數定義17310.5 命令分組17410.6 信號17410.7 運行shell程序的方法17510.8 bash程序的調試17510.9 bash的內部命令176第11章 文件操作17911.1 Linux文件結構17911.1.1 Linux文件系統(tǒng)17911.1.2 Linux目錄結構18011.1.3 Linux文件分類18211.1.4 常見文件類型18311.1.5 Linux文件屬性18311.2 系統(tǒng)調用18411.3 Linux文件描述符18411.4 不帶緩存的I/O操作18511.4.1 creat函數18511.4.2 open函數18611.4.3 read函數18811.4.4 write函數18911.4.5 lseek函數18911.4.6 close函數18911.4.7 經典范例:文件復制19011.5 帶緩存的I/O操作19111.5.1 三種類型的緩沖19111.5.2 fopen函數19311.5.3 fclose函數19411.5.4 fdopen函數19411.5.5 fread函數19511.5.6 fwrite函數19511.5.7 fseek函數19611.5.8 fgetc函數、getc函數和getchar函數19711.5.9 fputc函數、putc函數和putchar函數19811.6 fgets函數與gets函數比較分析19911.7 輸出與輸入20111.7.1 printf函數、fprintf函數和sprintf函數20111.7.2 scanf函數、fcanf函數和sscanf函數203第12章 進程控制編程20712.1 為何需要多進程(或者多線程),為何需要并發(fā)20712.1.1 進程20712.1.2 進程分類20812.1.3 進程的屬性20812.1.4 父進程和子進程20812.2 Linux進程管理20912.2.1 ps監(jiān)視進程工具20912.2.2 pgrep查詢進程工具21112.2.3 終止進程的工具kill、killall、pkill、xkill21112.2.4 top監(jiān)視系統(tǒng)任務的工具21312.2.5 進程的優(yōu)先級:nice和renice21412.3 Linux進程的三態(tài)21512.3.1 三種基本狀態(tài)21512.3.2 三種狀態(tài)間的轉換21512.4 Linux進程結構21612.5 Linux進程控制塊PCB21612.6 Linux進程調度21812.6.1 調度的目標21812.6.2 調度算法21812.6.3 優(yōu)先級反轉22012.7 進程創(chuàng)建22112.7.1 獲取進程22112.7.2 啟動進程:fork( )22212.7.3 啟動進程:vfork( )22412.7.4 啟動進程:exec族22512.7.5 啟動進程:system22812.8 進程等待22912.8.1 僵尸進程的產生22912.8.2 如何避免僵尸進程23112.8.3 wait函數和waitpid函數23112.9 進程退出23512.9.1 退出方式的不同點23612.9.2 exit( )和_exit( )函數23612.9.3 exit( )和_exit( )的區(qū)別237第13章 進程間通信方式23913.1 進程間通信方式概述23913.1.1 進程間通信的目的23913.1.2 Linux進程間通信方式簡介24013.2 管道通信24113.2.1 建立名管道24113.2.2 讀寫名管道24213.2.3 名管道應用實例24613.2.4 創(chuàng)建有名管道24813.2.5 讀寫有名管道25013.3 管道通信方式的應用場景25313.4 信號25413.4.1 信號及信號來源25413.4.2 信號種類25413.4.3 信號處理方式25613.4.4 信號發(fā)送25613.4.5 自定義處理信號方式25813.4.6 信號集操作26213.4.7 使用信號注意事項26413.5 消息隊列26513.5.1 消息隊列基礎理論26613.5.2 使用消息隊列26613.5.3 消息隊列API26713.5.4 消息隊列的限制26913.5.5 消息隊列的應用實例27013.6 信號燈27313.6.1 信號燈概述27313.6.2 內核實現原理27413.6.3 使用信號燈27413.6.4 信號燈API27513.6.5 信號燈的限制27713.6.6 競爭問題27713.6.7 信號燈應用實例27713.7 共享內存方式一28113.7.1 內核實現原理28113.7.2 mmap( )及其相關系統(tǒng)調用28213.7.3 mmap( )范例28313.7.4 對mmap( )返回地址的訪問28713.8 共享內存方式二28913.8.1 系統(tǒng)V共享內存原理28913.8.2 系統(tǒng)V共享內存API29013.8.3 系統(tǒng)V共享內存范例291第14章 多線程編程29514.1 線程概述29514.1.1 為什么有了進程的概念后,還要再引入線程呢29514.1.2 多線程的優(yōu)點29614.1.3 多線程的缺點29614.2 多線程的實現29714.2.1 線程的創(chuàng)建29714.2.2 終止線程29914.2.3 等待線程終止30014.3 線程屬性30014.3.1 線程屬性初始化30114.3.2 線程分離30114.3.3 線程的繼承性30214.3.4 線程的調度策略30314.3.5 線程的調度參數30414.3.6 實例分析30514.4 線程同步機制30614.4.1 互斥鎖Mutex30614.4.2 互斥鎖使用實例30814.4.3 條件變量Conditions31014.4.4 條件變量使用實例311第15章 網絡編程31315.1 TCP/IP協議概述31315.1.1 TCP/IP 起源31315.1.2 TCP/IP的特性與應用31515.1.3 互聯網地址31515.1.4 域名系統(tǒng)31615.1.5 封裝31715.1.6 TCP/IP工作模型31815.1.7 TCP/IP 協議層31815.1.8 TCP/IP應用32015.1.9 網橋、路由器和網關32115.2 TCP和UDP32215.2.1 TCP協議32215.2.2 三次握手協議32215.2.3 TCP數據報頭32315.2.4 UDP協議32415.2.5 協議的選擇32415.2.6 IP和端口號32415.3 套接字32515.3.1 Socket概念32515.3.2 Socket類型32515.3.3 Socket信息數據結構32515.3.4 數據存儲優(yōu)先順序的轉換32615.3.5 地址格式轉化32715.3.6 名字地址轉化32815.4 網絡編程33015.4.1 建立Socket33115.4.2 綁定地址33215.4.3 監(jiān)聽33315.4.4 接受請求33415.4.5 連接服務器33515.4.6 發(fā)送數據33515.4.7 接收數據33615.5 采用TCP協議的C/S架構實現33815.5.1 模塊封裝33815.5.2 服務器的實現34015.5.3 客戶端的實現34115.6 并發(fā)服務器模型34215.6.1 多進程解決方案34215.6.2 多線程解決方案34215.6.3 調用fcntl將sockfd設置為非阻塞模式34815.7 多路轉接模型34815.7.1 服務器的實現34915.7.2 客戶端的實現35415.8 采用UDP協議C/S架構的實現35515.8.1 服務器的實現35515.8.2 客戶端的實現35615.8.3 UDP協議傳輸文件的實現357參考文獻360