王者歸來-Linux C 系統整合開發設計, 2/e

吳岳

  • 出版商: 佳魁資訊
  • 出版日期: 2013-03-28
  • 定價: $880
  • 售價: 8.5$748
  • 語言: 繁體中文
  • ISBN: 9865836092
  • ISBN-13: 9789865836092
  • 相關分類: C 程式語言Linux

已過版

買這商品的人也買了...

相關主題

商品描述

<內容簡介>

隨 著電腦技術的高速發展,Linux系統在伺服器解決方案中的優勢越來越被開發者認同。在電腦就業市場上,基於Linux系統開發的人員需求量也不斷增加。 其中,對Linux系統環境下C語言開發人員的需求尤為明顯。由於C語言本身在語法結構、語言風格和程式設計思想上的特點,使C語言一直被公認為難以學 習、輕鬆掌握。


儘管Linux環境下C語言開發越來越被企業和開發人員認同,關心的人數也越來越多,但實際上,真正了解和掌握C 語言開發的人卻很少。因此,筆者總結親身學習Linux系統函數介面的經驗,並結合自己多年從事Linux 環境下C語言應用程式開發的經驗,撰寫出這本能夠真正讓開發者掌握Linux環境下C語言程式設計技巧的書。在這本書中,
本書從實際開發者的角度 全面介紹Linux環境下C語言程式設計的基礎知識,涉及Linux系統函數的各個面向,選擇目前最熱門、應用最廣的技術進行深入討論。筆者透過28章的學習規劃,讓讀者快速掌握Linux環境下C語言程式設計的基本知識和程式設計技巧。每個核心概念都使用通俗的語言進行解釋,透過實例讓讀者更直觀地掌握概念的含義,達到靈活使用Linux系統函數介面撰寫程式的目的。

<章節目錄>

Part 1 Linuxc語言基礎
01 Linux
簡介0P01
1.1 GNU
簡介
 
1.2 Linux
簡介
 
1.2.1 Linux
發展史
 
1.2.2 Linux
發行版本
 
1.2.3 Linux
核心版本
 
1.2.4 Linux
UNIX 的關係

1.2.5 Linux
在伺服器方面的發展
 
1.2.6 Linux
在嵌入式系統方面的發展

1.2.7 Linux
在桌面系統方面的發展

1.3 Linux
環境下的其他程式設計語言
 
1.3.1 C++ 
1.3.2 Java
1.3.3 Perl 
1.3.4 Python 
1.3.5 Ruby
1.3.6 PHP
02
控制結構

2.1 goto
敘述 
2.1.1 C
語言中的無條件跳躍
 
2.1.2
使用goto 敘述進行出錯處理

2.1.3
出錯處理的一般模型

2.2 C
語言中的分支結構

2.2.1
分支結構的翻譯
 
2.2.2
使用goto 敘述實現分支結構
 
2.3
逐位元運算

2.3.1
逐位元運算

2.3.2 &&
運算的逐位元運算
 
2.3.3 ||
運算的逐位元運算
 
2.4 C
語言中的迴圈結構
 
2.4.1 while
迴圈
 
2.4.2 do
while 迴圈
2.4.3 for
迴圈
 
2.5 switch
敘述
 
2.5.1 switch
敘述的應用

2.5.2
使用goto 敘述實現switch 敘述

2.6
最佳化控制結構

2.6.1
運算式最佳化——使用替換程式中的乘除法

2.6.2
運算式最佳化——常數折疊
 
2.6.3
運算式最佳化——使用數學公式

2.6.4
運算式最佳化——儲存問題
 
2.6.5
分支最佳化——改變判斷順序

2.6.6
分支最佳化——使用switch 敘述
 
2.6.7
迴圈最佳化——一次性計算
 
03 C
語言中的函數
03
3.1
函數的本質
 
3.2
變數的作用域和生命期

3.2.1
全域變數

3.2.2
區域變數

3.3
變數的初值
 
3.3.1
全域變數的初值
 
3.3.2
區域變數的初值

3.4
與函數有關的最佳化
 
3.4.1
函式呼叫與程式最佳化
 
3.4.2
變數儲存最佳化
 
3.5
撰寫多檔案程式——變數的儲存類別

3.5.1
儲存類別

