本书一共21章。第1、2章分别介绍了UNIX系统和UNIX标准化的一些内容。第3~6章介绍了文件I/O、文件和目录、标准I/O库、系统数据文件和信息。第7~10章介绍了进程相关事项,包括进程环境、进程控制、进程关系,以及进程如何处理信号。第11、12章介绍了线程的内容,包括线程本身及线程控制的策略。第13章介绍了守护进程。第14章介绍了高级I/O。第15~17章专门介绍了IPC的各种细节,包括传统的IPC、网络IPC和高级IPC。第18、19章对终端概念进行了介绍,包括终端I/O和伪终端。第20、21章用两个“长示例”将前述章节介绍的知识串联起来,分别是一个数据库示例和一个与网络打印机通信的示例。本书适合对UNIX/Linux有一定使用经验或者编程经验的读者,有C语言基础的读者,从事UNIX/Linux应用软件开发的读者或者对此感兴趣的读者。
1 UNIX系统概述 1
1.1 引言 1
1.2 UNIX系统架构 1
1.3 登录 2
1.4 文件和目录 4
1.5 输入和输出 8
1.6 程序和进程 11
1.7 错误处理 14
1.8 用户标识 16
1.9 信号 18
1.10 时间值 20
1.11 系统调用和库函数 21
1.12 小结 23
2 UNIX标准与实现 24
2.1 引言 24
2.2 UNIX标准化 24
2.2.1 ISO C 24
2.2.2 IEEE POSIX 26
2.2.3 Single UNIX Specification 31
2.2.4 FIPS 32
2.3 UNIX系统实现 33
2.3.1 SVR4 33
2.3.2 4.4BSD 34
2.3.3 FreeBSD 34
2.3.4 Linux 35
2.3.5 Mac OS X 35
2.3.6 Solaris 35
2.3.7 其他UNIX系统 36
2.4 UNIX标准和实现的关系 36
2.5 限制 36
2.5.1 ISO C限制 37
2.5.2 POSIX限制 39
2.5.3 XSI限制 41
2.5.4 sysconf、pathconf和fpathconf函数 42
2.5.5 不确定的运行时限制 49
2.6 选项 53
2.7 功能测试宏 57
2.8 基本系统数据类型 58
2.9 标准之间的冲突 59
2.10 小结 60
3 文件I/O 61
3.1 引言 61
3.2 文件描述符 61
3.3 open和openat函数 62
3.4 create函数 66
3.5 close函数 66
3.6 lseek函数 67
3.7 read函数 71
3.8 write函数 72
3.9 I/O的效率 73
3.10 文件共享 75
3.11 原子操作 78
3.12 dup和dup2函数 80
3.13 sync、fsync和fdatasync函数 81
3.14 fcntl函数 82
3.15 ioctl函数 88
3.16 /dev/fd 89
3.17 小结 90
4 文件和目录 92
4.1 引言 92
4.2 stat、fstat、fstatat和lstat函数 92
4.3 文件类型 94
4.4 设置用户ID和设置组ID 97
4.5 文件访问权限 98
4.6 新文件和目录的所有权 100
4.7 access和faccessat函数 101
4.8 umask函数 103
4.9 chmod、fchmod和fchmodat函数 105
4.10 粘着位 108
4.11 chown、fchown、fchownat和lchown函数 109
4.12 文件长度 110
4.13 文件截断 112
4.14 文件系统 112
4.15 link、linkat、unlink、unlinkat和remove函数 115
4.16 rename和renameat函数 118
4.17 符号链接 119
4.18 创建和读取符号链接 123
4.19 文件的时间 123
4.20 futimens、utimensat和utimes函数 125
4.21 mkdir、mkdirat和rmdir函数 128
4.22 读目录 130
4.23 chdir、fchdir和getcwd函数 134
4.24 设备特殊文件 137
4.25 文件访问权限位 139
4.26 小结 140
5 标准I/O库 142
5.1 引言 142
5.2 流和FILE对象 142
5.3 标准输入、标准输出和标准错误 144
5.4 缓冲 144
5.5 打开流 147
5.6 读流和写流 149
5.7 每次一行I/O 151
5.8 标准I/O的效率 153
5.9 二进制I/O 155
5.10 定位流 156
5.11 格式化I/O 158
5.12 实现细节 162
5.13 临时文件 166
5.14 内存流 170
5.15 标准I/O的替代软件 173
5.16 小结 173
6 系统数据文件和信息 175
6.1 序言 175
6.2 口令文件 175
6.3 阴影口令 179
6.4 组文件 180
6.5 补充组ID 182
6.6 各个实现的差异 183
6.7 其他数据文件 184
6.8 登录记账 185
6.9 系统标识 186
6.10 时间和日期例程 187
6.11 小结 194
7 进程环境 196
7.1 引言 196
7.2 main函数 196
7.3 进程终止 197
7.4 命令行参数 201
7.5 环境列表 202
7.6 C程序的内存布局 203
7.7 共享库 205
7.8 内存申请 205
7.9 环境变量 209
7.10 setjmp和longjmp函数 212
7.11 getrlimit和setrlimit函数 218
7.12 小结 223
8 进程控制 225
8.1 引言 225
8.2 进程标识符 225
8.3 fork函数 226
8.4 vfork函数 232
8.5 exit函数 234
8.6 wait和waitpid函数 236
8.7 waitid函数 241
8.8 wait3和wait4函数 242
8.9 竞态条件 243
8.10 exec函数 247
8.11 更改用户ID和用户组ID 253
8.12 解释器脚本文件 258
8.13 system函数 262
8.14 进程记账 267
8.15 用户标识 273
8.16 进程调度 274
8.17 进程时间 277
8.18 小结 280
9 进程关系 282
9.1 序言 282
9.2 终端登录 282
9.3 网络登录 287
9.4 进程组 290
9.5 会话 292
9.6 控制终端 293
9.7 tcgetpgrp、tcsetpgrp和tcgetsid函数 295
9.8 作业控制 296
9.9 shell执行程序 300
9.10 孤儿进程组 304
9.11 FreeBSD实现 306
9.12 小结 309
10 信号 310
10.1 序言 310
10.2 信号的概念 310
10.3 signal函数 320
10.4 不可靠信号 324
10.5 中断的系统调用 325
10.6 可重入函数 328
10.7 SIGCLD语义 330
10.8 可靠信号的术语和语义 333
10.9 kill和raise函数 334
10.10 alarm和pause函数 335
10.11 信号集 341
10.12 sigprocmask函数 343
10.13 sigpending函数 345
10.14 sigaction函数 347
10.15 sigsetjmp和siglongjmp函数 353
10.16 sigsuspend函数 356
10.17 abort函数 363
10.18 system函数 365
10.19 sleep、nanosleep和clock_nanosleep函数 371
10.20 sigqueue函数 374
10.21 作业控制信号 375
10.22 信号名和编号 377
10.23 小结 379
11 线程 381
11.1 序言 381
11.2 线程的概念 381
11.3 线程标识 382
11.4 线程创建 384
11.5 线程终止 386
11.6 线程同步 394
11.6.1 互斥量 397
11.6.2 避免死锁 399
11.6.3 pthread_mutex_timedlock函数 405
11.6.4 读写锁 406
11.6.5 带有超时的读写锁 410
11.6.6 条件变量 411
11.6.7 自旋锁 414
11.6.8 屏障 416
11.7 小结 419
12 线程控制 421
12.1 引言 421
12.2 线程限制 421
12.3 线程属性 422
12.4 同步属性 426
12.4.1 互斥锁属性 426
12.4.2 读写锁属性 435
12.4.3 条件变量属性 436
12.4.4 屏障属性 437
12.5 重入 437
12.6 线程特定数据 442
12.7 取消选项 446
12.8 线程和信号 448
12.9 线程和fork 452
12.10 线程和I/O 456
12.11 小结 457
13 守护进程 458
13.1 引言 458
13.2 守护进程的特征 458
13.3 编码规则 461
13.4 出错记录 464
13.5 单示例守护进程 468
13.6 守护进程的惯例 469
13.7 客户端-服务器模型 474
13.8 小结 475
14 高级I/O 476
14.1 引言 476
14.2 非阻塞I/O 476
14.3 记录锁 480
14.4 I/O多路复用 494
14.4.1 select和pselect函数 497
14.4.2 poll函数 501
14.5 异步I/O 503
14.5.1 System V异步I/O 504
14.5.2 BSD异步I/O 505
14.5.3 POSIX异步I/O 505
14.6 readv和writev函数 515
14.7 readn和writen函数 517
14.8 内存映射I/O 519
14.9 小结 526
15 进程间通信 528
15.1 引言 528
15.2 管道 529
15.3 poepn和pclose函数 536
15.4 协同进程 543
15.5 FIFO 547
15.6 XSI IPC 551
15.6.1 标识符和键 552
15.6.2 权限结构体 553
15.6.3 可配置性限制 554
15.6.4 优缺点 554
15.7 消息队列 556
15.8 信号量 561
15.9 共享内存 566
15.10 POSIX信号量 573
15.11 客户端/服务器属性 579
15.12 小结 581
16 网络IPC:套接字 584
16.1 引言 584
16.2 套接字描述符 584
16.3 地址 588
16.3.1 字节序 588
16.3.2 地址格式 589
16.3.3 地址查询 591
16.3.4 将套接字与地址关联 599
16.4 建立连接 600
16.5 数据传输 604
16.6 套接字选项 617
16.7 带外数据 620
16.8 非阻塞和异步I/O 621
16.9 小结 622
17 高级进程间通信 623
17.1 引言 623
17.2 UNIX域套接字 623
17.2.1 命名UNIX域套接字 628
17.3 唯一连接 629
17.4 传递文件描述符 636
17.5 第1版open服务进程 647
17.6 第2版open服务进程 653
17.7 小结 663
18 终端I/O 665
18.1 引言 665
18.2 概述 665
18.3 特殊输入字符 672
18.4 获取和设置终端属性 677
18.5 终端选项标识 677
18.6 stty命令 686
18.7 波特率函数 686
18.8 行控制函数 687
18.9 终端标识 688
18.10 规范模式 694
18.11 非规范模式 697
18.12 终端窗口大小 704
18.13 termcap、terminfo和curses 705
18.14 小结 706
19 伪终端 708
19.1 引言 708
19.2 概述 708
19.3 打开伪终端设备 715
19.4 pty_fork函数 719
19.5 pty程序 721
19.6 使用pty程序 726
19.7 高级特性 733
19.8 小结 734
20 数据库函数库 736
20.1 引言 736
20.2 历史 736
20.3 函数库 737
20.4 实现概述 739
20.5 采用集中式还是分散式 743
20.6 并发 744
20.7 构建函数库 745
20.8 源代码 746
20.9 性能 773
20.10 小结 778
21 与网络打印机通信 780
21.1 引言 780
21.2 网络打印协议 780
21.3 超文本传输协议 783
21.4 打印机后台处理技术 784
21.5 源代码 786
21.6 小结 834
附录A 函数原型 835
附录B 其他源代码 871