《Linux/UNIX系統編程手冊》是2014年人民郵電出版社出版的圖書,作者是凱利斯克 (Michael Kerrisk)。
基本介紹
- 書名:Linux/UNIX系統編程手冊
- 又名:THPI
- 作者:凱利斯克 (Michael Kerrisk)
- 原版名稱:The Linux Programming Interface
- 譯者:孫劍、許從年、董健 (譯者)、孫余強
- ISBN:9787115328670
- 頁數:1176頁
- 定價:116.40
- 出版社:人民郵電出版社
- 出版時間:2014年1月1日
- 開本:16
內容簡介,作者簡介,目錄,
內容簡介
《Linux/UNIX系統編程手冊(上、下冊)》是介紹Linux與UNIX編程接口的權威著作。Linux編程資深專家Michael Kerrisk在書中詳細描述了Linux/UNIX系統編程所涉及的系統調用和庫函式,並輔之以全面而清晰的代碼示例。《Linux/UNIX系統編程手冊(上、下冊)》涵蓋了逾500個系統調用及庫函式,並給出逾200個程式示例,另含88張表格和115幅示意圖。
《Linux/UNIX系統編程手冊(上、下冊)》總共分為64章,主要講解了高效讀寫檔案,對信號、時鐘和定時器的運用,創建進程、執行程式,編寫安全的應用程式,運用POSIX執行緒技術編寫多執行緒程式,創建和使用共享庫,運用管道、訊息佇列、共享記憶體和信號量技術來進行進程間通信,以及運用套接字API編寫網路套用等內容。
《Linux/UNIX系統編程手冊(上、下冊)》在匯聚大批 Linux專有特性(epoll、inotify、/proc)的同時,還特意強化了對UNIX標準(POSIX、SUS)的論述,徹底達到了“魚與熊掌,二者得兼”的效果,這也堪稱本書的最大亮點。
《Linux/UNIX系統編程手冊(上、下冊)》布局合理,論述清晰,說理透徹,尤其是作者對示例代碼的構思巧妙,獨具匠心,仔細研讀定會受益良多。本書適合從事Linux/UNIX系統開發、運維工作的技術人員閱讀,同時也可作為高校計算機專業學生的參考研習資料。
《Linux/UNIX系統編程手冊(上、下冊)》在匯聚大批 Linux專有特性(epoll、inotify、/proc)的同時,還特意強化了對UNIX標準(POSIX、SUS)的論述,徹底達到了“魚與熊掌,二者得兼”的效果,這也堪稱本書的最大亮點。
《Linux/UNIX系統編程手冊(上、下冊)》布局合理,論述清晰,說理透徹,尤其是作者對示例代碼的構思巧妙,獨具匠心,仔細研讀定會受益良多。本書適合從事Linux/UNIX系統開發、運維工作的技術人員閱讀,同時也可作為高校計算機專業學生的參考研習資料。
作者簡介
凱利斯克 (Michael Kerrisk),全球頂尖的Linux核心黑客;具有20多年的UNIX系統使用和編程經驗;自2004年起,開始維護手冊頁項目(該項目旨在生成描述Linux核心以及glibc編程API的手冊頁);撰寫或合著了250多篇手冊頁;極參與對Linux核心/用戶空間接口的測試和設計評審工作。
目錄
第1章 歷史和標準 1
1.1 UNIX和C語言簡史 1
1.2 Linux簡史 4
1.2.1 GNU項目 4
1.2.2 Linux核心 5
1.3 標準化 8
1.3.1 C程式語言 8
1.3.2 首個POSIX標準 9
1.3.3 X/Open公司和TheOpenGroup 10
1.3.4 SUSv3和POSIX.1—2001 10
1.3.5 SUSv4和POSIX.1—2008 12
1.3.6 UNIX標準時間表 12
1.3.7 實現標準 14
1.3.8 Linux、標準、Linux標準規範(LinuxStandardBase) 14
1.4 總結 15
第2章 基本概念 17
2.1 作業系統的核心—核心 17
2.2 shell 19
2.3 用戶和組 20
2.4 單根目錄層級、目錄、連結及檔案 21
2.5 檔案I/O模型 23
2.6 程式 24
2.7 進程 25
2.8 記憶體映射 27
2.9 靜態庫和共享庫 28
2.10 進程間通信及同步 28
2.11 信號 29
2.12 執行緒 30
2.13 進程組和shell任務控制 30
2.14 會話、控制終端和控制進程 30
2.15 偽終端 31
2.16 日期和時間 31
2.17 客戶端伺服器架構 32
2.18 實時性 32
2.19 proc檔案系統 33
2.20 總結 33
第3章 系統編程概念 34
3.1 系統調用 34
3.2 庫函式 36
3.3 標準C語言函式館;GNUC語言函式館(glibc) 37
3.4 處理來自系統調用和庫函式的錯誤 38
3.5 關於本書示例程式的注意事項 40
3.5.1 命令行選項及參數 40
3.5.2 常用的函式及頭檔案 40
3.6 可移植性問題 49
3.6.1 特性測試宏 49
3.6.2 系統數據類型 51
3.6.3 其他的可移植性問題 53
3.7 總結 54
3.8 練習 55
第4章 檔案I/O:通用的I/O模型 56
4.1 概述 56
4.2 通用I/O 58
4.3 打開一個檔案:open() 58
4.3.1 open()調用中的flags參數 60
4.3.2 open()函式的錯誤 63
4.3.3 creat()系統調用 64
4.4 讀取檔案內容:read() 64
4.5 數據寫入檔案:write() 65
4.6 關閉檔案:close() 66
4.7 改變檔案偏移量:lseek() 66
4.8 通用I/O模型以外的操作:ioctl() 70
4.9 總結 71
4.10 練習 71
第5章 深入探究檔案I/O 72
5.1 原子操作和競爭條件 72
5.2 檔案控制操作:fcntl() 75
5.3 打開檔案的狀態標誌 75
5.4 檔案描述符和打開檔案之間的關係 76
5.5 複製檔案描述符 78
5.6 在檔案特定偏移量處的I/O:pread()和pwrite() 80
5.7 分散輸入和集中輸出(Scatter—GatherI/O):readv()和writev() 81
5.8 截斷檔案:truncate()和ftruncate()系統調用 84
5.9 非阻塞I/O 84
5.10 大檔案I/O 85
5.11 /dev/fd目錄 88
5.12 創建臨時檔案 88
5.13 總結 90
5.14 練習 90
第6章 進程 92
6.1 進程和程式 92
6.2 進程號和父進程號 93
6.3 進程記憶體布局 94
6.4 虛擬記憶體管理 97
6.5 棧和棧幀 99
6.6 命令行參數(argc,argv) 99
6.7 環境列表 101
6.8 執行非局部跳轉:setjmp()和longjmp() 106
6.9 總結 111
6.9 練習 112
第7章 記憶體分配 113
7.1 在堆上分配記憶體 113
7.1.1 調整programbreak:brk()和sbrk() 113
7.1.2 在堆上分配記憶體:malloc()和free() 114
7.1.3 malloc()和free()的實現 117
7.1.4 在堆上分配記憶體的其他方法 120
7.2 在堆疊上分配記憶體:alloca() 122
7.3 總結 123
7.4 練習 123
第8章 用戶和組 124
8.1 密碼檔案:/etc/passwd 124
8.2 shadow密碼檔案:/etc/shadow 125
8.3 組檔案:/etc/group 126
8.4 獲取用戶和組的信息 127
8.5 密碼加密和用戶認證 132
8.6 總結 135
8.7 練習 135
第9章 進程憑證 136
9.1 實際用戶ID和實際組ID 136
9.2 有效用戶ID和有效組ID 136
9.3 Set—User—ID和Set—Group—ID程式 137
9.4 保存set—user—ID和保存set—group—ID 138
9.5 檔案系統用戶ID和組ID 139
9.6 輔助組ID 140
9.7 獲取和修改進程憑證 140
9.7.1 獲取和修改實際、有效和保存設定標識 140
9.7.2 獲取和修改檔案系統ID 145
9.7.3 獲取和修改輔助組ID 145
9.7.4 修改進程憑證的系統調用總結 146
9.7.5 示例:顯示進程憑證 148
9.8 總結 149
9.9 習題 150
第10章 時間 151
10.1 日曆時間(CalendarTime) 151
10.2 時間轉換函式 153
10.2.1 將time_t轉換為可列印格式 153
10.2.2 time_t和分解時間之間的轉換 154
10.2.3 分解時間和列印格式之間的轉換 155
10.3 時區 161
10.4 地區(Locale) 163
10.5 更新系統時鐘 167
10.6 軟體時鐘(jiffies) 168
10.7 進程時間 168
10.8 總結 171
10.9 練習 172
第11章 系統限制和選項 173
11.1 系統限制 174
11.2 在運行時獲取系統限制(和選項) 176
11.3 運行時獲取與檔案相關的限制(和選項) 178
11.4 不確定的限制 179
11.5 系統選項 180
11.6 總結 181
11.7 練習 182
第12章 系統和進程信息 183
12.1 /proc檔案系統 183
12.1.1 獲取與進程有關的信息:/proc/PID 183
12.1.2 /proc目錄下的系統信息 185
12.1.3 訪問/proc檔案 186
12.2 系統標識:uname() 188
12.3 總結 190
12.4 練習 190
第13章 檔案I/O緩衝 191
13.1 檔案I/O的核心緩衝:緩衝區高速快取 191
13.2 stdio庫的緩衝 194
13.3 控制檔案I/O的核心緩衝 196
13.4 I/O緩衝小結 200
13.5 就I/O模式向核心提出建議 201
13.6 繞過緩衝區高速快取:直接I/O 202
13.7 混合使用庫函式和系統調用進行檔案I/O 204
13.8 總結 205
13.9 練習 205
第14章 系統編程概念 207
14.1 設備專用檔案(設備檔案) 207
14.2 磁碟和分區 208
14.3 檔案系統 209
14.4 i節點 211
14.5 虛擬檔案系統(VFS) 213
14.6 日誌檔案系統 214
14.7 單根目錄層級和掛載點 215
14.8 檔案系統的掛載和卸載 216
14.8.1 掛載檔案系統:mount() 217
14.8.2 卸載檔案系統:umount()和umount2() 222
14.9 高級掛載特性 223
14.9.1 在多個掛載點掛載檔案系統 224
14.9.2 多次掛載同一掛載點 224
14.9.3 基於每次掛載的掛載標誌 225
14.9.4 綁定掛載 225
14.9.5 遞歸綁定掛載 226
14.10 虛擬記憶體檔案系統:tmpfs 227
14.11 獲得與檔案系統有關的信息:statvfs() 228
14.12 總結 229
14.13 練習 230
第15章 檔案屬性 231
15.1 獲取檔案信息:stat() 231
15.2 檔案時間戳 236
15.2.1 使用utime()和utimes()來改變檔案時間戳 238
15.2.2 使用utimensat()和futimens()改變檔案時間戳 239
15.3 檔案屬主 241
15.3.1 新建檔案的屬主 241
15.3.2 改變檔案屬主:chown()、fchown()和lchown() 241
15.4 檔案許可權 244
15.4.1 普通檔案的許可權 244
15.4.2 目錄許可權 246
15.4.3 許可權檢查算法 246
15.4.4 檢查對檔案的訪問許可權:access() 248
15.4.5 Set—User—ID、Set—Group—ID和Sticky位 249
15.4.6 進程的檔案模式創建掩碼:umask() 249
15.4.7 更改檔案許可權:chmod()和fchmod() 251
15.5 I節點標誌(ext2擴展檔案屬性) 252
15.6 總結 256
15.7 練習 256
第16章 擴展屬性 258
16.1 概述 258
16.2 擴展屬性的實現細節 260
16.3 操控擴展屬性的系統調用 260
16.4 總結 264
16.5 練習 264
第17章 訪問控制列表 265
17.1 概述 265
17.2 ACL許可權檢查算法 267
17.3 ACL的長、短文本格式 268
17.4 ACL_mask型ACE和ACL組分類 269
17.5 getfacl和setfacl命令 270
17.6 默認ACL與檔案創建 271
17.7 ACL在實現方面的限制 272
17.8 ACLAPI 273
17.9 總結 280
17.10 練習 280
第18章 目錄與連結 281
18.1 目錄和(硬)連結 281
18.2 符號(軟)連結 283
18.3 創建和移除(硬)連結:link()和unlink() 286
18.4 更改檔案名稱:rename() 289
18.5 使用符號連結:symlink()和readlink() 290
18.6 創建和移除目錄:mkdir()和rmdir() 291
18.7 移除一個檔案或目錄:remove() 292
18.8 讀目錄:opendir()和readdir() 292
18.9 檔案樹遍歷:nftw() 297
18.10 進程的當前工作目錄 301
18.11 針對目錄檔案描述符的相關操作 303
18.12 改變進程的根目錄:chroot() 304
18.13 解析路徑名:realpath() 306
18.14 解析路徑名字元串:dirname()和basename() 307
18.15 總結 309
18.16 練習 309
第19章 監控檔案事件 311
19.1 概述 311
19.2 inotifyAPI 312
19.3 inotify事件 313
19.4 讀取inotify事件 315
19.5 佇列限制和/proc檔案 319
19.6 監控檔案的舊有系統:dnotify 320
19.7 總結 320
19.8 練習 320
第20章 信號:基本概念 321
20.1 概念和概述 321
20.2 信號類型和默認行為 323
20.3 改變信號處置:signal() 329
20.4 信號處理器簡介 330
20.5 傳送信號:kill() 333
20.6 檢查進程的存在 334
20.7 傳送信號的其他方式:raise()和killpg() 335
20.8 顯示信號描述 336
20.9 信號集 337
20.10 信號掩碼(阻塞信號傳遞) 339
20.11 處於等待狀態的信號 341
20.12 不對信號進行排隊處理 341
20.13 改變信號處置:sigaction() 345
20.14 等待信號:pause() 346
20.15 總結 347
20.16 練習 347
第21章 信號:信號處理器函式 348
21.1 設計信號處理器函式 348
21.1.1 再論信號的非佇列化處理 348
21.1.2 可重入函式和異步信號安全函式 349
21.1.3 全局變數和sig_atomic_t數據類型 353
21.2 終止信號處理器函式的其他方法 354
21.2.1 在信號處理器函式中執行非本地跳轉 354
21.2.2 異常終止進程:abort() 358
21.3 在備選棧中處理信號:sigaltstack() 358
21.4 SA_SIGINFO標誌 361
21.5 系統調用的中斷和重啟 366
21.6 總結 368
21.7 練習 369
第22章 信號:高級特性 370
22.1 核心轉儲檔案 370
22.2 傳遞、處置及處理的特殊情況 372
22.3 可中斷和不可中斷的進程睡眠狀態 373
22.4 硬體產生的信號 374
22.5 信號的同步生成和異步生成 374
22.6 信號傳遞的時機與順序 375
22.7 signal()的實現及可移植性 376
22.8 實時信號 378
22.8.1 傳送實時信號 379
22.8.2 處理實時信號 380
22.9 使用掩碼來等待信號:sigsuspend() 384
22.10 以同步方式等待信號 387
22.11 通過檔案描述符來獲取信號 390
22.12 利用信號進行進程間通信 393
22.13 早期的信號API(SystemV和BSD) 393
22.14 總結 395
22.15 練習 396
……
第23章 定時器與休眠 397
第24章 進程的創建 425
第25章 進程的終止 440
第26章 監控子進程 447
第27章 程式的執行 465
第28章 詳述進程創建和程式執行 487
第29章 執行緒:介紹 509
第30章 執行緒:執行緒同步 521
第31章 執行緒:執行緒安全和每執行緒存儲 539
第32章 執行緒:執行緒取消 552
第33章 執行緒:更多細節 561
……
《Linux/UNIX系統編程手冊(下冊)》