3.5.2 static
變數的作用——改變變數的生命期
 
3.5.3 static
變數的作用——實現封裝和模組化設計
 
3.6
撰寫多檔案的程式——連結的作用
 
3.6.1
連結多個檔案

3.6.2
連結時符號解析規則

3.6.3
連結規則的應用

3.7
可變參數
 
3.7.1
可變參數的概念

3.7.2
實現一個簡單的可變參數的函數

3.7.3
可變參數實例

3.7.4
關於printf 函數的疑問——缺少整數參數

3.7.5
關於printf 函數的疑問——缺少字串位址參數
 
04 C
語言中的指標與字串

4.1 sizeof
運算子
4.1.1 sizeof
運算子的應用——得到內建類型的大小

4.1.2 sizeof
運算子的應用——得到複合類型的大小

4.2
指標的應用

4.2.1
指標與別名陷阱
 
4.2.2
陣列的指標

4.2.3
指標的指標
 
4.2.4
指標與參數傳遞

4.2.5
指標類型的意義

4.2.6 void*
型指標

4.3
函數的指標
 
4.3.1 C
語言中的函數指標
 
4.3.2
函數指標的應用——回呼函數
 
4.3.3
函數指標陣列

4.4
字串
 
4.4.1
字串與字元陣列
 
4.4.2
字串與指標
 
4.4.3
限定修飾符
const 
4.4.4 const
關鍵字修飾指標——在指標定義之前
 
4.4.5 const
關鍵字修飾指標——在指標定義之中

4.4.6 const
關鍵字修飾指標——在指標定義之前和定義之中

4.4.7
使用const 關鍵字的意義
 
05 C
語言的高級技術

5.1
結構體與共同體 
5.1.1
結構體中成員變數的儲存分佈
 
5.1.2
記憶體對齊

5.2
位元運算

5.2.1
遮罩運算
 
5.2.2
不安全的位元運算

5.2.3
互斥運算的特性

5.2.4
移位元運算的陷阱

5.2.5
移位元運算的實例
 
5.3
預先處理
 
5.3.1
常用的程式碼組織形式
 
5.3.2
偵錯開關

5.4 C99
新標準關鍵字詳解

5.4.1 inline
關鍵字的概念
 
5.4.2 inline
關鍵字實例
 
5.4.3 inline
關鍵字使用總結

5.4.4 restrict
關鍵字的概念
 
5.4.5 restrict
關鍵字的應用

Part 2 C
語言開發環境

06 vi
vim 編輯器
6.1 vi
編輯器入門 
6.1.1 vi
簡介

6.1.2 vi
的工作模式
 
6.2 vi
一般操作
 
6.2.1
進入
vi 
6.2.2
文字插入操作

6.2.3
文字刪除操作

6.2.4
文字複製操作

6.2.5
取消指令

6.2.6
重複指令
 
6.2.7
退出
vi 
6.3 vi
的增強操作

6.3.1
替換指令
 
6.3.2
游標移動
 
6.3.3
按行移動游標

6.3.4
按字移動游標

6.3.5
按句移動游標

6.3.6
按段移動游標

6.3.7
文字行的移動

6.3.8
文字的異行移動
 
6.3.9
螢幕捲動

6.3.10
尋找指令
 
6.3.11
替換指令

6.3.12
視窗的切分
 
6.3.13
設定環境

07 gcc
編譯器

7.1
初探gcc 編譯器 
7.1.1
從經典的hello world 開始

7.1.2 gcc
編譯流程

7.2 gcc
常用選項

7.2.1 gcc
常用選項整理

7.2.2 -c
選項
 
7.2.3 -S
選項
 
7.2.4 -E
選項
 
7.2.5 -o
選項

7.2.6 -I
選項
 
7.2.7 -g
選項
 
7.3
連結原理
 
7.3.1
連結器的工作

7.3.2
目的檔案

7.3.3 ELF
格式的可重定位目的檔案

7.3.4
目的檔案中的符號表

7.3.5
重定位的概念

7.3.6
符號的重定位資訊
 
7.4
關於程式庫
 
7.4.1
使用程式庫的優勢

7.4.2
靜態程式庫的概念
 
7.4.3
建立靜態程式庫
  
7.4.4
使用靜態程式庫
 
