序言
前言
第1章 入門知識
1.1 什么是UNIX操作系統(tǒng)
1.2 什么是Linux操作系統(tǒng)
1.3 發(fā)行版本
1.4 GNU項目和自由軟件基金會
1.5 為Linux系統(tǒng)設計程序
1.6 UNIX程序
1.7 獲得幫助
1.8 程序開發(fā)系統(tǒng)的預備知識
1.8.1 程序
1.8.2 頭文件
1.8.3 庫文件
1.8.4 靜態(tài)庫
1.8.5 共享庫
1.9 UNIX系統(tǒng)中程序設計的特點和原則
1.9.1 簡單性
1.9.2 重點性
1.9.3 可反復使用的程序組件
1.9.4 過濾器
1.9.5 開放的文件格式
1.9.6 靈活適應性
1.10 本章總結
第2章 shell程序設計
2.1 什么是shell
2.2 管道和重定向
2.2.1 對輸出數據進行重定向
2.2.2 對輸入數據進行重定向
2.2.3 管道
2.3 可以被視為程序設計語言的shell
2.3.1 交互式程序
2.3.2 編寫腳本程序
2.3.3 把腳本設置為可執(zhí)行程序
2.4 shell程序設計的語法
2.4.1 變量
2.4.2 條件測試
2.4.3 控制結構
2.4.4 函數
2.4.5 命令
2.4.6 命令的執(zhí)行
2.4.7 即時文檔
2.4.8 調試腳本程序
2.5 shell程序設計示例
2.5.1 工作需求
2.5.2 設計
2.6 本章總結
第3章 如何使用和處理文件
3.1 UNIX的文件結構
3.1.1 目錄結構
3.1.2 文件和設備
3.2 系統(tǒng)調用和設備驅動程序
3.3 庫函數
3.4 文件的底層訪問
3.4.1 write系統(tǒng)調用
3.4.2 read系統(tǒng)調用
3.4.3 open系統(tǒng)調用
3.4.4 訪問權限的初始化值
3.4.5 umask變量
3.4.6 close系統(tǒng)調用
3.4.7 ioctl系統(tǒng)調用
3.4.8 其他與文件管理有關的系統(tǒng)調用
3.5 標準I/O庫
3.5.1 fopen函數
3.5.2 fread函數
3.5.3 fwrite函數
3.5.4 fclose函數
3.5.5 fflush函數
3.5.6 fseek函數
3.5.7 fgetc、getc、getchar函數
3.5.8 fputc、putc、putchat函數
3.5.9 fgets、gets函數
3.5.10 格式化輸入和輸出
3.5.11 對數據流進行處理的其他函數
3.5.12 文件流錯誤處理
3.5.13 文件流和文件描述符的關系
3.6 文件和子目錄的維護
3.6.1 chmod系統(tǒng)調用
3.6.2 chown系統(tǒng)調用
3.6.3 unlink、link、symlink系統(tǒng)調用
3.6.4 mkdir和rmdir系統(tǒng)調用
3.6.5 chdir系統(tǒng)調用和getcwd函數
3.7 掃描子目錄
3.7.1 opendir函數
3.7.2 readdir函數
3.7.3 telldir函數
3.7.4 seekdir函數
3.7.5 closedir函數
3.8 錯誤處理
3.9 高級論題
3.9.1 fcntl系統(tǒng)調用
3.9.2 mmap函數
3.10 本章總結
第4章 UNIX環(huán)境
4.1 程序參數
4.2 環(huán)境變量
4.2.1 環(huán)境變量的用途
4.2.2 environ變量
4.3 時間與日期
4.4 臨時文件
4.5 用戶的個人資料
4.6 主機資料
4.7 日志記錄功能
4.8 資源和限制
4.9 本章總結
第5章 終端
5.1 對終端進行讀寫
5.1.1 對重定向輸出進行處理
5.1.2 與終端進行“對話”
5.2 終端驅動程序和通用終端接口
5.2.1 概述
5.2.2 硬件模型
5.3 termios結構
5.3.1 輸入模式
5.3.2 輸出模式
5.3.3 控制模式
5.3.4 本地模式
5.3.5 特殊的控制字符
5.3.6 終端的速度
5.3.7 其他功能函數
5.4 終端的輸出
5.4.1 終端的類型
5.4.2 確定終端類型的方法
5.4.3 terminfo的使用方法
5.5 檢測鍵盤輸入
5.6 本章總結
第6章 curses函數庫
6.1 使用curses函數庫進行編譯
6.2 基本概念
6.3 操作的初始化和結束
6.4 向屏幕輸出數據
6.5 從屏幕讀取輸入數據
6.6 清除屏幕
6.7 移動光標
6.8 字符的屬性
6.9 鍵盤
6.9.1 鍵盤的工作模式
6.9.2 鍵盤輸入
6.10 窗口
6.10.1 WINDOW結構
6.10.2 通用化函數
6.10.3 移動和刷新窗口
6.10.4 優(yōu)化窗口的刷新操作
6.11 子窗口
6.12 鍵盤上的數字小鍵盤
6.13 彩色顯示功能
6.14 邏輯屏幕和顯示平面
6.15 CD唱盤管理軟件
6.16 本章總結
第7章 數據管理
7.1 內存管理
7.1.1 簡單的內存分配機制
7.1.2 分配大量的內存
7.1.3 內存的濫用
7.1.4 空指針
7.1.5 內存的釋放
7.1.6 其他內存分配函數
7.2 文件封鎖
7.2.1 創(chuàng)建鎖文件
7.2.2 文件中的封鎖區(qū)
7.2.3 封鎖狀態(tài)下的讀寫操作
7.2.4 文件封鎖的競爭現象
7.2.5 其他封鎖命令
7.2.6 死鎖現象
7.3 數據庫
7.3.1 dbm數據庫
7.3.2 dbm例程
7.3.3 dbm數據庫的訪問函數
7.3.4 其他dbm函數
7.4 CD唱盤管理軟件
7.5 本章總結
第8章 開發(fā)工具
8.1 多個源文件帶來的問題
8.2 make命令和制作文件
8.2.1 制作文件的語法
8.2.2 make命令的選項和參數
8.2.3 制作文件中的注釋
8.2.4 制作文件中的宏
8.2.5 多個制作目標
8.2.6 內建規(guī)則
8.2.7 后綴規(guī)則
8.2.8 用make命令管理函數庫
8.2.9 高級論題:制作文件和下級子目錄
8.2.10 GNU的make和gcc命令
8.3 源代碼控制系統(tǒng)
8.3.1 RCS系統(tǒng)
8.3.2 SCCS系統(tǒng)
8.3.3 CVS系統(tǒng)
8.4 編寫使用手冊
8.5 軟件的發(fā)行傳播
8.5.1 patch程序
8.5.2 軟件發(fā)行方面的其他工具
8.6 本章總結
第9章 調試與糾錯
9.1 錯誤的分類
9.1.1 功能定義錯誤
9.1.2 設計規(guī)劃錯誤
9.1.3 代碼編寫錯誤
9.2 常用調試技巧
9.2.1 一個有漏洞的程序
9.2.2 代碼審查
9.2.3 取樣法
9.2.4 程序的受控執(zhí)行
9.3 用gdb進行調試糾錯
9.3.1 啟動gdb
9.3.2 運行一個程序
9.3.3 堆棧跟蹤
9.3.4 對變量進行檢查
9.3.5 列出程序清單
9.3.6 設置斷點
9.3.7 用調試器打補丁
9.3.8 深入學習gdb
9.4 其他調試工具
9.4.1 lint:清理程序中的“垃圾”
9.4.2 函數調用工具
9.4.3 執(zhí)行記錄
9.5 假設驗證
9.6 內存調試
9.6.1 ElectricFence
9.6.2 Checker
9.7 資源
9.8 本章總結
第10章 進程與信號
10.1 什么是進程
10.2 進程的結構
10.2.1 進程表
10.2.2 查看進程
10.2.3 系統(tǒng)進程
10.2.4 進程的調度
10.3 啟動新的進程
10.3.1 等待進程
10.3.2 僵進程
10.3.3 輸入和輸出重定向
10.3.4 線程
10.4 信號
10.4.1 發(fā)送信號
10.4.2 信號集
10.5 本章總結
第11章 POSIX線程
11.1 什么是線程
11.2 檢查有無線程支持
11.3 第一個線程程序
11.4 同時執(zhí)行
11.5 同步
11.5.1 用信號量進行同步
11.5.2 用互斥量進行同步
11.6 線程的屬性
11.6.1 detachedstate屬性
11.6.2 schedpolicy屬性
11.6.3 schedparam屬性
11.6.4 inheritsched屬性
11.6.5 scope屬性
11.6.6 stacksize屬性
11.6.7 線程屬性—調度
11.7 取消一個線程
11.8 多線程
11.9 本章總結
第12章 進程間通信:管道
12.1 什么是管道
12.2 進程管道
12.2.1 popen函數
12.2.2 pclose函數
12.2.3 把輸出送往popen
12.3 pipe函數
12.4 父進程和子進程
12.4.1 管道關閉后的讀操作
12.4.2 把管道用做標準輸入和標準輸出
12.5 命名管道:FIFO文件
12.6 高級論題:以FIFO文件為基礎的客戶/服務器架構
12.7 CD唱盤管理軟件
12.7.1 目標
12.7.2 實現
12.7.3 客戶接口函數
12.7.4 服務器接口
12.7.5 管道
12.7.6 對CD唱盤管理軟件的總結
12.8 本章總結
第13章 信號量、消息隊列和共享內存
13.1 信號量
13.1.1 信號量的定義
13.1.2 一個理論性的例子
13.1.3 UNIX中的信號量功能
13.1.4 使用信號量
13.1.5 信號量總結
13.2 共享內存
13.2.1 概述
13.2.2 共享內存函數
13.2.3 共享內存總結
13.3 消息隊列
13.3.1 概述
13.3.2 消息隊列函數
13.3.3 消息隊列總結
13.4 應用示例
13.5 查看IPC功能狀態(tài)的命令
13.5.1 信號量
13.5.2 共享內存
13.5.3 消息隊列
13.6 本章總結
第14章 套接字
14.1 什么是套接字
14.2 套接字連接
14.2.1 套接字屬性
14.2.2 創(chuàng)建一個套接字
14.2.3 套接字地址
14.2.4 給套接字起名字
14.2.5 創(chuàng)建套接字隊列
14.2.6 接受連接
14.2.7 請求連接
14.2.8 關閉一個套接字
14.2.9 套接字通信
14.2.10 主機字節(jié)順序和網絡字節(jié)順序
14.3 網絡信息
14.3.1 因特網守護進程
14.3.2 套接字選項
14.4 多客戶
14.5 select系統(tǒng)調用
14.6 本章總結
第15章 工具命令語言Tcl
15.1 Tcl語言概述
15.1.1 第一個Tcl程序
15.1.2 Tcl命令
15.1.3 變量和值
15.1.4 引用和替換
15.1.5 計算
15.1.6 控制結構
15.1.7 錯誤處理
15.1.8 字符串操作
15.1.9 數組
15.1.10 列表
15.1.11 過程
15.1.12 輸入和輸出
15.2 一個Tcl程序
15.3 創(chuàng)建一個新Tcl語言
15.4 Tcl語言的擴展
15.4.1 expect
15.4.2 [incr Tcl]
15.4.3 TclX
15.4.4 圖形
15.5 本章總結
第16章 X窗口系統(tǒng)的程序設計
16.1 什么是X
16.1.1 X服務器
16.1.2 X協(xié)議
16.1.3 Xlib庫
16.1.4 X客戶
16.1.5 X工具包
16.2 X窗口管理器
16.3 X程序設計模型
16.3.1 啟動
16.3.2 主循環(huán)
16.3.3 退出整理
16.4 X程序設計概述
16.5 Tk工具包
16.5.1 窗口程序設計概述
16.5.2 配置文件
16.5.3 其他命令
16.5.4 Tk素材
16.5.5 Tk內建的對話框
16.5.6 顏色方案
16.5.7 字體
16.5.8 綁定
16.5.9 bindtags命令
16.5.10 幾何尺寸管理
16.5.11 焦點及其切換
16.5.12 選項數據庫
16.5.13 應用程序間的通信
16.5.14 selection命令
16.5.15 Clipboard命令
16.5.16 窗口管理器
16.5.17 動態(tài)/靜態(tài)加載
16.5.18 Safe Tk
16.6 一個復合素材
16.7 使用復合型樹素材的應用程序
16.8 Tk進程記錄查看器
16.8.1 國際化
16.8.2 業(yè)界動態(tài)
16.9 本章總結
第17章 使用GTK+進行GNOME程序設計
17.1 GNOME簡介
17.1.1 GNOME的體系結構
17.1.2 GNOME桌面
17.1.3 在GNOME里利用GTk+設計程序
17.1.4 GNOME應用程序
17.2 本章總結
第18章 Perl程序設計語言
18.1 Perl語言簡介
18.1.1 “Hello”Perl程序
18.1.2 Perl語言中的變量
18.1.3 操作符和函數
18.1.4 規(guī)則表達式
18.1.5 控制結構和子例程
18.1.6 文件的輸入和輸出
18.2 一個完整的例子
18.3 命令行上的Perl
18.4 模塊
18.4.1 CPAN
18.4.2 安裝一個模塊
18.4.3 perldoc命令
18.4.4 網絡功能
18.4.5 數據庫
18.5 改進版CD唱盤數據庫
18.6 本章總結
第19章 因特網程序設計:HTML
19.1 什么是World Wide Web
19.2 術語
19.2.1 超文本傳輸協(xié)議
19.2.2 因特網郵件多媒體擴展
19.2.3 標準通用置標語言
19.2.4 文檔類型定義
19.2.5 超文本置標語言
19.2.6 可擴展置標語言
19.2.7 層疊樣式表
19.2.8 可擴展超文本置標語言
19.2.9 統(tǒng)一資源定位器
19.2.10 統(tǒng)一資源標識符
19.3 一個HTML文檔
19.4 深入學習HTML
19.4.1 HTML標簽
19.4.2 圖像
19.4.3 表格
19.4.4 錨點或超鏈接
19.4.5 給圖像加上錨點
19.4.6 非HTML的URL地址
19.4.7 鏈接到其他站點
19.5 編寫HTML文件
19.6 HTML頁面服務
19.6.1 網絡中的HTML文檔
19.6.2 設置一個服務器
19.7 可點擊圖片
19.7.1 服務器端可點擊圖片
19.7.2 客戶端可點擊圖片
19.8 服務器端的預處理功能
19.9 編寫WWW主頁的技巧
19.10 本章總結
第20章 因特網程序設計II: CGI
20.1 表單元素
20.1.1 FORM標簽
20.1.2 INPUT標簽
20.1.3 SELECT標簽
20.1.4 TEXTAREA標簽
20.2 一個主頁示例
20.3 向WWW服務器發(fā)送信息
20.3.1 對信息進行編碼
20.3.2 服務器程序
20.3.3 編寫服務器端的CGI程序
20.3.4 使用擴展URL的CGI程序
20.3.5 對表單數據進行解碼
20.4 向客戶返回HTML
20.5 技巧與竅門
20.5.1 確保CGI程序能夠退出
20.5.2 對客戶進行重定向
20.5.3 動態(tài)圖形
20.5.4 隱藏上下文信息
20.6 一個應用程序
20.7 應用Perl語言
20.8 本章總結
第21章 設備驅動程序
21.1 設備
21.1.1 設備的分類
21.1.2 用戶空間與內核空間
21.2 字符設備
21.3 字符設備驅動程序示例:Schar
21.3.1 MSG宏命令
21.3.2 字符設備的注冊
21.3.3 模塊的使用計數
21.3.4 open和release:設備的打開和關閉
21.3.5 文件操作read:從設備讀出數據
21.3.6 current任務
21.3.7 等待隊列
21.3.8 文件操作write:向設備寫入數據
21.3.9 非阻塞性讀操作
21.3.10 查找操作
21.3.11 文件操作ioctl:I/O控制
21.3.12 檢查用戶權限
21.3.13 文件操作poll:設備對進程的調度
21.3.14 模塊的參數
21.3.15 proc文件系統(tǒng)接口
21.3.16 Schar的執(zhí)行情況
21.3.17 小結
21.4 定時和時基:jiffies變量
21.4.1 短暫延時
21.4.2 定時器
21.4.3 讓出處理器
21.4.4 任務隊列
21.4.5 預定義任務隊列
21.4.6 小結
21.5 內存管理
21.5.1 虛擬內存區(qū)
21.5.2 地址空間
21.5.3 內存地址的類型
21.5.4 在設備驅動程序里申請內存
21.5.5 在用戶空間和內核空間之間傳遞數據
21.5.6 簡單的內存映射
21.5.7 I/O內存
21.5.8 IOmap里的設備分配
21.5.9 對I/O內存實現mmap文件操作
21.6 I/O端口
21.6.1 可移植性
21.6.2 中斷處理
21.6.3 IRQ處理器
21.6.4 中斷的后處理
21.6.5 可重入性
21.6.6 單獨禁止一個中斷
21.6.7 原子化操作
21.6.8 對關鍵節(jié)進行保護
21.7 塊設備
21.7.1 一個簡單的RAM盤模塊:Radimo
21.7.2 介質的更換
21.7.3 塊設備的ioctl文件操作
21.7.4 請求函數:request
21.7.5 緩沖區(qū)緩存
21.7.6 小結
21.8 調試
21.8.1 Oops追查法
21.8.2 對模塊進行調試
21.8.3 “魔術鍵”
21.8.4 內核調試器—KDB
21.8.5 遠程調試
21.8.6 調試工作中的注意事項
21.9 可移植性
21.9.1 數據類型
21.9.2 字節(jié)的存儲順序
21.9.3 數據的對齊
21.10 本章總結
21.11 內核源代碼解剖圖
附錄A 可移植性
附錄B 自由軟件基金會和GNU項目
附錄C 因特網資源
附錄D 參考書目