Linux 環境編程 : 從應用到內核 Linux环境编程:从应用到内核

高峰, 李彬

  • 出版商: 機械工業
  • 出版日期: 2016-06-01
  • 定價: $594
  • 售價: 8.5$505
  • 語言: 簡體中文
  • 頁數: 596
  • 裝訂: 平裝
  • ISBN: 711153610X
  • ISBN-13: 9787111536109
  • 相關分類: Linux
  • 無法訂購

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

商品描述

<內容簡介>

本書將按照APUE的脈絡,以筆者多年的Linux開發經驗為基礎,從以下四個方面深入講解Linux環境編程:接口的功能使用介紹、接口缺陷分析、接口的內部實現機制、接口的錯誤碼分析。本書將從一個全新的角度帶領讀者重新進入Linux環境編程,從應用出發,深入內核源碼,研究Linux各接口的工作機制和原理。讓讀者不僅知其然,還知其所以然。

<目錄>
前言
第0章基礎知識1
0.1一個Linux程序的誕生記1
0.2程序的構成2
0.3程序是如何“跑”的4
0.4背景概念介紹5
0.4.1系統調用5
0.4.2C庫函數6
0.4.3線程安全7
0.4.4原子性9
0.4.5可重入函數9
0.4.6阻塞與非阻塞11
0.4.7同步與異步11
第1章文件I/O12
1.1Linux中的文件12
1.1.1文件、文件描述符和文件表12
1.1.2內核文件表的實現13
1.2打開文件14
1.2.1open介紹14
1.2.2更多選項15
1.2.3open源碼跟蹤16
1.2.4如何選擇文件描述符17
1.2.5文件描述符fd與文件管理結構file18
1.3creat簡介19
1.4關閉文件19
1.4.1close介紹19
1.4.2close源碼跟蹤19
1.4.3自定義files_operations21
1.4.4遺忘close造成的問題22
1.4.5如何查找文件資源洩漏25
1.5文件偏移26
1.5.1lseek簡介26
1.5.2小心lseek的返回值26
1.5.3lseek源碼分析27
1.6讀取文件29
1.6.1read源碼跟蹤29
1.6.2部分讀取30
1.7寫入文件31
1.7.1write源碼跟蹤31
1.7.2追加寫的實現33
1.8文件的原子讀寫33
1.9文件描述符的複制34
1.10文件數據的同步38
1.11文件的元數據41
1.11.1獲取文件的元數據41
1.11 .2內核如何維護文件的元數據42
1.11.3權限位解析43
1.12文件截斷45
1.12.1truncate與ftruncate的簡單介紹45
1.12.2文件截斷的內核實現45
1.12.3為什麼需要文件截斷48
第2章標準I/O庫50
2.1stdin、stdout和stderr50
2.2I/O緩存引出的趣題51
2.3fopen和open標誌位對比52
2.4fdopen與fileno55
2.5同時讀寫的痛苦56
2.6ferror的返回值57
2.7clearerr的用途57
2.8小心fgetc和getc60
2.9註意fread和fwrite的返回值60
2.10創建臨時文件61
第3章進程環境66
3.1main是C程序的開始嗎66
3.2“活雷鋒”exit70
3.3atexit介紹75
3.3.1使用atexit75
3.3.2atexit的局限性76
3.3.3atexit的實現機制77
3.4小心使用環境變量78
3.5使用動態庫80
3.5.1動態庫與靜態庫80
3.5.2編譯生成和使用動態庫80
3.5.3程序的“平滑無縫”升級82
3.6避免內存問題84
3.6.1尷尬的realloc84
3.6.2如何防止內存越界85
3.6.3如何定位內存問題86
3.7“長跳轉”longjmp90
3.7.1setjmp與longjmp的使用90
3.7 .2“長跳轉”的實現機制91
3.7.3“長跳轉”的陷阱93
第4章進程控制:進程的一生96
4.1進程ID96
4.2進程的層次98
4.2.1進程組99
4.2.2會話102
4.3進程的創建之fork()103
4.3.1fork之後父子進程的內存關係104
4.3.2fork之後父子進程與文件的關係107
4.3.3文件描述符複製的內核實現110
4.4進程的創建之vfork() 115
4.5daemon進程的創建117
4.6進程的終止119
4.6.1_exit函數119
4.6.2exit函數120
4.6.3return退出122
4.7等待子進程122
4.7.1殭屍進程122
4.7.2等待子進程之wait()124
4.7 .3等待子進程之waitpid()126
4.7.4等待子進程之等待狀態值129
4.7.5等待子進程之waitid()131
4.7.6進程退出和等待的內核實現133
4.8exec家族141
4.8.1execve函數141
4.8.2exec家族142
4.8.3execve系統調用的內核實現144
4.8.4exec與信號151
4.8.5執行exec之後進程繼承的屬性152
4.9system函數152
4.9.1system函數接口153
4.9.2system函數與信號156
4.10總結157
第5章進程控制:狀態、調度和優先級158
5.1進程的狀態158
5.1.1進程狀態概述159
5.1.2觀察進程狀態171
5.2進程調度概述173
5.3普通進程的優先級181
5.4完全公平調度的實現186
5.4.1時間片和虛擬運行時間186
5.4.2週期性調度任務190
5.4.3新進程的加入192
5.4.4睡眠進程醒來198
5.4.5喚醒搶占202
5.5普通進程的組調度204
5.6實時進程207
5.6.1實時調度策略和優先級207
5.6.2實時調度相關API211
5.6.3限制實時進程運行時間213
5.7CPU的親和力214
第6章信號219
6.1信號的完整生命週期219
6.2信號的產生220
6.2.1硬件異常220
6.2.2終端相關的信號221
6.2.3軟件事件相關的信號223
6.3信號的默認處理函數224
6.4信號的分類227
6.5傳統信號的特點228
6.5.1信號的ONESHOT特性230
6.5.2信號執行時屏蔽自身的特性232
6.5.3信號中斷系統調用的重啟特性233
6.6信號的可靠性236
6.6.1信號的可靠性實驗236
6.6.2信號可靠性差異的根源240
6.7信號的安裝243
6.8信號的發送246
6.8.1kill、tkill和tgkill246
6.8.2raise函數247
6.8.3sigqueue函數247
6.9信號與線程的關係253
6.9.1線程之間共享信號處理函數254
6.9.2線程有獨立的阻塞信號掩碼255
6.9.3私有掛起信號和共享掛起信號257
6.9.4致命信號下,進程組全體退出260
6.10等待信號260
6.10.1pause函數261
6.10.2sigsuspend函數262
6.10.3sigwait函數和sigwaitinfo函數263
6.11通過文件描述符來獲取信號265
6.12信號遞送的順序267
6.13異步信號安全272
6.14總結275
第7章理解Linux線程(1)276
7.1線程與進程276
7.2進程ID和線程ID281
7.3pthread庫接口介紹284
7.4線程的創建和標識285
7.4.1pthread_create函數285
7.4.2線程ID及進程地址空間佈局286
7.4.3線程創建的默認屬性291
7.5線程的退出292
7.6線程的連接與分離293
7.6.1線程的連接293
7.6.2為什麼要連接退出的線程295
7.6.3線程的分離299
7.7互斥量300
7.7.1為什麼需要互斥量300
7.7.2互斥量的接口304
7.7.3臨界區的大小305
7.7.4互斥量的性能306
7.7.5互斥鎖的公平性310
7.7.6互斥鎖的類型311
7.7.7死鎖和活鎖314
7.8讀寫鎖316
7.8.1讀寫鎖的接口317
7.8.2讀寫鎖的競爭策略318
7.8.3讀寫鎖總結323
7.9性能殺手:偽共享323
7.10條件等待328
7.10.1條件變量的創建和銷毀328
7.10.2條件變量的使用329
第8章理解Linux線程(2)333
8.1線程取消333
8.1.1函數取消接口333
8.1.2線程清理函數335
8.2線程局部存儲339
8.2.1使用NPTL庫函數實現線程局部存儲340
8.2.2使用_ _thread關鍵字實現線程局部存儲342
8.3線程與信號343
8.3.1設置線程的信號掩碼344
8.3.2向線程發送信號344
8.3.3多線程程序對信號的處理345
8.4多線程與fork()345
第9章進程間通信:管道349
9.1管道351
9.1.1管道概述351
9.1.2管道接口352
9.1.3關閉未使用的管道文件描述符356
9.1.4管道對應的內存區大小361
9.1.5shell管道的實現361
9.1.6與shell命令進行通信(popen)362
9.2命名管道FIFO365
9.2.1創建FIFO文件365
9.2.2打開FIFO文件366
9.3讀寫管道文件367
9.4使用管道通信的示例372
第10章進程間通信:SystemVIPC375
10.1SystemVIPC概述375
10.1.1標識符與IPCKey376
10.1.2IPC的公共數據結構379
10.2SystemV消息隊列383
10.2.1創建或打開一個消息隊列383
10.2.2發送消息385
10.2.3接收消息388
10.2.4控制消息隊列390
10.3SystemV信號量391
10.3.1信號量概述391
10.3.2創建或打開信號量393
10.3.3操作信號量395
10.3.4信號量撤銷值399
10.3.5控制信號量400
10.4SystemV共享內存402
10.4.1共享內存概述402
10.4.2創建或打開共享內存403
10.4.3使用共享內存405
10.4.4分離共享內存407
10.4.5控制共享內存408
第11章進程間通信:POSIXIPC410
11.1POSIXIPC概述411
11.1.1IPC對象的名字411
11.1.2創建或打開IPC對象413
11.1.3關閉和刪除IPC對象414
11.1.4其他414
11.2POSIX消息隊列415
11.2.1消息隊列的創建、打開、關閉及刪除415
11.2.2消息隊列的屬性418
11.2.3消息的發送和接收422
11.2.4消息的通知423
11.2.5I/O多路復用監控消息隊列427
11.3POSIX信號量428
11.3.1創建、打開、關閉和刪除有名信號量430
11.3.2信號量的使用431
11.3.3無名信號量的創建和銷毀432
11.3.4信號量與futex433
11.4內存映射mmap436
11.4.1內存映射概述436
11.4.2內存映射的相關接口438
11.4.3共享文件映射439
11.4.4私有文件映射455
11.4.5共享匿名映射455
11.4.6私有匿名映射456
11.5POSIX共享內存456
11.5.1共享內存的創建、使用和刪除457
11.5.2共享內存與tmpfs458
第12章網絡通信:連接的建立462
12.1socket文件描述符462
12.2綁定IP地址463
12.2.1bind的使用464
12.2.2bind的源碼分析465
12.3客戶端連接過程468
12.3. 1connect的使用468
12.3.2connect的源碼分析469
12.4服務器端連接過程477
12.4.1listen的使用477
12.4.2listen的源碼分析478
12.4.3accept的使用480
12.4.4accept的源碼分析480
12.5TCP三次握手的實現分析483
12.5.1SYN包的發送483
12.5.2接收SYN包,發送SYN+ACK包485
12.5.3接收SYN+ACK數據包494
12.5.4接收ACK數據包,完成三次握手499
第13章網絡通信:數據報文的發送505
13.1發送相關接口505
13.2數據包從用戶空間到內核空間的流程506
13.3UDP數據包的發送流程510
13.4TCP數據包的發送流程517
13.5IP數據包的發送流程527
13.5.1ip_send_skb源碼分析528
13.5.2ip_queue_xmit源碼分析531
13.6底層模塊數據包的發送流程532
第14章網絡通信:數據報文的接收536
14.1系統調用接口536
14.2數據包從內核空間到用戶空間的流程537
14.3UDP數據包的接收流程540
14.4TCP數據包的接收流程544
14.5TCP套接字的三個接收隊列553
14.6從網卡到套接字556
14.6.1從硬中斷到軟中斷556
14.6.2軟中斷處理557
14.6. 3傳遞給協議棧流程559
14.6.4IP協議處理流程564
14.6.5大師的錯誤?原始套接字的接收568
14.6.6註冊傳輸層協議571
14.6.7確定UDP套接字571
14.6.8確定TCP套接字576
第15章編寫安全無錯代碼582
15.1不要用memcmp比較結構體582
15.2有符號數和無符號數的移位區別583
15.3數組和指針584
15.4再論數組首地址587
15.5“神奇”的整數類型轉換588
15.6小心volatile的原子性誤解589
15.7有趣的問題:“x= =x”何時為假?591
15.8小心浮點陷阱593
15.8.1浮點數的精度限制593
15.8.2兩個特殊的浮點值593
15.9Intel移位指令陷阱595