7.4.5
動態程式庫的概念
 
7.4.6
建立動態程式庫
 
7.4.7
使用動態程式庫

7.5 gcc
工具鏈
 
08 makefile
8.1 makefile
檔案入門

8.1.1 makefile
檔案的組成內容

8.1.2 makefile
檔案包含

8.1.3 make
工具的退出碼

8.2
書寫makefile 規則

8.2.1
使用基本規則

8.2.2
使用隱式規則

8.2.3
使用虛擬目標

8.2.4
使用萬用字元

8.2.5
搜索原始檔案

8.3
使用指令

8.3.1
顯示指令

8.3.2
執行指令

8.3.3
指令出錯
 
8.4
使用變數
 
8.4.1
使用普通變數

8.4.2
變數中的變數

8.4.3
追加變數的值

8.4.4
自動化變數

8.5
使用條件判斷
 
8.5.1
條件運算式
 
8.5.2
運算式實例

8.6
使用函數
 
8.6.1
函式呼叫的語法
 
8.6.2
字串處理函數

8.6.3
檔案名操作函數

8.6.4 foreach
函數

8.6.5 if
函數

8.6.6 call
函數

8.6.7 origin
函數

8.6.8 shell
函數

8.7 makefile
實例

8.7.1 makefile
實例——專案中的總
makefile 
8.7.2 makefile
實例——makefile 模版

09 gdb
9.1
列出來源程式

9.1.1
不帶參數的list 指令
  
9.1.2
帶一個參數的list 指令

9.1.3
帶兩個參數的list 指令

9.2
執行程式的指令
 
9.3
操作中斷點的指令

9.3.1
設定中斷點

9.3.2
顯示目前gdb 的中斷點資訊

9.3.3
刪除指定的中斷點

9.3.4
禁止或啟用中斷點
 
9.3.5
清除中斷點

9.3.6
觀察點

9.3.7
設定中斷點實例

9.4
檢視執行時資料
 
9.4.1
資料觀察指令

9.4.2
對程式中函數的呼叫
 
9.4.3
檢視運算式的值

9.4.4
檢視陣列的值

9.4.5
變數的輸出格式

9.4.6
檢視記憶體

9.4.7
自動顯示變數

9.4.8
設定顯示選項

9.4.9
顯示變數的歷史記錄

9.4.10
檢視暫存器
 
9.4.11
檢視使用gdb 環境變數

9.4.12
檢視資料實例

9.5
改變程式的執行

9.5.1
修改變數的值

9.5.2
跳躍執行

9.5.3
訊號的產生及處理

9.5.4
強制呼叫函數

9.5.5
強制函數傳回

9.6 gdb
高級應用

9.6.1
產生core 檔案
 
9.6.2
追蹤堆疊上資料

9.6.3
綁定執行執行緒

9.6.4
原始檔案搜索

9.6.5
機器語言工具

9.6.6
其他有用的偵錯指令
 
Part 3 Linux
執行緒操作

10
執行緒環境
10.1
程式的啟動和退出 
10.1.1
shell 中啟動一個程式
 
10.1.2
載入一個程式

10.1.3
載入地址

10.1.4
退出程式

10.1.5
執行緒終止處理函數
 
10.2 Linux
執行緒記憶體管理

10.2.1
資料的內部儲存

10.2.2 C
程式的儲存版面配置——程式碼部分

10.2.3 C
程式的儲存版面配置——資料段和緩衝段

10.2.4 C
程式的儲存版面配置
——Stack 
10.2.5 C
程式的儲存版面配置
——Heap
10.2.6
常數的儲存

10.2.7
動態記憶體管理

10.2.8
動態記憶體分配的深入研究
 
10.3 shell
環境

10.3.1
命令列參數

10.3.2
得到程式檔案名
 
10.3.3
環境變數

10.3.4
得到指定的環境變數

10.3.5
設定一個環境變數
 
10.3.6
得到執行緒結束狀態

10.3.7
使用errno 偵錯工具

10.3.8
輸出錯誤原因

10.4
全域跳躍
 
10.4.1
局部跳躍的局限性

10.4.2
使用全域跳躍

10.4.3
使用全域跳躍代替局部跳躍
 
11
執行緒環境

