[德] Michael Kerrisk 著,孫劍,許從年,董健 等 譯
《Linux/UNIX系統(tǒng)編程手冊(cè)(套裝上下冊(cè))》是介紹Linux與UNIX編程接口的專業(yè)著作。Linux編程資深專家MichaelKerrisk在書中詳細(xì)描述了Linux/UNIX系統(tǒng)編程所涉及的系統(tǒng)調(diào)用和庫函數(shù),并輔之以全面而清晰的代碼示例。《Linux/UNIX系統(tǒng)編程手冊(cè)(上、下冊(cè))》涵蓋了逾500個(gè)系統(tǒng)調(diào)用及庫函數(shù),并給出逾200個(gè)程序示例,另含88張表格和115幅示意圖。
《Linux/UNIX系統(tǒng)編程手冊(cè)(套裝上下冊(cè))》總共分為64章,主要講解了高效讀寫文件,對(duì)信號(hào)、時(shí)鐘和定時(shí)器的運(yùn)用,創(chuàng)建進(jìn)程、執(zhí)行程序,編寫安全的應(yīng)用程序,運(yùn)用POSIX線程技術(shù)編寫多線程程序,創(chuàng)建和使用共享庫,運(yùn)用管道、消息隊(duì)列、共享內(nèi)存和信號(hào)量技術(shù)來進(jìn)行進(jìn)程間通信,以及運(yùn)用套接字API編寫網(wǎng)絡(luò)應(yīng)用等內(nèi)容?! 禠inux/UNIX系統(tǒng)編程手冊(cè)(套裝上下冊(cè))》在匯聚大批Linux專有特性(epoll、inotify、/proc)的同時(shí),還特意強(qiáng)化了對(duì)UNIX標(biāo)準(zhǔn)(POSIX、SUS)的論述,徹底達(dá)到了“魚與熊掌,二者得兼”的效果,這也堪稱本書的大亮點(diǎn)。
《Linux/UNIX系統(tǒng)編程手冊(cè)(套裝上下冊(cè))》布局合理,論述清晰,說理透徹,尤其是作者對(duì)示例代碼的構(gòu)思巧妙,獨(dú)具匠心,仔細(xì)研讀定會(huì)受益良多。本書適合從事Linux/UNIX系統(tǒng)開發(fā)、運(yùn)維工作的技術(shù)人員閱讀,同時(shí)也可作為高校計(jì)算機(jī)專業(yè)學(xué)生的參考研習(xí)資料。
Michael Kerrisk 具有 20 多年的unix系統(tǒng)使用和編程經(jīng)驗(yàn),所開設(shè)的 unix 系統(tǒng)編程周訓(xùn)課程更是不計(jì)其數(shù)。自 2004 年起,他開始維護(hù)手冊(cè)頁項(xiàng)目,該項(xiàng)目旨在生成描述 linux 內(nèi)核以及 glibc 編程 api 的手冊(cè)頁。他已經(jīng)撰寫或與他人合著了 250 多篇手冊(cè)頁,至今仍積極參與對(duì) linux 內(nèi)核/用戶空間接口的測試和設(shè)計(jì)評(píng)審工作。
Michael 與家人居住在德國慕尼黑。
編寫Linux軟件時(shí)如果只能選擇一本參考書,則非本書莫屬。
——MARTIN LANDERS,Google公司軟件工程師
本書描述精到、示例周詳,涵蓋了LINUX底層API編程的詳盡內(nèi)容及個(gè)中細(xì)微之處——無論讀者水平如何,都能從本書中受益。
——MEL GORMAN,Understanding the Linux Virtual Memory Manager作者
Michael Kerrisk的這本Linux編程巨著,不但論及LINUX編程、其與各種標(biāo)準(zhǔn)之間的聯(lián)系,而且還就作者所知,重點(diǎn)介紹了已獲修正的Linux內(nèi)核bug以及改進(jìn)頗多的LINUX手冊(cè)頁。憑此三點(diǎn),足可讓Linux編程更易上手。本書對(duì)各項(xiàng)主題的深入探討使其成為必備的參考書籍———無論讀者在Linux編程方面造詣如何。
——ANDREAS JAEGER ,NOVELL公司OPENSUSE項(xiàng)目經(jīng)理
Michael用他堅(jiān)忍不拔的毅力為Linux程序員奉獻(xiàn)了這本論述嚴(yán)謹(jǐn),表述清晰、簡潔的專業(yè)參考書。雖然本書是針對(duì)Linux程序員而著,但對(duì)任何在UNIX/POSIX環(huán)境中編程的程序員來說都極具價(jià)值。
——DAVID BUTENHOF,Programming with POSIX Threads作者、POSIX /UNIX標(biāo)準(zhǔn)撰寫者
本書在重點(diǎn)關(guān)注Linux系統(tǒng)的同時(shí),對(duì)于UNIX系統(tǒng)和網(wǎng)絡(luò)編程也闡述透徹,淺顯易懂。無論是初涉UNIX編程的新丁,還是編程經(jīng)驗(yàn)豐富的UNIX老手(想要了解大行其道的GNU/Linux系統(tǒng)有何新意),我都向他們力薦此書。
——FERNANDO GONT,網(wǎng)絡(luò)安全研究員、IETF參與者、IETF RFC作者
本書以百科全書般的敘述風(fēng)格對(duì)Linux接口編程作了既深且廣的覆蓋,還提供了大量教科書風(fēng)格的編程示例和練習(xí)。本書所包含的各項(xiàng)主題——從原理到可以實(shí)際運(yùn)行的代碼——都描述清晰且易于理解。本書正是專業(yè)人士、學(xué)生以及教育工作者所期盼的Linux/UNIX參考書。
——ANTHONY ROBINS ,奧塔哥大學(xué)計(jì)算機(jī)科學(xué)副教授
無論從精確性、質(zhì)量還是詳細(xì)程度來說,本書都令我印象深刻。身為Linux系統(tǒng)調(diào)用的行家,Michael Kerrisk與我們分享了他對(duì)Linux API的認(rèn)知和理解。
——CHRISTOPHE BLAESS,Programmation système en C sous Linux作者
對(duì)于治學(xué)嚴(yán)謹(jǐn)?shù)膶I(yè)Linux/UNIX系統(tǒng)程序員而言,本書實(shí)為必備的參考書籍。本書涵蓋了所有關(guān)鍵API的使用——同時(shí)兼顧Linux和UNIX系統(tǒng)接口,描述清晰,示例具體;除此之外,還強(qiáng)調(diào)了遵從諸如SUS和POSIX 1003.1等標(biāo)準(zhǔn)的重要性和益處。
——ANDREW JOSEY,The OPen Group 標(biāo)準(zhǔn)部總監(jiān),POSIX 1003.1工作組主席
由手冊(cè)頁的維護(hù)者親自操刀,以系統(tǒng)程序員視角寫出一本百科全書式的LINUX系統(tǒng)編程巨著——還有比著更完美的嗎?本書全面而又詳實(shí)。我堅(jiān)信本書將在我的書架上牢牢占據(jù)一席之地。
——BILL GALLMEISTER,POSIX.4 Programmer’s Guide: Programming for the Real World
上冊(cè)
第1章 歷史和標(biāo)準(zhǔn)
1.1 UNIX和C語言簡史
1.2 Linux簡史
1.2.1 GNU項(xiàng)目
1.2.2 Linux內(nèi)核
1.3 標(biāo)準(zhǔn)化
1.3.1 C編程語言
1.3.2 首個(gè)POSIX標(biāo)準(zhǔn)
1.3.3 X/Open公司和The Open Group
1.3.4 SUSv3和POSIX.1-2001
1.3.5 SUSv4和POSIX.1-2008
1.3.6 UNIX標(biāo)準(zhǔn)時(shí)間表
1.3.7 實(shí)現(xiàn)標(biāo)準(zhǔn)
1.3.8 Linux、標(biāo)準(zhǔn)、Linux標(biāo)準(zhǔn)規(guī)范(Linux Standard Base)
1.4 總結(jié)
第2章 基本概念
2.1 操作系統(tǒng)的核心-內(nèi)核
2.2 shell
2.3 用戶和組
2.4 單根目錄層級(jí)、目錄、鏈接及文件
2.5 文件I/O模型
2.6 程序
2.7 進(jìn)程
2.8 內(nèi)存映射
2.9 靜態(tài)庫和共享庫
2.10 進(jìn)程間通信及同步
2.11 信號(hào)
2.12 線程
2.13 進(jìn)程組和shell任務(wù)控制
2.14 會(huì)話、控制終端和控制進(jìn)程
2.15 偽終端
2.16 日期和時(shí)間
2.17 客戶端服務(wù)器架構(gòu)
2.18 實(shí)時(shí)性
2.19 /proc文件系統(tǒng)
2.20 總結(jié)
第3章 系統(tǒng)編程概念
3.1 系統(tǒng)調(diào)用
3.2 庫函數(shù)
3.3 標(biāo)準(zhǔn)C語言函數(shù)庫;GNU C語言函數(shù)庫(glibc)
3.4 處理來自系統(tǒng)調(diào)用和庫函數(shù)的錯(cuò)誤
3.5 關(guān)于本書示例程序的注意事項(xiàng)
3.5.1 命令行選項(xiàng)及參數(shù)
3.5.2 常用的函數(shù)及頭文件
3.6 可移植性問題
3.6.1 特性測試宏
3.6.2 系統(tǒng)數(shù)據(jù)類型
3.6.3 其他的可移植性問題
3.7 總結(jié)
3.8 練習(xí)
第4章 文件I/O:通用的I/O模型
4.1 概述
4.2 通用I/O
4.3 打開一個(gè)文件:open
4.3.1 open調(diào)用中的flags參數(shù)
4.3.2 open函數(shù)的錯(cuò)誤
4.3.3 creat系統(tǒng)調(diào)用
4.4 讀取文件內(nèi)容:read
4.5 數(shù)據(jù)寫入文件:write
4.6 關(guān)閉文件:close
4.7 改變文件偏移量:lseek
4.8 通用I/O模型以外的操作:ioctl
4.9 總結(jié)
4.10 練習(xí)
第5章 深入探究文件I/O
5.1 原子操作和競爭條件
5.2 文件控制操作:fcntl
5.3 打開文件的狀態(tài)標(biāo)志
5.4 文件描述符和打開文件之間的關(guān)系
5.5 復(fù)制文件描述符
5.6 在文件特定偏移量處的I/O:pread和pwrite
5.7 分散輸入和集中輸出(Scatter-Gather I/O):readv和writev
5.8 截?cái)辔募簍runcate和ftruncate系統(tǒng)調(diào)用
5.9 非阻塞I/O
5.10 大文件I/O
5.11 /dev/fd目錄
5.12 創(chuàng)建臨時(shí)文件
5.13 總結(jié)
5.14 練習(xí)
第6章 進(jìn)程
6.1 進(jìn)程和程序
6.2 進(jìn)程號(hào)和父進(jìn)程號(hào)
6.3 進(jìn)程內(nèi)存布局
6.4 虛擬內(nèi)存管理
6.5 棧和棧幀
6.6 命令行參數(shù)(argc, argv)
6.7 環(huán)境列表
6.8 執(zhí)行非局部跳轉(zhuǎn):setjmp和longjmp
6.9 總結(jié)
6.9 練習(xí)
第7章 內(nèi)存分配
7.1 在堆上分配內(nèi)存
7.1.1 調(diào)整program break:brk和sbrk
7.1.2 在堆上分配內(nèi)存:malloc和free
7.1.3 malloc和free的實(shí)現(xiàn)
7.1.4 在堆上分配內(nèi)存的其他方法
7.2 在堆棧上分配內(nèi)存:alloca
7.3 總結(jié)
7.4 練習(xí)
第8章 用戶和組
8.1 密碼文件:/etc/passwd
8.2 shadow密碼文件:/etc/shadow
8.3 組文件:/etc/group
8.4 獲取用戶和組的信息
8.5 密碼加密和用戶認(rèn)證
8.6 總結(jié)
8.7 練習(xí)
第9章 進(jìn)程憑證
9.1 實(shí)際用戶ID和實(shí)際組ID
9.2 有效用戶ID和有效組ID
9.3 Set-User-ID和Set-Group-ID程序
9.4 保存set-user-ID和保存set-group-ID
9.5 文件系統(tǒng)用戶ID和組ID
9.6 輔助組ID
9.7 獲取和修改進(jìn)程憑證
9.7.1 獲取和修改實(shí)際、有效和保存設(shè)置標(biāo)識(shí)
9.7.2 獲取和修改文件系統(tǒng)ID
9.7.3 獲取和修改輔助組ID
9.7.4 修改進(jìn)程憑證的系統(tǒng)調(diào)用總結(jié)
9.7.5 示例:顯示進(jìn)程憑證
9.8 總結(jié)
9.9 習(xí)題
第10章 時(shí)間
10.1 日歷時(shí)間(Calendar Time)
10.2 時(shí)間轉(zhuǎn)換函數(shù)
10.2.1 將time_t轉(zhuǎn)換為可打印格式
10.2.2 time_t和分解時(shí)間之間的轉(zhuǎn)換
10.2.3 分解時(shí)間和打印格式之間的轉(zhuǎn)換
10.3 時(shí)區(qū)
10.4 地區(qū)(Locale)
10.5 更新系統(tǒng)時(shí)鐘
10.6 軟件時(shí)鐘(jiffies)
10.7 進(jìn)程時(shí)間
10.8 總結(jié)
10.9 練習(xí)
第11章 系統(tǒng)限制和選項(xiàng)
11.1 系統(tǒng)限制
11.2 在運(yùn)行時(shí)獲取系統(tǒng)限制(和選項(xiàng))
11.3 運(yùn)行時(shí)獲取與文件相關(guān)的限制(和選項(xiàng))
11.4 不確定的限制
11.5 系統(tǒng)選項(xiàng)
11.6 總結(jié)
11.7 練習(xí)
第12章 系統(tǒng)和進(jìn)程信息
12.1 /proc文件系統(tǒng)
12.1.1 獲取與進(jìn)程有關(guān)的信息:/proc/PID
12.1.2 /proc 目錄下的系統(tǒng)信息
12.1.3 訪問/proc文件
12.2 系統(tǒng)標(biāo)識(shí):uname
12.3 總結(jié)
12.4 練習(xí)
第13章 文件I/O緩沖
13.1 文件I/O的內(nèi)核緩沖:緩沖區(qū)高速緩存
13.2 stdio庫的緩沖
13.3 控制文件I/O的內(nèi)核緩沖
13.4 I/O緩沖小結(jié)
13.5 就I/O模式向內(nèi)核提出建議
13.6 繞過緩沖區(qū)高速緩存:直接I/O
13.7 混合使用庫函數(shù)和系統(tǒng)調(diào)用進(jìn)行文件I/O
13.8 總結(jié)
13.9 練習(xí)
第14章 系統(tǒng)編程概念
14.1 設(shè)備專用文件(設(shè)備文件)
14.2 磁盤和分區(qū)
14.3 文件系統(tǒng)
14.4 i節(jié)點(diǎn)
14.5 虛擬文件系統(tǒng)(VFS)
14.6 日志文件系統(tǒng)
14.7 單根目錄層級(jí)和掛載點(diǎn)
14.8 文件系統(tǒng)的掛載和卸載
14.8.1 掛載文件系統(tǒng):mount
14.8.2 卸載文件系統(tǒng):umount和umount2
14.9 高級(jí)掛載特性
14.9.1 在多個(gè)掛載點(diǎn)掛載文件系統(tǒng)
14.9.2 多次掛載同一掛載點(diǎn)
14.9.3 基于每次掛載的掛載標(biāo)志
14.9.4 綁定掛載
14.9.5 遞歸綁定掛載
14.10 虛擬內(nèi)存文件系統(tǒng):tmpfs
14.11 獲得與文件系統(tǒng)有關(guān)的信息:statvfs
14.12 總結(jié)
14.13 練習(xí)
第15章 文件屬性
15.1 獲取文件信息:stat
15.2 文件時(shí)間戳
15.2.1 使用utime和utimes來改變文件時(shí)間戳
15.2.2 使用utimensat和futimens改變文件時(shí)間戳
15.3 文件屬主
15.3.1 新建文件的屬主
15.3.2 改變文件屬主:chown、fchown和lchown
15.4 文件權(quán)限
15.4.1 普通文件的權(quán)限
15.4.2 目錄權(quán)限
15.4.3 權(quán)限檢查算法
15.4.4 檢查對(duì)文件的訪問權(quán)限:access
15.4.5 Set-User-ID、Set-Group-ID和Sticky位
15.4.6 進(jìn)程的文件模式創(chuàng)建掩碼:umask
15.4.7 更改文件權(quán)限:chmod和fchmod
15.5 I節(jié)點(diǎn)標(biāo)志(ext2擴(kuò)展文件屬性)
15.6 總結(jié)
15.7 練習(xí)
第16章 擴(kuò)展屬性
16.1 概述
16.2 擴(kuò)展屬性的實(shí)現(xiàn)細(xì)節(jié)
16.3 操控?cái)U(kuò)展屬性的系統(tǒng)調(diào)用
16.4 總結(jié)
16.5 練習(xí)
第17章 訪問控制列表
17.1 概述
17.2 ACL權(quán)限檢查算法
17.3 ACL的長、短文本格式
17.4 ACL_mask型ACE和ACL組分類
17.5 getfacl和setfacl命令
17.6 默認(rèn)ACL與文件創(chuàng)建
17.7 ACL在實(shí)現(xiàn)方面的限制
17.8 ACL API
17.9 總結(jié)
17.10 練習(xí)
第18章 目錄與鏈接
18.1 目錄和(硬)鏈接
18.2 符號(hào)(軟)鏈接
18.3 創(chuàng)建和移除(硬)鏈接:link和 unlink
18.4 更改文件名:rename
18.5 使用符號(hào)鏈接:symlink和readlink
18.6 創(chuàng)建和移除目錄:mkdir和rmdir
18.7 移除一個(gè)文件或目錄:remove
18.8 讀目錄:opendir和readdir
18.9 文件樹遍歷:nftw
18.10 進(jìn)程的當(dāng)前工作目錄
18.11 針對(duì)目錄文件描述符的相關(guān)操作
18.12 改變進(jìn)程的根目錄:chroot
18.13 解析路徑名:realpath
18.14 解析路徑名字符串:dirname和basename
18.15 總結(jié)
18.16 練習(xí)
第19章 監(jiān)控文件事件
19.1 概述
19.2 inotify API
19.3 inotify事件
19.4 讀取inotify事件
19.5 隊(duì)列限制和/proc文件
19.6 監(jiān)控文件的舊有系統(tǒng):dnotify
19.7 總結(jié)
19.8 練習(xí)
第20章 信號(hào):基本概念
20.1 概念和概述
20.2 信號(hào)類型和默認(rèn)行為
20.3 改變信號(hào)處置:signal
20.4 信號(hào)處理器簡介
20.5 發(fā)送信號(hào):kill
20.6 檢查進(jìn)程的存在
20.7 發(fā)送信號(hào)的其他方式:raise和killpg
20.8 顯示信號(hào)描述
20.9 信號(hào)集
20.10 信號(hào)掩碼(阻塞信號(hào)傳遞)
20.11 處于等待狀態(tài)的信號(hào)
20.12 不對(duì)信號(hào)進(jìn)行排隊(duì)處理
20.13 改變信號(hào)處置:sigaction
20.14 等待信號(hào):pause
20.15 總結(jié)
20.16 練習(xí)
第21章 信號(hào):信號(hào)處理器函數(shù)
21.1 設(shè)計(jì)信號(hào)處理器函數(shù)
21.1.1 再論信號(hào)的非隊(duì)列化處理
21.1.2 可重入函數(shù)和異步信號(hào)安全函數(shù)
21.1.3 全局變量和sig_atomic_t數(shù)據(jù)類型
21.2 終止信號(hào)處理器函數(shù)的其他方法
21.2.1 在信號(hào)處理器函數(shù)中執(zhí)行非本地跳轉(zhuǎn)
21.2.2 異常終止進(jìn)程:abort
21.3 在備選棧中處理信號(hào):sigaltstack
21.4 SA_SIGINFO標(biāo)志
21.5 系統(tǒng)調(diào)用的中斷和重啟
21.6 總結(jié)
21.7 練習(xí)
第22章 信號(hào):高級(jí)特性
22.1 核心轉(zhuǎn)儲(chǔ)文件
22.2 傳遞、處置及處理的特殊情況
22.3 可中斷和不可中斷的進(jìn)程睡眠狀態(tài)
22.4 硬件產(chǎn)生的信號(hào)
22.5 信號(hào)的同步生成和異步生成
22.6 信號(hào)傳遞的時(shí)機(jī)與順序
22.7 signal的實(shí)現(xiàn)及可移植性
22.8 實(shí)時(shí)信號(hào)
22.8.1 發(fā)送實(shí)時(shí)信號(hào)
22.8.2 處理實(shí)時(shí)信號(hào)
22.9 使用掩碼來等待信號(hào):sigsuspend
22.10 以同步方式等待信號(hào)
22.11 通過文件描述符來獲取信號(hào)
22.12 利用信號(hào)進(jìn)行進(jìn)程間通信
22.13 早期的信號(hào)API(System V和BSD)
22.14 總結(jié)
22.15 練習(xí)
第23章 定時(shí)器與休眠
23.1 間隔定時(shí)器
23.2 定時(shí)器的調(diào)度及精度
23.3 為阻塞操作設(shè)置超時(shí)
23.4 暫停運(yùn)行(休眠)一段固定時(shí)間
23.4.1 低分辨率休眠:sleep
23.4.2 高分辨率休眠:nanosleep
23.5 POSIX時(shí)鐘
23.5.1 獲取時(shí)鐘的值:clock_gettime
23.5.2 設(shè)置時(shí)鐘的值:clock_settime
23.5.3 獲取特定進(jìn)程或線程的時(shí)鐘ID
23.5.4 高分辨率休眠的改進(jìn)版:clock_nanosleep
23.6 POSIX間隔式定時(shí)器
23.6.1 創(chuàng)建定時(shí)器:timer_create
23.6.2 配備和解除定時(shí)器:timer_settime
23.6.3 獲取定時(shí)器的當(dāng)前值:timer_gettime
23.6.4 刪除定時(shí)器:timer_delete
23.6.5 通過信號(hào)發(fā)出通知
23.6.6 定時(shí)器溢出
23.6.7 通過線程來通知
23.7 利用文件描述符進(jìn)行通知的定時(shí)器:timerfd API
23.8 總結(jié)
23.9 練習(xí)
第24章 進(jìn)程的創(chuàng)建
24.1 fork、exit、wait以及execve的簡介
24.2 創(chuàng)建新進(jìn)程:fork
24.2.1 父、子進(jìn)程間的文件共享
24.2.2 fork的內(nèi)存語義
24.3 系統(tǒng)調(diào)用vfork
24.4 fork之后的競爭條件(Race Condition)
24.5 同步信號(hào)以規(guī)避競爭條件
24.6 總結(jié)
24.7 練習(xí)
第25章 進(jìn)程的終止
25.1 進(jìn)程的終止:_exit和exit
25.2 進(jìn)程終止的細(xì)節(jié)
25.3 退出處理程序
25.4 fork、stdio緩沖區(qū)以及_exit之間的交互
25.5 總結(jié)
25.6 練習(xí)
第26章 監(jiān)控子進(jìn)程
26.1 等待子進(jìn)程
26.1.1 系統(tǒng)調(diào)用wait
26.1.2 系統(tǒng)調(diào)用waitpid
26.1.3 等待狀態(tài)值
26.1.4 從信號(hào)處理程序中終止進(jìn)程
26.1.5 系統(tǒng)調(diào)用waitid
26.1.6 系統(tǒng)調(diào)用wait3和wait4
26.2 孤兒進(jìn)程與僵尸進(jìn)程
26.3 SIGCHLD信號(hào)
26.3.1 為SIGCHLD建立信號(hào)處理程序
26.3.2 向已停止的子進(jìn)程發(fā)送SIGCHLD信號(hào)
26.3.3 忽略終止的子進(jìn)程
26.4 總結(jié)
26.5 練習(xí)
第27章 程序的執(zhí)行
27.1 執(zhí)行新程序:execve
27.2 exec庫函數(shù)
27.2.1 環(huán)境變量PATH
27.2.2 將程序參數(shù)指定為列表
27.2.3 將調(diào)用者的環(huán)境傳遞給新程序
27.2.4 執(zhí)行由文件描述符指代的程序:fexecve
27.3 解釋器腳本
27.4 文件描述符與exec
27.5 信號(hào)與exec
27.6 執(zhí)行shell命令:system
27.7 system的實(shí)現(xiàn)
27.8 總結(jié)
27.9 練習(xí)
第28章 詳述進(jìn)程創(chuàng)建和程序執(zhí)行
28.1 進(jìn)程記賬
28.2 系統(tǒng)調(diào)用clone
28.2.1 clone的flags參數(shù)
28.2.2 因克隆生成的子進(jìn)程而對(duì)waitpid進(jìn)行的擴(kuò)展
28.3 進(jìn)程的創(chuàng)建速度
28.4 exec和fork對(duì)進(jìn)程屬性的影響
28.5 總結(jié)
28.6 練習(xí)
第29章 線程:介紹
29.1 概述
29.2 Pthreads API的詳細(xì)背景
29.3 創(chuàng)建線程
29.4 終止線程
29.5 線程ID(Thread ID)
29.6 連接(joining)已終止的線程
29.7 線程的分離
29.8 線程屬性
29.9 線程VS進(jìn)程
29.10 總結(jié)
29.11 練習(xí)
第30章 線程:線程同步
30.1 保護(hù)對(duì)共享變量的訪問:互斥量
30.1.1 靜態(tài)分配的互斥量
30.1.2 加鎖和解鎖互斥量
30.1.3 互斥量的性能
30.1.4 互斥量的死鎖
30.1.5 動(dòng)態(tài)初始化互斥量
30.1.6 互斥量的屬性
30.1.7 互斥量類型
30.2 通知狀態(tài)的改變:條件變量(Condition Variable)
30.2.1 由靜態(tài)分配的條件變量
30.2.2 通知和等待條件變量
30.2.3 測試條件變量的判斷條件(predicate)
30.2.4 示例程序:連接任意已終止線程
30.2.5 經(jīng)由動(dòng)態(tài)分配的條件變量
30.3 總結(jié)
30.4 練習(xí)
第31章 線程:線程安全和每線程存儲(chǔ)
31.1 線程安全(再論可重入性)
31.2 一次性初始化
31.3 線程特有數(shù)據(jù)
31.3.1 庫函數(shù)視角下的線程特有數(shù)據(jù)
31.3.2 線程特有數(shù)據(jù)API概述
31.3.3 線程特有數(shù)據(jù)API詳述
31.3.4 使用線程特有數(shù)據(jù)API
31.3.5 線程特有數(shù)據(jù)的實(shí)現(xiàn)限制
31.4 線程局部存儲(chǔ)
31.5 總結(jié)
31.6 練習(xí)
第32章 線程:線程取消
32.1 取消一個(gè)線程
32.2 取消狀態(tài)及類型
32.3 取消點(diǎn)
32.4 線程可取消性的檢測
32.5 清理函數(shù)(cleanup handler)
32.6 異步取消
32.7 總結(jié)
第33章 線程:更多細(xì)節(jié)
33.1 線程棧
33.2 線程和信號(hào)
33.2.1 UNIX信號(hào)模型如何映射到線程中
33.2.2 操作線程信號(hào)掩碼
33.2.3 向線程發(fā)送信號(hào)
33.2.4 妥善處理異步信號(hào)
33.3 線程和進(jìn)程控制
33.4 線程實(shí)現(xiàn)模型
33.5 Linux POSIX線程的實(shí)現(xiàn)
33.5.1 LinuxThreads
33.5.2 NPTL
33.5.3 哪一種線程實(shí)現(xiàn)
33.6 Pthread API的高級(jí)特性
33.7 總結(jié)
33.8 練習(xí)
下冊(cè)
第34章 進(jìn)程組、會(huì)話和作業(yè)控制
34.1 概述
34.2 進(jìn)程組
34.3 會(huì)話
34.4 控制終端和控制進(jìn)程
34.5 前臺(tái)和后臺(tái)進(jìn)程組
34.6 SIGHUP信號(hào)
34.6.1 在shell中處理SIGHUP信號(hào)
34.6.2 SIGHUP和控制進(jìn)程的終止
34.7 作業(yè)控制
34.7.1 在shell中使用作業(yè)控制
34.7.2 實(shí)現(xiàn)作業(yè)控制
34.7.3 處理作業(yè)控制信號(hào)
34.7.4 孤兒進(jìn)程組(SIGHUP回顧)
34.8 總結(jié)
34.9 習(xí)題
第35章 進(jìn)程優(yōu)先級(jí)和調(diào)度
35.1 進(jìn)程優(yōu)先級(jí)(nice值)
35.2 實(shí)時(shí)進(jìn)程調(diào)度概述
35.2.1 SCHED_RR策略
35.2.2 SCHED_FIFO策略
35.2.3 SCHED_BATCH和SCHED_IDLE策略
35.3 實(shí)時(shí)進(jìn)程調(diào)用API
35.3.1 實(shí)時(shí)優(yōu)先級(jí)范圍
35.3.2 修改和獲取策略和優(yōu)先級(jí)
35.3.3 釋放CPU
35.3.4 SCHED_RR時(shí)間片
35.4 CPU親和力
35.5 總結(jié)
35.6 習(xí)題
第36章 進(jìn)程資源
36.1 進(jìn)程資源使用
36.2 進(jìn)程資源限制
36.3 特定資源限制細(xì)節(jié)
36.4 總結(jié)
36.5 習(xí)題
第37章 DAEMON
37.1 概述
37.2 創(chuàng)建一個(gè)daemon
37.3 編寫daemon指南
37.4 使用SIGHUP重新初始化一個(gè)daemon
37.5 使用syslog記錄消息和錯(cuò)誤
37.5.1 概述
37.5.2 syslog API
37.5.3 /etc/syslog.conf文件
37.6 總結(jié)
37.7 習(xí)題
第38章 編寫安全的特權(quán)程序
38.1 是否需要一個(gè)Set-User-ID或Set-Group-ID程序?
38.2 以最小權(quán)限操作
38.3 小心執(zhí)行程序
38.4 避免暴露敏感信息
38.5 確定進(jìn)程的邊界
38.6 小心信號(hào)和競爭條件
38.7 執(zhí)行文件操作和文件I/O的缺陷
38.8 不要完全相信輸入和環(huán)境
38.9 小心緩沖區(qū)溢出
38.10 小心拒絕服務(wù)攻擊
38.11 檢查返回狀態(tài)和安全地處理失敗情況
38.12 總結(jié)
38.13 習(xí)題
第39章 能力
39.1 能力基本原理
39.2 Linux能力
39.3 進(jìn)程和文件能力
39.3.1 進(jìn)程能力
39.3.2 文件能力
39.3.3 進(jìn)程許可和有效能力集的目的
39.3.4 文件許可和有效能力集的目的
39.3.5 進(jìn)程和文件可繼承集的目的
39.3.6 在shell中給文件賦予能力和查看文件能力
39.4 現(xiàn)代能力實(shí)現(xiàn)
39.5 在exec中轉(zhuǎn)變進(jìn)程能力
39.5.1 能力邊界集
39.5.2 保持root語義
39.6 改變用戶ID對(duì)進(jìn)程能力的影響
39.7 用編程的方式改變進(jìn)程能力
39.8 創(chuàng)建僅包含能力的環(huán)境
39.9 發(fā)現(xiàn)程序所需的能力
39.10 不具備文件能力的老式內(nèi)核和系統(tǒng)
39.11 總結(jié)
39.12 習(xí)題
第40章 登錄記賬
40.1 utmp和wtmp文件概述
40.2 utmpx API
40.3 utmpx結(jié)構(gòu)
40.4 從utmp和wtmp文件中檢索信息
40.5 獲取登錄名稱:getlogin
40.6 為登錄會(huì)話更新utmp和wtmp文件
40.7 lastlog文件
40.8 總結(jié)
40.9 習(xí)題
第41章 共享庫基礎(chǔ)
41.1 目標(biāo)庫
41.2 靜態(tài)庫
41.3 共享庫概述
41.4 創(chuàng)建和使用共享庫--首回合
41.4.1 創(chuàng)建一個(gè)共享庫
41.4.2 位置獨(dú)立的代碼
41.4.3 使用一個(gè)共享庫
41.4.4 共享庫soname
41.5 使用共享庫的有用工具
41.6 共享庫版本和命名規(guī)則
41.7 安裝共享庫
41.8 兼容與不兼容庫比較
41.9 升級(jí)共享庫
41.10 在目標(biāo)文件中指定庫搜索目錄
41.11 在運(yùn)行時(shí)找出共享庫
41.12 運(yùn)行時(shí)符號(hào)解析
41.13 使用靜態(tài)庫取代共享庫
41.14 總結(jié)
41.15 習(xí)題
第42章 共享庫高級(jí)特性
42.1 動(dòng)態(tài)加載庫
42.1.1 打開共享庫:dlopen
42.1.2 錯(cuò)誤診斷:dlerror
42.1.3 獲取符號(hào)的地址:dlsym
42.1.4 關(guān)閉共享庫:dlclose
42.1.5 獲取與加載的符號(hào)相關(guān)的信息:dladdr
42.1.6 在主程序中訪問符號(hào)
42.2 控制符號(hào)的可見性
42.3 鏈接器版本腳本
42.3.1 使用版本腳本控制符號(hào)的可見性
42.3.2 符號(hào)版本化
42.4 初始化和終止函數(shù)
42.5 預(yù)加載共享庫
42.6 監(jiān)控動(dòng)態(tài)鏈接器:LD_DEBUG
42.7 總結(jié)
42.8 習(xí)題
第43章 進(jìn)程間通信簡介
43.1 IPC工具分類
43.2 通信工具
43.3 同步工具
43.4 IPC工具比較
43.5 總結(jié)
43.6 習(xí)題
第44章 管道和FIFO
44.1 概述
44.2 創(chuàng)建和使用管道
44.3 將管道作為一種進(jìn)程同步的方法
44.4 使用管道連接過濾器
44.5 通過管道與Shell命令進(jìn)行通信:popen
44.6 管道和stdio緩沖
44.7 FIFO
44.8 使用管道實(shí)現(xiàn)一個(gè)客戶端/服務(wù)器應(yīng)用程序
44.9 非阻塞I/O
44.10 管道和FIFO中read和write的語義
44.11 總結(jié)
44.12 習(xí)題
第45章 System V IPC介紹
45.1 概述
45.2 IPC Key
45.3 關(guān)聯(lián)數(shù)據(jù)結(jié)構(gòu)和對(duì)象權(quán)限
45.4 IPC標(biāo)識(shí)符和客戶端/服務(wù)器應(yīng)用程序
45.5 System V IPC get調(diào)用使用的算法
45.6 ipcs和ipcrm命令
45.7 獲取所有IPC對(duì)象列表
45.8 IPC限制
45.9 總結(jié)
45.10 習(xí)題
第46章 System V消息隊(duì)列
46.1 創(chuàng)建或打開一個(gè)消息隊(duì)列
46.2 交換消息
46.2.1 發(fā)送消息
46.2.2 接收消息
46.3 消息隊(duì)列控制操作
46.4 消息隊(duì)列關(guān)聯(lián)數(shù)據(jù)結(jié)構(gòu)
46.5 消息隊(duì)列的限制
46.6 顯示系統(tǒng)中所有消息隊(duì)列
46.7 使用消息隊(duì)列實(shí)現(xiàn)客戶端/服務(wù)器應(yīng)用程序
46.8 使用消息隊(duì)列實(shí)現(xiàn)文件服務(wù)器應(yīng)用程序
46.9 System V消息隊(duì)列的缺點(diǎn)
46.10 總結(jié)
46.11 習(xí)題
第47章 System V信號(hào)量
47.1 概述
47.2 創(chuàng)建或打開一個(gè)信號(hào)量集
47.3 信號(hào)量控制操作
47.4 信號(hào)量關(guān)聯(lián)數(shù)據(jù)結(jié)構(gòu)
47.5 信號(hào)量初始化
47.6 信號(hào)量操作
47.7 多個(gè)阻塞信號(hào)量操作的處理
47.8 信號(hào)量撤銷值
47.9 實(shí)現(xiàn)一個(gè)二元信號(hào)量協(xié)議
47.10 信號(hào)量限制
47.11 System V信號(hào)量的缺點(diǎn)
47.12 總結(jié)
47.13 習(xí)題
第48章 System V共享內(nèi)存
48.1 概述
48.2 創(chuàng)建或打開一個(gè)共享內(nèi)存段
48.3 使用共享內(nèi)存
48.4 示例:通過共享內(nèi)存?zhèn)鬏敂?shù)據(jù)
48.5 共享內(nèi)存在虛擬內(nèi)存中的位置
48.6 在共享內(nèi)存中存儲(chǔ)指針
48.7 共享內(nèi)存控制操作
48.8 共享內(nèi)存關(guān)聯(lián)數(shù)據(jù)結(jié)構(gòu)
48.9 共享內(nèi)存的限制
48.10 總結(jié)
48.11 習(xí)題
第49章 內(nèi)存映射
49.1 概述
49.2 創(chuàng)建一個(gè)映射:mmap
49.3 解除映射區(qū)域:munmap
49.4 文件映射
49.4.1 私有文件映射
49.4.2 共享文件映射
49.4.3 邊界情況
49.4.4 內(nèi)存保護(hù)和文件訪問模式交互
49.5 同步映射區(qū)域:msync
49.6 其他mmap標(biāo)記
49.7 匿名映射
49.8 重新映射一個(gè)映射區(qū)域:mremap
49.9 MAP_NORESERVE和過度利用交換空間
49.10 MAP_FIXED標(biāo)記
49.11 非線性映射:remap_file_pages
49.12 總結(jié)
49.13 習(xí)題
第50章 虛擬內(nèi)存操作
50.1 改變內(nèi)存保護(hù):mprotect
50.2 內(nèi)存鎖:mlock和mlockatt
50.3 確定內(nèi)存駐留性:mincore
50.4 建議后續(xù)的內(nèi)存使用模式:madvise
50.5 小結(jié)
50.6 習(xí)題
第51章 POSIX IPC介紹
51.1 API概述
51.2 System V IPC與POSIX IPC比較
51.3 總結(jié)
第52章 POSIX消息隊(duì)列
52.1 概述
52.2 打開、關(guān)閉和斷開鏈接消息隊(duì)列
52.3 描述符和消息隊(duì)列之間的關(guān)系
52.4 消息隊(duì)列特性
52.5 交換消息
52.5.1 發(fā)送消息
52.5.2 接收消息
52.5.3 在發(fā)送和接收消息時(shí)設(shè)置超時(shí)時(shí)間
52.6 消息通知
52.6.1 通過信號(hào)接收通知
52.6.2 通過線程接收通知
52.7 Linux特有的特性
52.8 消息隊(duì)列限制
52.9 POSIX和System V消息隊(duì)列比較
52.10 總結(jié)
52.11 習(xí)題
第53章 POSIX信號(hào)量
53.1 概述
53.2 命名信號(hào)量
53.2.1 打開一個(gè)命名信號(hào)量
53.2.2 關(guān)閉一個(gè)信號(hào)量
53.2.3 刪除一個(gè)命名信號(hào)量
53.3 信號(hào)量操作
53.3.1 等待一個(gè)信號(hào)量
53.3.2 發(fā)布一個(gè)信號(hào)量
53.3.3 獲取信號(hào)量的當(dāng)前值
53.4 未命名信號(hào)量
53.4.1 初始化一個(gè)未命名信號(hào)量
53.4.2 銷毀一個(gè)未命名信號(hào)量
53.5 與其他同步技術(shù)比較
53.6 信號(hào)量的限制
53.7 總結(jié)
53.8 習(xí)題
第54章 POSIX共享內(nèi)存
54.1 概述
54.2 創(chuàng)建共享內(nèi)存對(duì)象
54.3 使用共享內(nèi)存對(duì)象
54.4 刪除共享內(nèi)存對(duì)象
54.5 共享內(nèi)存APIs比較
54.6 總結(jié)
54.7 習(xí)題
第55章 文件加鎖
55.1 概述
55.2 使用flock給文件加鎖
55.2.1 鎖繼承與釋放的語義
55.2.2 flock的限制
55.3 使用fcntl給記錄加鎖
55.3.1 死鎖
55.3.2 示例:一個(gè)交互式加鎖程序
55.3.3 示例:一個(gè)加鎖函數(shù)庫
55.3.4 鎖的限制和性能
55.3.5 鎖繼承和釋放的語義
55.3.6 鎖定餓死和排隊(duì)加鎖請(qǐng)求的優(yōu)先級(jí)
55.4 強(qiáng)制加鎖
55.5 /proc/locks文件
55.6 僅運(yùn)行一個(gè)程序的單個(gè)實(shí)例
55.7 老式加鎖技術(shù)
55.8 總結(jié)
55.9 習(xí)題
第56章 SOCKET:介紹
56.1 概述
56.2 創(chuàng)建一個(gè)socket:socket
56.3 將socket綁定到地址:bind
56.4 通用socket地址結(jié)構(gòu):struct sockaddr
56.5 流socket
56.5.1 監(jiān)聽接入連接:listen
56.5.2 接受連接:accept
56.5.3 連接到對(duì)等socket:connect
56.5.4 流socket I/O
56.5.5 連接終止:close
56.6 數(shù)據(jù)報(bào)socket
56.6.1 交換數(shù)據(jù)報(bào):recvfrom和sendto
56.6.2 在數(shù)據(jù)報(bào)socket上使用connect
56.7 總結(jié)
第57章 SOCKET:UNIX DOMAIN
57.1 UNIX domain socket地址:struct sockaddr_un
57.2 UNIX domain中的流socket
57.3 UNIX domain中的數(shù)據(jù)報(bào)socket
57.4 UNIX domain socket權(quán)限
57.5 創(chuàng)建互聯(lián)socket對(duì):socketpair
57.6 Linux抽象socket名空間
57.7 總結(jié)
57.8 習(xí)題
第58章 SOCKET:TCP/IP網(wǎng)絡(luò)基礎(chǔ)
58.1 因特網(wǎng)
58.2 聯(lián)網(wǎng)協(xié)議和層
58.3 數(shù)據(jù)鏈路層
58.4 網(wǎng)絡(luò)層:IP
58.5 IP地址
58.6 傳輸層
58.6.1 端口號(hào)
58.6.2 用戶數(shù)據(jù)報(bào)協(xié)議(UDP)
58.6.3 傳輸控制協(xié)議(TCP)
58.7 請(qǐng)求注解(RFC)
58.8 總結(jié)
第59章 SOCKET:Internet DOMAIN
59.1 Internet domain socket
59.2 網(wǎng)絡(luò)字節(jié)序
59.3 數(shù)據(jù)表示
59.4 Internet socket地址
59.5 主機(jī)和服務(wù)轉(zhuǎn)換函數(shù)概述
59.6 inet_pton和inet_ntop函數(shù)
59.7 客戶端-服務(wù)器示例(數(shù)據(jù)報(bào)socket)
59.8 域名系統(tǒng)(DNS)
59.9 /etc/services文件
59.10 獨(dú)立于協(xié)議的主機(jī)和服務(wù)轉(zhuǎn)換
59.10.1 getaddrinfo函數(shù)
59.10.2 釋放addrinfo列表:freeaddrinfo
59.10.3 錯(cuò)誤診斷:gai_strerror
59.10.4 getnameinfo函數(shù)
59.11 客戶端-服務(wù)器示例(流式socket)
59.12 Internet domain socket庫
59.13 過時(shí)的主機(jī)和服務(wù)轉(zhuǎn)換API
59.13.1 inet_aton和inet_ntoa函數(shù)
59.13.2 gethostbyname和gethostbyaddr函數(shù)
59.13.3 getserverbyname和getserverbyport函數(shù)
59.14 UNIX與Internet domain socket比較
59.15 更多信息
59.16 總結(jié)
59.17 習(xí)題
第60章 SOCKET:服務(wù)器設(shè)計(jì)
60.1 迭代型和并發(fā)型服務(wù)器
60.2 迭代型UDP echo服務(wù)器
60.3 并發(fā)型TCP echo服務(wù)器
60.4 并發(fā)型服務(wù)器的其他設(shè)計(jì)方案
60.5 inetd(Internet超級(jí)服務(wù)器)守護(hù)進(jìn)程
60.6 總結(jié)
60.7 練習(xí)
第61章 SOCKET:高級(jí)主題
61.1 流式套接字上的部分讀和部分寫
61.2 shutdown系統(tǒng)調(diào)用
61.3 專用于套接字的I/O系統(tǒng)調(diào)用:recv和send
61.4 sendfile系統(tǒng)調(diào)用
61.5 獲取套接字地址
61.6 深入探討TCP協(xié)議
61.6.1 TCP報(bào)文的格式
61.6.2 TCP序列號(hào)和確認(rèn)機(jī)制
61.6.3 TCP協(xié)議狀態(tài)機(jī)以及狀態(tài)遷移圖
61.6.4 TCP連接的建立
61.6.5 TCP連接的終止
61.6.6 在TCP套接字上調(diào)用shutdown
61.6.7 TIME_WAIT狀態(tài)
61.7 監(jiān)視套接字:netstat
61.8 使用tcpdump來監(jiān)視TCP流量
61.9 套接字選項(xiàng)
61.10 SO_REUSEADDR套接字選項(xiàng)
61.11 在accept中繼承標(biāo)記和選項(xiàng)
61.12 TCP vs UDP
61.13 高級(jí)功能
61.13.1 帶外數(shù)據(jù)
61.13.2 sendmsg和recvmsg系統(tǒng)調(diào)用
61.13.3 傳遞文件描述符
61.13.4 接收發(fā)送端的憑據(jù)
61.13.5 順序數(shù)據(jù)包套接字
61.13.6 SCTP以及DCCP傳輸層協(xié)議
61.14 總結(jié)
61.15 練習(xí)
第62章 終端
62.1 整體概覽
62.2 獲取和修改終端屬性
62.3 stty命令
62.4 終端特殊字符
62.5 終端標(biāo)志
62.6 終端的I/O模式
62.6.1 規(guī)范模式
62.6.2 非規(guī)范模式
62.6.3 加工模式、cbreak模式以及原始模式
62.7 終端線速(比特率)
62.8 終端的行控制
62.9 終端窗口大小
62.10 終端標(biāo)識(shí)
62.11 總結(jié)
62.12 練習(xí)
第63章 其他備選的I/O模型
63.1 整體概覽
63.1.1 水平觸發(fā)和邊緣觸發(fā)
63.1.2 在備選的I/O模型中采用非阻塞I/O
63.2 I/O多路復(fù)用
63.2.1 select系統(tǒng)調(diào)用
63.2.2 poll系統(tǒng)調(diào)用
63.2.3 文件描述符何時(shí)就緒?
63.2.4 比較select和poll
63.2.5 select和poll存在的問題
63.3 信號(hào)驅(qū)動(dòng)I/O
63.3.1 何時(shí)發(fā)送"I/O就緒"信號(hào)
63.3.2 優(yōu)化信號(hào)驅(qū)動(dòng)I/O的使用
63.4 epoll編程接口
63.4.1 創(chuàng)建epoll實(shí)例:epoll_create
63.4.2 修改epoll的興趣列表:epoll_ctl
63.4.3 事件等待:epoll_wait
63.4.4 深入探究epoll的語義
63.4.5 epoll同I/O多路復(fù)用的性能對(duì)比
63.4.6 邊緣觸發(fā)通知
63.5 在信號(hào)和文件描述符上等待
63.5.1 pselect系統(tǒng)調(diào)用
63.5.2 self-pipe技巧
63.6 總結(jié)
63.7 練習(xí)
第64章 偽終端
64.1 整體概覽
64.2 UNIX98偽終端
64.2.1 打開未使用的主設(shè)備:posix_openpt
64.2.2 修改從設(shè)備屬主和權(quán)限:grantpt
64.2.3 解鎖從設(shè)備:unlockpt
64.2.4 獲取從設(shè)備名稱:ptsname
64.3 打開主設(shè)備:ptyMasterOpen
64.4 將進(jìn)程連接到偽終端:ptyFork
64.5 偽終端I/O
64.6 實(shí)現(xiàn)script(1)程序
64.7 終端屬性和窗口大小
64.8 BSD風(fēng)格的偽終端
64.9 總結(jié)
64.10 練習(xí)
附錄A 跟蹤系統(tǒng)調(diào)用
附錄B 解析命令行選項(xiàng)
附錄C 對(duì)NULL指針做轉(zhuǎn)型
附錄D 內(nèi)核配置
附錄E 更多信息源
附錄F 部分習(xí)題解答
更多建議: