出版時間:2008-9 出版社:清華大學(xué)出版社 作者:(美)法斯克(Fusco,J) 頁數(shù):476 字數(shù):670000 譯者:賈嚴磊,董西廣,王在奇
Tag標簽:無
前言
如果您已經(jīng)掌握了使用Linux的基本操作,比如會使用ls、grep、find和sort這樣的命令,而且還是一名C或C++程序員,知道如何使用Linux系統(tǒng)調(diào)用,就應(yīng)該明白除了能使用鼠標“單擊”之外,Linux還能給自己的生活帶來更多的方便——只是現(xiàn)在還不知道怎樣做到而已,所以您會問自己:“我該如何去做呢?”本書會幫您回答這個問題。作者以其廣博的知識,向那些非Linux初學(xué)者展示了如何攀越下一階段并走向精通的求知之路。從用于調(diào)試和性能分析的命令行工具,到/proc目錄下的文件列表,本書將會向您介紹這些Linux行家里手所熟練使用的各種工具,從而使您在日常生活中更方便、更有效地使用Linux。本書除了告訴您很多的“是什么”(什么工具,什么選項,什么文件),還會告訴您“為什么”。本書會解釋它們的運行原理,使您能知其然并知其所以然,最終將Linux(還有UNIX)的精華了然于胸。本書是獻給Linux程序員的一席饕餮大餐,希望您能用心品味,至少我是這么做的。開始享受吧!
內(nèi)容概要
本書將系統(tǒng)性地介紹GNU/Linux的開源工具,并通過可以被讀者容易修改的簡明示例說明如何使用這些工具,以滿足讀者的實際需求。 本書首先介紹如何下載、構(gòu)建和安裝開源項目,如何發(fā)布開源工具,以及如何避免將時間浪費到還未準備好的項目中,并引導(dǎo)讀者構(gòu)建自己的項目。然后通過示例演示了如何在文本編輯器中進行查找操作,展示了幾個常用文本編輯器中會用到的小技巧。 書中接下來對Linux內(nèi)核的基礎(chǔ)知識和操作系統(tǒng)的內(nèi)部原理進行了詳細且通俗易懂的闡述,并示范了如何將這些知識應(yīng)用到更高級的工具中。還重點講解sar、vmstat、valpind和strace等工具的輸出,以及如何將它們運用到應(yīng)用程序中;如何利用各種編程API來開發(fā)適用于自己的工具。 最后,作者介紹了可以提高軟件性能的工具;解釋了如今市面上的多芯CPU的內(nèi)在原理,并演示了如何從這些系統(tǒng)中獲取最佳性能;以及介紹了在各種環(huán)境下調(diào)試代碼的工具和技術(shù)。 對于程序員來說,如果希望自己開發(fā)出來的程序更為簡潔有效,如果想對Linux編程環(huán)境有更深刻的理解,那么,本書提供的資料相信能給您帶來驚喜!
作者簡介
John Fusco是GE Healthcare的一名軟件開發(fā)人員,專門編寫Linux應(yīng)用程序和設(shè)備驅(qū)動程序。他在Unix軟件行業(yè)有十多年的工作經(jīng)驗,從內(nèi)核2.0版本就開始開發(fā)Linux應(yīng)用程序。他曾為Embedded Systems Programming和Linux Journal撰寫文章。
書籍目錄
第1章 開源工具的下載和安裝 1.1 簡介 1.2 什么是開放源碼 1.3 開放源碼的意義 1.3.1 搜索工具 1.3.2 版本格式 1.4 存檔文件 1.4.1 識別存檔文件 1.4.2 查詢存檔文件 1.4.3 提取存檔文件 1.5 認識軟件包管理器 1.5.1 源代碼或二進制格式的選擇 1.5.2 使用軟件包 1.6 關(guān)于安全性和軟件包 1.6.1 驗證的必要性 1.6.2 軟件包的基本認證 1.6.3 數(shù)字簽名的軟件包驗證機制 1.6.4 RPM格式的GPG簽名 1.6.5 何時不能驗證軟件包 1.7 檢查軟件包目錄 1.7.1 查看軟件包 1.7.2 深入理解RPM軟件包 1.7.3 深入理解Debian軟件包 1.8 軟件包更新 1.8.1 Apt:高級軟件包工具 1.8.2 Yum:Yellowdog修訂版更新 1.8.3 Synaptic:The GUI Front End For Apt 1.8.4 up2date:Red Hat軟件包更新 1.9 小結(jié) 1.9.1 本章用到的工具 1.9.2 網(wǎng)絡(luò)資源第2章 從源代碼構(gòu)建 2.1 簡介 2.2 構(gòu)建工具 2.2.1 背景知識 2.2.2 make工具 2.2.3 程序的鏈接 2.2.4 深入理解庫 2.3 創(chuàng)建過程 2.3.1 GNU構(gòu)建工具 2.3.2 配置階段 2.3.3 構(gòu)建階段:make 2.3.4 安裝階段:make install 2.4 理解錯誤和警告 2.4.1 常見的Makefile錯誤 2.4.2 配置階段的錯誤 2.4.3 創(chuàng)建階段的錯誤 2.4.4 理解編譯器錯誤 2.4.5 理解編譯器警告信息 2.4.6 理解鏈接器錯誤 2.5 小結(jié) 2.5.1 本章用到的工具 2.5.2 網(wǎng)絡(luò)資源第3章 查找?guī)椭? 3.1 簡介 3.2 在線幫助工具 3.2.1 man頁面 3.2.2 man結(jié)構(gòu) 3.2.3 查找man頁面:apropos 3.2.4 查找正確的man頁面:whatis 3.2.5 在man頁面中查找 3.2.6 一些推薦的man頁面 3.2.7 GNUinfo 3.2.8 瀏覽info頁面 3.2.9 查找info頁面 3.2.10 推薦info頁面 3.2.11 桌面幫助工具 3.3 其他 3.3.1 /usr/share/doc 3.3.2 交叉引用和索引 3.3.3 查詢軟件包 3.4 文件格式 3.4.1 TeX/LaTtex/DVI 3.4.2 Texinfo 3.4.3 DoCbook 3.4.4 HTML 3.4.5 PostScript 3.4.6 便攜式文件格式(PDF) 3.4.7 troff 3.5 來自互聯(lián)網(wǎng)的信息 3.5.1 www.gnu.org 3.5.2 sourceforge.net 3.5.3 Linux文件項目 3.5.4 LIsenet(世界性的新聞組網(wǎng)絡(luò)系統(tǒng)) 3.5.5 郵件列表 3.5.6 其他論壇 3.6 查找Linux內(nèi)核信息 3.6.1 內(nèi)核構(gòu)建 3.6.2 內(nèi)核模塊 3.6.3 混雜(miscellaneous)文件 3.7 小結(jié) 3.7.1 本章用到的工具 3.7.2 在線資源第4章 編輯和保存源文件 4.1 簡介 4.2 文本編輯器 4.2.1 默認編輯器 4.2.2 在文本編輯器中查找 4.2.3 vi和Emacs 4.2.4 Vim:vi擴展 4.2.5 Emacs 4.2.6 反對復(fù)制品 4.2.7 GUI文本編輯器 4.2.8 內(nèi)存使用率 4.2.9 編輯器概述 4.3 版本控制 4.3.1 版本控制基礎(chǔ) 4.3.2 定義版本控制的術(shù)語 4.3.3 支持工具 4.3.4 diff和patch簡介 4.3.5 檢查和合并更改 4.4 源代碼的優(yōu)化器和瀏覽器 4.4.1 縮進代碼優(yōu)化器 4.4.2 Astyle風(fēng)格 4.4.3 用cflow分析代碼 4.4.4 用ctags分析代碼 4.4.5 用cscope瀏覽代碼 4.4.6 用Doxygen瀏覽和記錄代碼 4.4.7 使用編譯器分析代碼 4.5 小結(jié) 4.5.1 本章用到的工具 4.5.2 參考資料 4.5.3 在線資源第5章 開發(fā)者必備內(nèi)核知識 5.1 簡介 5.2 用戶模式與內(nèi)核模式 5.2.1 系統(tǒng)調(diào)用 5.2.2 用戶空間與內(nèi)核空間的數(shù)據(jù)傳送 5.3 進程調(diào)度程序 5.3.1 初識調(diào)度 5.3.2 阻塞,搶先占有和放棄 5.3.3 調(diào)度的優(yōu)先與公平 5.3.4 優(yōu)先權(quán)和Nice值 5.3.5 實時優(yōu)先權(quán) 5.3.6 創(chuàng)建實時進程 5.3.7 進程狀態(tài) 5.3.8 時間度量 5.4 設(shè)備和設(shè)備驅(qū)動程序 5.4.1 設(shè)備驅(qū)動程序的類型 5.4.2 內(nèi)核模塊 5.4.3 設(shè)備節(jié)點 5.4.4 設(shè)備和輸入/輸出 5.5 I/O調(diào)度程序 5.5.1 Ljlnus電梯式調(diào)度(aka noop) 5.5.2 I/O調(diào)度程序的截止時間 5.5.3 先占I/O調(diào)度程序 5.5.4 完整的公平地排隊I/O調(diào)度程序 5.5.5 選擇一個I/O調(diào)度程序 5.6 用戶空間的內(nèi)存管理 5.6.1 虛擬內(nèi)存的解釋 5.6.2 內(nèi)存耗盡 5.7 小結(jié) 5.7.1 本章用到的工具 5.7,2 本章討論的APIs 5.7.3 在線資源 5.7.4 參考資料第6章 進程 6.1 簡介 6.2 進程的產(chǎn)生 6.2.l fork和vfork 6.2.2 寫拷貝 6.2.3 clone 6.3 exec函數(shù) 6.3.1 可執(zhí)行腳本 6.3.2 可執(zhí)行目標文件 6.3.3 二進制文件 6.4 wait實現(xiàn)進程同步 6.5 進程的內(nèi)存占用 6.5.1 文件描述符 6.5.2 堆棧 6.5.3 常駐內(nèi)存和固定內(nèi)存 6.6 設(shè)定進程限制 6.7 進程和Drocfs 6.8 進程管理工具 6.8.1 通過ps命令顯示進程信息 6.8.2 使用formats增加進程信息 6.8.3 查找名中帶有ps和pgrep的進程 6.8.4 利用pmap查看進程使用的空間 6.8.5 通過名字發(fā)送信號給進程 6.9 小結(jié) 6.9.1 系統(tǒng)調(diào)用和本章用到的API 6.9.2 本章用到的工具 6.9.3 在線資源第7章 進程通信 7.1 簡介 7.2 使用純文本文件的IPC 7.2.1 文件加鎖 7.2.2 使用文件進行IPC的缺點 7.3 共享內(nèi)存 7.3.1 POSIX共享內(nèi)存API 7.3.2 SystemV共享內(nèi)存API 7.4 信號 7.4.1 向進程發(fā)送信號 7.4.2 信號處理 7.4.3 信號掩碼和信號處理 7.4.4 實時信號 7.4.5 具有sigqueue和sigaction的高級信號 7.5 管道 7.6 套接字 7.6.1 創(chuàng)建套接字 7.6.2 使用socketpair的本地套接字示例 7.6.3 使用本地套接字的客戶端/服務(wù)器端示例 7.6.4 使用網(wǎng)絡(luò)套接字的客戶端/服務(wù)器端示例 7.7 消息隊列 7.7.1 System V消息隊列 7.7.2 POSIX消息隊列 7.7.3 POSIX與System V的消息隊列的區(qū)別 7.8 信號量 7.8.1 POSIX信號量使用的API 7.8.2 System V信號量使用的API 7.9 小結(jié) 7.9.1 本章中用到的系統(tǒng)調(diào)用和API 7.9.2 參考資料 7.9.3 在線資源第8章 使用sheLL命令調(diào)試IPC 8.1 簡介 8.2 打開文件時用到的工具 8.2.1 lsof 8.2.2 fuser 8.2.3 ls 8.2.4 file 8.2.5 stat 8.3 查看文件中的數(shù)據(jù) 8.3.1 字符串命令 8.3.2 xxd命令 8.3.3 hexdump命令 8.3.4 od命令 8.4 用于V IPC系統(tǒng)的內(nèi)核工具 8.4.1 V系統(tǒng)共享內(nèi)存 8.4.2 V系統(tǒng)消息隊列 8.4.3 V系統(tǒng)的信號量 8.5 POSIX IPC用到的工具 8.5.1 POSIX共享內(nèi)存 8.5.2 POS[X消息隊列 8.5.3 POSIX信號量 8.6 信號用到的工具 8.7 管道和套接字用到的工具 8.7.1 管道和FIFO 8.7.2 套接字 8.8 使用索引識別文件和IPC對象 8.9 小結(jié) 8.9.1 本章用到的工具 8.9.2 在線資源第9章 性能優(yōu)化 9.1 簡介 9.2 系統(tǒng)性能 9.2.1 內(nèi)存問題 9.2.2 CPU利用率和總線沖突 9.2.3 設(shè)備和中斷 9.2.4 查找系統(tǒng)性能問題的工具 9.3 應(yīng)用程序性能 9.3.1 計時命令的第一步 9.3.2 x86info處理器結(jié)構(gòu) 9.3.3 使用Valgrind檢查指令效率 9.3.4 ltrace簡介 9.3.5 使用strace監(jiān)視程序性能 9.3.6 傳統(tǒng)性能優(yōu)化工具:gcov和gprof 9.3.7 OProfile簡介 9.4 多處理器平臺 9.4.1 SMP硬件的類型 9.4.2 SMP機上的編程實現(xiàn) 9.5 小結(jié) 9.5.1 本章介紹的基本性能 9.5.2 本章介紹的專業(yè)術(shù)語 9.5.3 本章用到的工具 9.5.4 在線資源 9.5.5 參考資料第10章 調(diào)試 10.1 簡介 10.2 最基本的調(diào)試工具:Drintf 10.2.1 使用pdntf存在的問題 10.2.2 有效地使用printf 10.2.3 關(guān)于printf調(diào)試工具的結(jié)束語 10.3 GNU下最好用的調(diào)試器:gdb 10.3.1 使用gdb運行代碼 10.3.2 停止和重新執(zhí)行 10.3.3 檢查和管理數(shù)據(jù) 10.3.4 使用gdb連接正在運行的進程 10.3.5 調(diào)試內(nèi)核文件 10.3.6 使用gdb進行多線程調(diào)試 10.3.7 調(diào)試優(yōu)化的代碼 10.4 調(diào)試共享對象 10.4.1 使用共享對象的時間和原因 10.4.2 創(chuàng)建共享對象 10.4.3 定位共享對象 10.4.4 覆蓋默認共享目標的位置 10.4.5 共享對象的安全問題 10.4.6 共享對象使用的工具 10.5 查找內(nèi)存問題 10.5.1 兩次釋放 10.5.2 內(nèi)存泄露 10.5.3 緩沖區(qū)溢出 10.5.4 glibc工具 10.5.5 使用valgrind調(diào)試內(nèi)存 10.5.6 使用E1ectric Fence檢測內(nèi)存泄漏 10.6 非常規(guī)技術(shù) 10.6.1 創(chuàng)建自己的黑匣子 10.6.2 獲取運行時的堆棧軌跡 10.6.3 強制內(nèi)核轉(zhuǎn)儲 10.6.4 使用信號 10.6.5 使用procfs調(diào)試 10.7 小結(jié) 10.7.1 本章用到的工具 10.7.2 在線資源 10.7.3 參考資料
章節(jié)摘錄
5.1 簡介本章假定你已掌握了一定的編寫Linux應(yīng)用程序的經(jīng)驗并且對內(nèi)核已有了初步的了解。本章將涵蓋一些與內(nèi)核相關(guān)的主題。這些主題在論述內(nèi)核實質(zhì)的書中經(jīng)常出現(xiàn)。與這些書不同的是,本章更側(cè)重從應(yīng)用角度進行分析。本章所涵蓋的內(nèi)容有Linux的調(diào)度程序,近來這些調(diào)度程序經(jīng)歷了許多變革。此外,本章還將闡述進程優(yōu)先權(quán)和搶占方式調(diào)度策略,以及它們的角色和實時應(yīng)用。32位的地址空間足夠滿足需要,因此多數(shù)應(yīng)用系統(tǒng)在實際操作中從未受阻。但現(xiàn)在,32位的系統(tǒng)已能支持超過4GB的RAM,許多程序員往往在操作受阻時還不知道他們遭遇的是怎樣的問題。學(xué)完本章后,你將對這些問題有個更清晰的認識,并且學(xué)會如何在操作中規(guī)避它們。本章還將介紹輸入輸出系統(tǒng)以及它與進程之間的關(guān)系。也許你已經(jīng)被現(xiàn)代處理器的高速時鐘速度搞得眼花繚亂,但不料卻失望地發(fā)現(xiàn)低速的啟動設(shè)備程序正嚴重扼殺處理器的操作性能。本章將介紹一些Linux程序設(shè)計模型中的低效構(gòu)件,以及如何在操作中繞開它們。本章還將詳細討論Linux 2.6版本中I/O調(diào)度程序的改進,以及如何更好地發(fā)揮其性能。5.2 用戶模式與內(nèi)核模式執(zhí)行進程的模式有兩種:用戶模式和內(nèi)核模式。你編寫的代碼和執(zhí)行所鏈接的庫是在用戶模式下。當(dāng)進程需要內(nèi)核的服務(wù)時,就必須執(zhí)行內(nèi)核代碼,而且這只能在內(nèi)核模式下運行。這聽起來很簡單,但是真正操作時存在許多困難。首先來討論為什么需要兩種操作模式。原因之一就是安全性。當(dāng)一個進程在用戶模式下執(zhí)行時,它所占的內(nèi)存空間對它來說是唯一的。Linux是一個多用戶操作系統(tǒng),因此一個進程不能訪問另一進程的內(nèi)存空間,因為另一進程可能包含密碼或一些敏感信息。用戶模式可以確保一個進程只能訪問它自己的內(nèi)存空間。此外,如果一個進程破壞了它自己的內(nèi)部結(jié)構(gòu),它也只能影響它自己,而不會波及到其他任何進程,當(dāng)然更不會影響到整個系統(tǒng)。在用戶模式下,進程所能訪問的內(nèi)存稱為用戶空間(user space)。因為該系統(tǒng)是作為一個整體運作的,所以內(nèi)核需要維護數(shù)據(jù)結(jié)構(gòu)以控制系統(tǒng)中的每個進程,因此內(nèi)核提供了一個所有的進程共享的內(nèi)存區(qū)域。因為系統(tǒng)中的所有進程都在執(zhí)行內(nèi)核,所以每個進程都需要訪問同一個共享的內(nèi)存區(qū)域。然而,為了保證安全性,內(nèi)核代碼和數(shù)據(jù)結(jié)構(gòu)必須嚴格獨立于用戶代碼和數(shù)據(jù)。這就是我們需要內(nèi)核模式的原因。只有內(nèi)存代碼可以在內(nèi)核模式下運行,訪問共享的內(nèi)核數(shù)據(jù)以及執(zhí)行特權(quán)指令。把進程在內(nèi)核模式下訪問的內(nèi)存區(qū)域叫做內(nèi)核空間(kernel space)。內(nèi)核空間只有一個,在內(nèi)核模式下的每一個進程都可以訪問內(nèi)核空間,但與用戶空間不同的是,內(nèi)核空間是每一個進程所特有的。圖5-1顯示了所有進程中內(nèi)核的虛擬地址分配。在這個例子中, 1G的虛擬地址高地址分配給了內(nèi)核,剩下部分則分配給了進程。這樣的分配方式可以在構(gòu)建內(nèi)核時確立。但這種所謂的3G/1G分配方式在很多現(xiàn)存的內(nèi)核中(也)是常見的。在這種配置下,內(nèi)核的所有地址都大于0XCJ0000000。當(dāng)進程要訪問這些地址時,就必須在內(nèi)核模式下執(zhí)行。
編輯推薦
《Linux開發(fā)工具箱:項目開發(fā)的最有效途徑》共分10個章節(jié),系統(tǒng)性地介紹GNU/Linux的開源工具,并通過可以被讀者容易修改的簡明示例說明如何使用這些工具,具體內(nèi)容包括開源工具的下載和安裝、從源代碼構(gòu)建、查找?guī)椭?、編輯和保存源文件、開發(fā)者必備內(nèi)核知識等?!禠inux開發(fā)工具箱:項目開發(fā)的最有效途徑》可供各大專院校作為教材使用,也可供從事相關(guān)工作的人員作為參考用書使用。
圖書封面
圖書標簽Tags
無
評論、評分、閱讀與下載