11.1
執行緒識別字
11.1.1
執行緒
ID
11.1.2
執行緒中重要的ID
 
11.2
執行緒操作

11.2.1
建立一個執行緒

11.2.2
父子執行緒的共用資源

11.2.3 fork
函數的出錯情況
 
11.2.4
建立一個共用空間的子執行緒
 
11.2.5
在函數內部呼叫vfork 函數
 
11.2.6
退出執行緒
 
11.2.7
使用exit 函數檢查執行緒出錯資訊
 
11.2.8 exit
函數與核心函數的關係

11.2.9
設定執行緒所有者

11.2.10
偵錯多執行緒——設定追蹤流

11.2.11
偵錯多執行緒——使用gdb attach 指令
 
11.3
執行程式
 
11.3.1
執行一個新程式

11.3.2
執行解譯器檔案
 
11.3.3
在程式中執行shell 指令

11.3.4
實現system 函數
 
11.4
關係操作

11.4.1
等待執行緒退出
 
11.4.2
等待指定的執行緒
 
11.4.3
僵屍執行緒的概念

11.4.4
產生一個僵屍執行緒

11.4.5
避免僵屍執行緒的產生

11.4.6
輸出執行緒統計資訊
 
12
時間和日曆歷程

12.1
系統時間 
12.2
日曆時間
 
13
訊號及訊號處理

13.1
訊號的基礎 
13.1.1
訊號的基本概念

13.1.2
產生訊號
 
13.1.3
處理訊號

13.1.4
常用訊號的使用方法
 
13.2
訊號的影響

13.2.1
重入
 
13.2.2
最小操作
 
13.2.3
中斷系統呼叫

13.3
訊號處理函數

13.3.1
設定訊號處理函數

13.3.2
發送訊號

13.3.3
向執行緒本身發送訊號
 
13.3.4
設定Linux 計時器
 
13.3.5
定時等待
I/O
13.3.6
暫停執行緒

13.3.7
執行緒休眠
 
13.4
訊號集與遮罩訊號
 
13.4.1
訊號集和訊號集處理函數
 
13.4.2
遮罩訊號
 
13.4.3
處理未決訊號

13.4.4
高級訊號註冊函數
 
13.4.5
訊號選項實例——SA_NOCLDWAIT 選項

13.4.6
訊號選項實例——SA_NODEFFER 選項
 
13.4.7
訊號選項實例——SA_RESETHAND 選項
 
14
執行緒間通訊

14.1
執行緒間通訊概述 
14.1.1
執行緒間通訊簡介
 
14.1.2
執行緒間通訊的困難
 
14.1.3 IPC
的多種方式

14.2
管線
 
14.2.1
管線的概念
 
14.2.2
匿名半雙工管線

14.2.3
匿名半雙工管線的讀寫操作

14.2.4
建立管線的標準庫函數
 
14.3 FIFO
管線

14.3.1 FIFO
的概念
 
14.3.2
建立
FIFO
14.3.3 FIFO
的讀寫操作

14.3.4 FIFO
的缺點
 
14.4 System V IPC/POSIX IPC
14.4.1 IPC
物件的概念

14.4.2 IPC
物件的問題

14.4.3 IPC
物件系統指令

14.5
共用記憶體
 
14.5.1
共用記憶體的概念
 
14.5.2
共用記憶體的建立
 
14.5.3
共用記憶體的操作
 
14.5.4
共用記憶體使用注意事項
 
14.6
訊號量
 
14.6.1
訊號量的概念

14.6.2
訊號量的建立

14.6.3
訊號量集合的操作

14.7
訊息佇列
 
14.7.1
訊息佇列的概念

14.7.2
建立訊息佇列

14.7.3
讀寫訊息佇列

15
執行緒

15.1
執行緒與處理程序
15.1.1
執行緒的概念

15.1.2
執行緒的優勢

15.2
執行緒識別字

15.3
執行緒基本操作
 
15.3.1
建立執行緒
 
15.3.2
向執行緒體函數傳遞參數
 
15.3.3
執行緒存取資源的限制

15.3.4
終止執行緒

15.3.5
正確得到執行緒退出資訊的方法

15.3.6
取消一個執行緒的執行
 
15.3.7
執行緒退出函數

16
執行緒高級操作

