UNIX環境高級編程
UNIX環境高級編程
本書是被譽為UNIX編程“聖經”的Advanced Programming in the UNIX Environment一書的更新版。在本書第1版出版后的十幾年中,UNIX行業已經有了巨大的變化,特別是影響UNIX編程介面的有關標準變化很大。本書在保持了前一版的風格的基礎上,根據最新的標準對內容進行了修訂和增補,反映了最新的技術發展。書中除了介紹UNIX文件和目錄、標準I/O庫、系統數據文件和信息、進程環境、進程式控制制、進程關係、信號、線程、線程式控制制、守護進程、各種I/O、進程間通信、網路IPC、偽終端等方面的內容,還在此基礎上介紹了多個應用示例,包括如何創建資料庫函數庫以及如何與網路印表機通信等。此外,還在附錄中給出了函數原型和部分習題的答案。
本書內容權威,概念清晰,闡述精闢,對於所有層次UNIX程序員都是一本不可或缺的參考書。
第1章 UNIX基礎知識 1
1.1 引言 1
1.2 UNIX體系結構 1
1.3 登錄 1
1.4 文件和目錄 3
1.5 輸入和輸出 6
1.6 程序和進程 8
1.7 出錯處理 10
1.8 用戶標識 12
1.9 信號 14
1.10 時間值 15
1.11 系統調用和庫函數 16
1.12 小結 17
習題 18
第2章 UNIX標準化及實現 19
2.1 引言 19
2.2 UNIX標準化 19
2.2.1 ISO C 19
2.2.2 IEEE POSIX 20
2.2.3 Single UNIX Specification 25
2.2.4 FIPS 26
2.3 UNIX系統實現 26
2.3.1 SVR4 26
2.3.2 4.4BSD 27
2.3.3 FreeBSD 27
2.3.4 Linux 27
2.3.5 Mac OS X 28
2.3.6 Solaris 28
2.3.7 其他UNIX系統 28
2.4 標準和實現的關係 28
2.5 限制 29
2.5.1 ISO C限制 29
2.5.2 POSIX限制 30
2.5.3 XSI限制 32
2.5.5 不確定的運行時限制 38
2.6 選項 42
2.7 功能測試宏 44
2.8 基本系統數據類型 45
2.9 標準之間的衝突 45
2.10 小結 46
習題 46
第3章 文件I/O 47
3.1 引言 47
3.2 文件描述符 47
3.3 open函數 48
3.4 creat函數 49
3.5 close函數 50
3.6 lseek函數 50
3.7 read函數 53
3.8 write函數 54
3.9 I/O的效率 54
3.10 文件共享 56
3.11 原子操作 59
3.12 dup和dup2函數 60
3.13 sync、fsync和fdatasync函數 61
3.14 fcntl函數 62
3.15 ioctl函數 66
3.16 /dev/fd 67
3.17 小結 68
習題 68
第4章 文件和目錄 71
4.1 引言 71
4.2 stat、fstat和lstat函數 71
4.3 文件類型 72
4.4 設置用戶ID和設置組ID 74
4.5 文件訪問許可權 75
4.6 新文件和目錄的所有權 77
4.7 access函數 77
4.8 umask函數 79
4.9 chmod和fchmod函數 81
4.10 粘住位 83
4.11 chown、fchown和lchown函數 84
4.12 文件長度 85
4.13 文件截短 86
4.14 文件系統 86
4.16 符號鏈接 91
4.17 symlink和readlink函數 94
4.18 文件的時間 94
4.19 utime函數 95
4.20 mkdir和rmdir函數 97
4.21 讀目錄 98
4.22 chdir、fchdir和getcwd函數 102
4.23 設備特殊文件 104
4.24 文件訪問許可權位小結 106
4.25 小結 106
習題 107
第5章 標準I/O庫 109
5.1 引言 109
5.2 流和FILE對象 109
5.3 標準輸入、標準輸出和標準出錯 110
5.4 緩衝 110
5.5 打開流 112
5.6 讀和寫流 114
5.7 每次一行I/O 116
5.8 標準I/O的效率 117
5.9 二進位I/O 119
5.10 定位流 120
5.11 格式化I/O 121
5.12 實現細節 125
5.13 臨時文件 127
5.14 標準I/O的替代軟體 130
5.15 小結 130
習題 130
第6章 系統數據文件和信息 133
6.1 引言 133
6.2 口令文件 133
6.3 陰影口令 136
6.4 組文件 137
6.5 附加組ID 138
6.6 實現的區別 139
6.7 其他數據文件 139
6.8 登錄賬戶記錄 140
6.9 系統標識 141
6.10 時間和日期常式 142
6.11 小結 146
習題 146
第7章 進程環境 147
7.1 引言 147
7.2 main函數 147
7.3 進程終止 147
7.4 命令行參數 151
7.5 環境表 152
7.6 C程序的存儲空間布局 152
7.7 共享庫 154
7.8 存儲器分配 154
7.9 環境變數 157
7.10 setjmp和longjmp函數 159
7.11 getrlimit和setrlimit函數 164
7.12 小結 168
習題 168
第8章 進程式控制制 171
8.1 引言 171
8.2 進程標識符 171
8.3 fork函數 172
8.4 vfork函數 176
8.5 exit函數 178
8.6 wait和waitpid函數 179
8.7 waitid函數 183
8.8 wait3和wait4函數 184
8.9 競爭條件 185
8.10 exec函數 188
8.11 更改用戶ID和組ID 192
8.12 解釋器文件 196
8.13 system函數 200
8.14 進程會計 203
8.15 用戶標識 208
8.16 進程時間 208
8.17 小結 210
習題 211
第9章 進程關係 213
9.1 引言 213
9.2 終端登錄 213
9.3 網路登錄 216
9.4 進程組 218
9.5 會話 219
9.6 控制終端 220
9.7 tcgetpgrp、tcsetpgrp和tcgetsid函數 221
9.8 作業控制 222
9.9 shell執行程序 225
9.10 孤兒進程組 228
9.11 FreeBSD實現 230
9.12 小結 231
習題 232
第10章 信號 233
10.1 引言 233
10.2 信號概念 233
10.3 signal函數 240
10.4 不可靠的信號 242
10.5 中斷的系統調用 244
10.6 可重入函數 246
10.7 SIGCLD語義 248
10.8 可靠信號術語和語義 250
10.9 kill和raise函數 251
10.10 alarm和pause函數 252
10.11 信號集 256
10.12 sigprocmask函數 258
10.13 sigpending函數 259
10.14 sigaction函數 261
10.15 sigsetjmp和siglongjmp函數 266
10.16 sigsuspend函數 268
10.17 abort函數 274
10.18 system函數 276
10.19 sleep函數 280
10.20 作業控制信號 282
10.21 其他特徵 284
10.22 小結 285
習題 285
第11章 線程 287
11.1 引言 287
11.2 線程概念 287
11.3 線程標識 288
11.4 線程的創建 288
11.5 線程終止 291
11.6 線程同步 297
11.7 小結 311
習題 311
第12章 線程式控制制 313
12.1 引言 313
12.2 線程限制 313
12.3 線程屬性 314
12.4 同步屬性 318
12.5 重入 324
12.6 線程私有數據 328
12.7 取消選項 331
12.8 線程和信號 333
12.9 線程和fork 336
12.10 線程和I/O 339
12.11 小結 340
習題 340
第13章 守護進程 341
13.1 引言 341
13.2 守護進程的特徵 341
13.3 編程規則 342
13.4 出錯記錄 345
13.5 單實例守護進程 348
13.6 守護進程的慣例 350
13.7 客戶進程-伺服器進程模型 354
13.8 小結 354
習題 354
第14章 高級I/O 355
14.1 引言 355
14.2 非阻塞I/O 355
14.3 記錄鎖 357
14.4 STREAMS 370
14.5 I/O多路轉接 379
14.5.1 select和pselect函數 381
14.5.2 poll函數 384
14.6 非同步I/O 386
14.6.1 系統V非同步I/O 386
14.6.2 BSD非同步I/O 387
14.7 readv和writev函數 387
14.8 readn和writen函數 389
14.9 存儲映射I/O 390
14.10 小結 395
習題 396
第15章 進程間通信 397
15.1 引言 397
15.2 管道 398
15.3 popen和pclose函數 403
15.4 協同進程 408
15.5 FIFO 412
15.6 XSI IPC 415
15.6.1 標識符和鍵 415
15.6.2 許可權結構 416
15.6.3 結構限制 417
15.6.4 優點和缺點 417
15.7 消息隊列 418
15.8 信號量 422
15.9 共享存儲 427
15.10 客戶進程-伺服器進程屬性 432
15.11 小結 434
習題 434
第16章 網路IPC:套接字 437
16.1 引言 437
16.2 套接字描述符 437
16.3 定址 439
16.3.1 位元組序 440
16.3.2 地址格式 441
16.3.3 地址查詢 442
16.3.4 將套接字與地址綁定 449
16.4 建立連接 450
16.5 數據傳輸 452
16.6 套接字選項 464
16.7 帶外數據 466
16.8 非阻塞和非同步I/O 467
16.9 小結 468
習題 468
第17章 高級進程間通信 469
17.1 引言 469
17.2 基於STREAMS的管道 469
17.2.1 命名的STREAMS管道 472
17.2.2 唯一連接 473
17.3 UNIX域套接字 476
17.3.1 命名UNIX域套接字 477
17.3.2 唯一連接 478
17.4 傳送文件描述符 482
17.4.1 經由基於STREAMS的管道傳送文件描述符 484
17.4.2 經由UNIX域套接字傳送文件描述符 486
17.5 open伺服器版本1 493
17.6 open伺服器版本2 498
17.7 小結 505
習題 505
第18章 終端I/O 507
18.1 引言 507
18.2 綜述 507
18.3 特殊輸入字元 512
18.4 獲得和設置終端屬性 516
18.5 終端選項標誌 516
18.6 stty命令 522
18.7 波特率函數 523
18.8 行控制函數 524
18.9 終端標識 524
18.10 規範模式 529
18.11 非規範模式 532
18.12 終端的窗口大小 537
18.13 termcap,terminfo和curses 539
18.14 小結 540
習題 540
第19章 偽終端 541
19.1 引言 541
19.2 概述 541
19.3 打開偽終端設備 544
19.3.1 基於STREAMS的偽終端 547
19.3.2 基於BSD的偽終端 549
19.3.3 基於Linux的偽終端 551
19.4 pty_fork函數 553
19.5 pty程序 555
19.6 使用pty程序 559
19.7 高級特性 564
19.8 小結 565
習題 565
第20章 資料庫函數庫 567
20.1 引言 567
20.2 歷史 567
20.3 函數庫 568
20.4 實現概述 569
20.5 集中式或非集中式 572
20.6 併發 574
20.7 構造函數庫 574
20.8 源代碼 575
20.9 性能 598
20.10 小結 600
習題 601
第21章 與網路印表機通信 603
21.1 引言 603
21.2 網路列印協議 603
21.3 超文本傳輸協議 605
21.4 列印假離線技術 605
21.5 源代碼 607
21.6 小結 644
習題 645
附錄A 函數原型 647
附錄B 其他源代碼 677
附錄C 部分習題答案 685
參考書目 709
索引 715
尤晉元,上海交通大學計算機科學及工程系教授、博士生導師。在科研方面,主要從事操作系統和分佈對象計算技術方面的研究;在教學方面,長期承擔操作系統及分佈計算等課程的教學工作。主編和翻譯了多本操作系統教材和參考書,包括《UNIX操作系統教程》、《UNIX高級編程技術》、《UNIX環境高級編程》和《操作系統:設計與實現》等。