16.1
執行緒同步——使用互斥量
16.1.1
初始化與銷毀互斥量

16.1.2
得到與釋放互斥量

16.1.3
使用互斥量的實例

16.2
執行緒同步——使用讀寫入鎖

16.2.1
初始化與銷毀讀寫入鎖
 
16.2.2
得到與釋放互斥鎖

16.2.3
使用互斥量與讀寫入鎖的比較

16.3
執行緒屬性

16.3.1
建立和銷毀屬性結構
 
16.3.2
執行緒的分離狀態

16.3.3
分離一個已經建立的執行緒

16.3.4
執行緒堆疊的屬性

Part 4  Linux
檔案操作

17
檔案I/O15 執行緒
17.1
檔案描述符號的概念
17.2
檔案I/O 操作
 
17.2.1
開啟一個檔案

17.2.2
開啟檔案的出錯情況

17.2.3
關閉一個檔案

17.2.4
建立一個新檔案

17.2.5
檔案定位

17.2.6
檔案截短

17.2.7
清空一個檔案

17.2.8
檔案的讀寫操作
 
17.2.9
檔案同步

17.3
檔案描述符號操作

17.3.1
複製檔案描述符號
 
17.3.2 I/O
重新導向概念及其應用

17.3.3
控制檔案
 
17.3.4
修改開啟檔案的檔案狀態

17.4
非阻塞檔案
I/O 
17.4.1
非阻塞I/O 的概念
 
17.4.2
以非阻塞方式開啟檔案

17.4.3
將一個開啟檔案設定為非阻塞方式

17.5
記憶體映射
I/O
17.5.1
記憶體映射I/O 的概念

17.5.2
建立一個記憶體映射
 
17.5.3
取消一個記憶體映射

17.5.4
記憶體映射同步

17.5.5
更改記憶體映射的許可權
 
18
檔案管理

18.1
檔案狀態
18.2
檔案類型
 
18.3
檔案權限
 
18.3.1
存取權限

18.3.2
設定使用者ID 位和設定組ID

18.3.3
設定使用者ID 位的作用
 
18.3.4
使用設定使用者ID 位元的實例

18.4
檔案許可權操作

18.4.1
測試檔案存取權限
 
18.4.2
設定使用者ID 位與檔案許可權測試

18.4.3
使用檔案許可權遮罩字

18.4.4
shell 中使用檔案許可權遮罩字

18.4.5
在程式中使用檔案許可權遮罩字
 
18.4.6
改變檔案存取權限
 
18.4.7
shell 中改變檔案許可權
 
18.4.8
在程式中改變檔案許可權

18.4.9
改變一個開啟的檔案許可權
 
18.5
檔案系統結構
 
18.6
檔案的硬連結
 
18.6.1
建立一個硬連結

18.6.2
刪除一個硬連結
 
18.7
改變檔案所有者

18.8
操作檔案的時間
 
19
目錄操作

19.1
目錄的許可權
19.1.1
目錄的存取權限

19.1.2
測試目錄的存取權限

19.2
目錄操作
 
19.2.1
建立一個目錄

19.2.2
刪除一個目錄

19.2.3
目錄項結構

19.2.4
開啟與關閉目錄

19.2.5
讀取目錄

19.2.6
讀取目錄操作的實例——實現自己的ls 指令
 
19.2.7
得到目錄檔案的讀寫位置

19.2.8
定位目錄

19.2.9
返回目錄檔案

19.3
處理程序的工作目錄

19.3.1
工作目錄的概念

19.3.2
改變處理程序的工作目錄

19.3.3
得到處理程序的目前工作目錄
 
19.3.4
子處理程序工作目錄對父處理程序的影響

20
特殊檔案

20.1
符號連結操作
20.1.1
符號連結

20.1.2
符號連結的功能

20.1.3
建立符號連結

20.1.4
建立指向不存在檔案的符號連結
 
20.1.5
讀寫符號連結的目的檔案
 
20.1.6
讀寫多重符號連結的目的檔案
 
20.1.7
讀寫符號連結

20.1.8
取得符號連結的狀態
 
20.1.9
更改符號連結的所有者

20.2 proc
檔案系統
 
20.2.1 proc
檔案系統

20.2.2
常用的核心資訊
 
20.2.3
讀取核心資訊

20.2.4
處理程序狀態資訊

20.2.5
讀取處理程序狀態
 
20.2.6 proc
檔案系統變成實例——實現自己的ps 指令

21
基於串流的
I/O
21.1
串流與緩衝
 
21.2
基於串流的檔案操作
 
21.2.1
開啟和關閉串流
 
21.2.2
檔案內容的實際寫入

21.2.3
以字元為單位讀寫資料
 
21.2.4
以行為單位讀寫資料
 
21.2.5 gets
函數的漏洞
 
21.2.6
單行讀取檔案內容
 
21.2.7
輸出xml 形式的設定檔

21.2.8
讀寫資料區塊

21.2.9
檔案讀寫實例——實現cp 指令

21.2.10
檔案讀寫實例——字元統計
 
21.2.11
檔案讀寫實例——目錄下所有檔案的字元統計

Part 5  Linux
網絡編程

22 TCP
UDP 協定
22.1
電腦網路的體系結構簡介

22.1.1
電腦網路架構簡介

22.1.2 OSI
參考模型中各層功能描述
 
22.1.3 TCP/IP
參考模型的各層功能描述
 
22.1.4
連線導向服務和無連接服務
 
22.2 Client/Server
方式簡介
 
22.3
使用者資料封包通訊協定
UDP 
22.3.1
使用者資料封包的格式

22.3.2
使用者資料封包核對總和的計算

22.3.3 UDP
使用者資料封包的特性及用途

22.4
傳輸控制協定
TCP 
22.4.1 TCP
簡介
 
22.4.2 TCP
封包段的表頭

22.4.3 TCP
資料編號與確認

22.4.4 TCP
的流量控制與擁塞控制

22.4.5 TCP
的運輸連接管理

23
網路程式設計基礎

23.1
通訊端概念
23.2
準備工作
 
23.2.1
位元組序
 
23.2.2
地址格式

23.2.3
位址形式轉換

23.2.4
獲得主機資訊

23.2.5
位址映射
 
23.3
通訊端基礎程式設計
 
23.3.1
建立和銷毀通訊端描述符號

23.3.2
地址綁定

23.3.3
建立一個連接

23.3.4
最簡單的網路應用程式——伺服器端

23.3.5
最簡單的網路應用程式——用戶端
 
23.3.6
使用檔案讀寫函數讀寫通訊端
 
23.3.7
使用完整讀寫函數的網路應用程式
 
23.3.8
連線導向的資料傳輸
 
23.3.9
連線導向的網路應用程式——伺服器端
 
23.3.10
連線導向的網路應用程式——用戶端

23.3.11
不需連線的資料傳輸
 
23.3.12
不需連線的網路應用程式——伺服器端

23.3.13
不需連線的網路應用程式——用戶端

23.4
非阻塞通訊端
 
23.4.1
非阻塞網路應用程式——伺服器端

23.4.2
非阻塞網路應用程式——用戶端
 
24
網路程式設計進階

24.1
通訊端程式設計深入 
24.1.1 bind
函數的作用
 
24.1.2
同時伺服器

24.1.3 UDP
協定的connect 函數應用
 
24.2
多路選擇
I/O
24.2.1
多路選擇I/O 的概念

24.2.2
實現多路選擇
I/O
24.2.3
使用多路選擇I/O 處理多個連接
  
24.2.4
遮罩訊號的多路選擇
I/O 
24.2.5
比較select 函數和pselect 函數
 
24.2.6
輪詢
I/O
24.3
非網路通訊通訊端

24.3.1
非命名UNIX 域通訊端
 
24.3.2
命名UNIX 域通訊端

24.3.3 UNIX
域通訊端實例——伺服器端
 
24.3.4 UNIX
域通訊端實例——用戶端

25
網路程式設計實例--實現檔案傳輸程式

25.1
程式設計 
25.1.1
整體程式設計

25.1.2
用戶端程式設計

25.1.3
伺服器端程式設計

25.2
檔案傳輸程式的實現

25.2.1
用戶端程式的實現——標頭檔

25.2.2
用戶端程式的實現——程式主函數

25.2.3
用戶端程式的實現——指令拆分函數

25.2.4
用戶端程式的實現——