本书是被誉为UNIX编程“”的Advanced Programming in the UNIX Environment一书的第3版。在本书第2版出版后的8年中,UNIX发生了巨大的变化,特别是影响UNIX编程接口的有关标准变化很大。本书在保持前一版风格的基础上,根据新的标准对内容进行了修订和增补,反映了新的技术发展。书中除了介绍UNIX文件和目录、标准I/O库、系统数据文件和信息、进程环境、进程控制、进程关系、信号、线程、线程控制、守护进程、各种I/O、进程间通信、网络IPC、伪终端等方面的内容,还在此基础上介绍了众多应用实例,包括如何创建数据库函数库以及如何与网络打印机通信等。此外,还在附录中给出了函数原型和部分习题的答案。 本书内容,概念清晰,阐述精辟,对于所有层次UNIX/Linux程序员都是一本不可或缺的参考书。
目录
第 1章 UNIX基础知识 1 n 1.1 引言 1 n 1.2 UNIX体系结构 1 n 1.3 登录 1 n 1.4 文件和目录 3 n 1.5 输入和输出 6 n 1.6 程序和进程 8 n 1.7 出错处理 11 n 1.8 用户标识 13 n 1.9 信号 14 n 1.10 时间值 16 n 1.11 系统调用和库函数 17 n 1.12 小结 18 n 习题 18 n 第 2章 UNIX标准及实现 20 n 2.1 引言 20 n 2.2 UNIX标准化 20 n 2.2.1 ISO C 20 n 2.2.2 IEEE POSIX 21 n 2.2.3 Single UNIX Specification 25 n 2.2.4 FIPS 26 n 2.3 UNIX系统实现 26 n 2.3.1 SVR4 27 n 2.3.2 4.4BSD 27 n 2.3.3 FreeBSD 28 n 2.3.4 Linux 28 n 2.3.5 Mac OS X 28 n 2.3.6 Solaris 28 n 2.3.7 其他UNIX系统 29 n 2.4 标准和实现的关系 29 n 2.5 限制 29 n 2.5.1 ISO C限制 30 n 2.5.2 POSIX限制 31 n 2.5.3 XSI限制 33 n 2.5.4 函数sysconf、pathconf和fpathconf 33 n 2.5.5 不确定的运行时限制 40 n 2.6 选项 43 n 2.7 功能测试宏 46 n 2.8 基本系统数据类型 47 n 2.9 标准之间的冲突 48 n 2.10 小结 48 n 习题 48 n 第3章 文件I/O 49 n 3.1 引言 49 n 3.2 文件描述符 49 n 3.3 函数open和openat 50 n 3.4 函数creat 52 n 3.5 函数close 53 n 3.6 函数lseek 53 n 3.7 函数read 57 n 3.8 函数write 57 n 3.9 I/O的效率 58 n 3.10 文件共享 59 n 3.11 原子操作 62 n 3.12 函数dup和dup2 63 n 3.13 函数sync、fsync和fdatasync 65 n 3.14 函数ftl 65 n 3.15 函数ioctl 70 n 3.16 /dev/fd 71 n 3.17 小结 72 n 习题 72 n 第4章 文件和目录 74 n 4.1 引言 74 n 4.2 函数stat、fstat、fstatat和lstat 74 n 4.3 文件类型 75 n 4.4 设置用户ID和设置组ID 78 n 4.5 文件访问权限 79 n 4.6 新文件和目录的所有权 80 n 4.7 函数access和faccessat 81 n 4.8 函数umask 83 n 4.9 函数chmod、fchmod和fchmodat 84 n 4.10 粘着位 87 n 4.11 函数chown、fchown、fchownat和lchown 88 n 4.12 文件长度 89 n 4.13 文件截断 90 n 4.14 文件系统 90 n 4.15 函数link、linkat、unlink、unlinkat和remove 93 n 4.16 函数rename和renameat 95 n 4.17 符号链接 96 n 4.18 创建和读取符号链接 99 n 4.19 文件的时间 99 n 4.20 函数futimens、utimensat和utimes 101 n 4.21 函数mkdir、mkdirat和rmdir 103 n 4.22 读目录 104 n 4.23 函数chdir、fchdir和getcwd 108 n 4.24 设备特殊文件 110 n 4.25 文件访问权限位小结 112 n 4.26 小结 113 n 习题 113 n 第5章 标准I/O库 115 n 5.1 引言 115 n 5.2 流和FILE对象 115 n 5.3 标准输入、标准输出和标准错误 116 n 5.4 缓冲 116 n 5.5 打开流 118 n 5.6 读和写流 120 n 5.7 每次一行I/O 122 n 5.8 标准I/O的效率 123 n 5.9 二进制I/O 125 n 5.10 定位流 126 n 5.11 格式化I/O 127 n 5.12 实现细节 131 n 5.13 临时文件 134 n 5.14 内存流 137 n 5.15 标准I/O的替代软件 140 n 5.16 小结 140 n 习题 140 n 第6章 系统数据文件和信息 142 n 6.1 引言 142 n 6.2 口令文件 142 n 6.3 阴影口令 145 n 6.4 组文件 146 n 6.5 附属组ID 147 n 6.6 实现区别 148 n 6.7 其他数据文件 148 n 6.8 登录账户记录 149 n 6.9 系统标识 150 n 6.10 时间和日期例程 151 n 6.11 小结 157 n 习题 157 n 第7章 进程环境 158 n 7.1 引言 158 n 7.2 main函数 158 n 7.3 进程终止 158 n 7.4 命令行参数 162 n 7.5 环境表 163 n 7.6 C程序的存储空间布局 163 n 7.7 共享库 165 n 7.8 存储空间分配 165 n 7.9 环境变量 168 n 7.10 函数setjmp和longjmp 170 n 7.11 函数getrlimit和setrlimit 175 n 7.12 小结 180 n 习题 180 n 第8章 进程控制 181 n 8.1 引言 181 n 8.2 进程标识 181 n 8.3 函数fork 182 n 8.4 函数vfork 187 n 8.5 函数et 188 n 8.6 函数wait和waitpid 190 n 8.7 函数waitid 194 n 8.8 函数wait3和wait4 195 n 8.9 竞争条件 196 n 8.10 函数exec 199 n 8.11 更改用户ID和更改组ID 204 n 8.12 解释器文件 207 n 8.13 函数system 211 n 8.14 进程会计 215 n 8.15 用户标识 220 n 8.16 进程调度 221 n 8.17 进程时间 224 n 8.18 小结 226 n 习题 226 n 第9章 进程关系 228 n 9.1 引言 228 n 9.2 终端登录 228 n 9.3 网络登录 231 n 9.4 进程组 233 n 9.5 会话 234 n 9.6 控制终端 235 n 9.7 函数tcgetpgrp、tcsetpgrp和tcgetsid 237 n 9.8 作业控制 237 n 9.9 shell执行程序 240 n 9.10 孤儿进程组 244 n 9.11 FreeBSD实现 246 n 9.12 小结 248 n 习题 248 n 第 10章 信号 249 n 10.1 引言 249 n 10.2 信号概念 249 n 10.3 函数signal 256 n 10.4 不可靠的信号 259 n 10.5 中断的系统调用 260 n 10.6 可重入函数 262 n 10.7 SIGCLD语义 264 n 10.8 可靠信号术语和语义 266 n 10.9 函数kill和raise 267 n 10.10 函数alarm和pause 268 n 10.11 信号集 273 n 10.12 函数sigprocmask 275 n 10.13 函数sigpending 276 n 10.14 函数sigaction 278 n 10.15 函数sigsetjmp和siglongjmp 283 n 10.16 函数sigsuspend 286 n 10.17 函数abort 291 n 10.18 函数system 293 n 10.19 函数sleep、nanosleep和clock_nanosleep 298 n 10.20 函数sigqueue 300 n 10.21 作业控制信号 301 n 10.22 信号名和编号 303 n 10.23 小结 305 n 习题 305 n 第 11章 线程 307 n 11.1 引言 307 n 11.2 线程概念 307 n 11.3 线程标识 308 n 11.4 线程创建 309 n 11.5 线程终止 311 n 11.6 线程同步 318 n 11.6.1 互斥量 320 n 11.6.2 避免死锁 322 n 11.6.3 函数pthread_mutex_ timedlock 327 n 11.6.4 读写锁 328 n 11.6.5 带有超时的读写锁 332 n 11.6.6 条件变量 332 n 11.6.7 自旋锁 335 n 11.6.8 屏障 336 n 11.7 小结 340 n 习题 340 n 第 12章 线程控制 341 n 12.1 引言 341 n 12.2 线程限制 341 n 12.3 线程属性 342 n 12.4 同步属性 345 n 12.4.1 互斥量属性 345 n 12.4.2 读写锁属性 352 n 12.4.3 条件变量属性 353 n 12.4.4 屏障属性 354 n 12.5 重入 354 n 12.6 线程特定数据 358 n 12.7 取消选项 362 n 12.8 线程和信号 364 n 12.9 线程和fork 367 n 12.10 线程和I/O 370 n 12.11 小结 371 n 习题 371 n 第 13章 守护进程 372 n 13.1 引言 372 n 13.2 守护进程的特征 372 n 13.3 编程规则 374 n 13.4 出错记录 377 n 13.5 单实例守护进程 380 n 13.6 守护进程的惯例 381 n 13.7 客户进程-服务器进程模型 386 n 13.8 小结 386 n 习题 387 n 第 14章 高级I/O 388 n 14.1 引言 388 n 14.2 非阻塞I/O 388 n 14.3 记录锁 391 n 14.4 I/O多路转接 403 n 14.4.1 函数select和pselect 404 n 14.4.2 函数poll 408 n 14.5 异步I/O 410 n 14.5.1 System V异步I/O 410 n 14.5.2 BSD异步I/O 411 n 14.5.3 POSIX异步I/O 411 n 14.6 函数readv和writev 419 n 14.7 函数readn和writen 421 n 14.8 存储映射I/O 422 n 14.9 小结 428 n 习题 428 n 第 15章 进程间通信 429 n 15.1 引言 429 n 15.2 管道 430 n 15.3 函数popen和pclose 436 n 15.4 协同进程 441 n 15.5 FIFO 445 n 15.6 XSI IPC 448 n 15.6.1 标识符和键 448 n 15.6.2 权限结构 449 n 15.6.3 结构限制 450 n 15.6.4 优点和缺点 450 n 15.7 消息队列 451 n 15.8 信号量 455 n 15.9 共享存储 459 n 15.10 POSIX信号量 465 n 15.11 客户进程-服务器进程属性 470 n 15.12 小结 472 n 习题 472 n 第 16章 网络IPC:套接字 474 n 16.1 引言 474 n 16.2 套接字描述符 474 n 16.3 寻址 477 n 16.3.1 字节序 477 n 16.3.2 地址格式 478 n 16.3.3 地址查询 480 n 16.3.4 将套接字与地址关联 486 n 16.4 建立连接 487 n 16.5 数据传输 491 n 16.6 套接字选项 502 n 16.7 带外数据 504 n 16.8 非阻塞和异步I/O 505 n 16.9 小结 506 n 习题 506 n 第 17章 高级进程间通信 507 n 17.1 引言 507 n 17.2 UNIX域套接字 507 n 17.3 连接 512 n 17.4 传送文件描述符 518 n 17.5 open服务器进程第 1版 527 n 17.6 open服务器进程第 2版 533 n 17.7 小结 542 n 习题 542 n 第 18章 终端I/O 544 n 18.1 引言 544 n 18.2 综述 544 n 18.3 特殊输入字符 549 n 18.4 获得和设置终端属性 553 n 18.5 终端选项标志 554 n 18.6 stty命令 560 n 18.7 波特率函数 560 n 18.8 行控制函数 561 n 18.9 终端标识 562 n 18.10 规范模式 567 n 18.11 非规范模式 570 n 18.12 终端窗口大小 576 n 18.13 termcap、terminfo和curses 578 n 18.14 小结 578 n 习题 579 n 第 19章 伪终端 580 n 19.1 引言 580 n 19.2 概述 580 n 19.3 打开伪终端设备 585 n 19.4 函数pty_fork 588 n 19.5 pty程序 590 n 19.6 使用pty程序 595 n 19.7 高级特性 600 n 19.8 小结 601 n 习题 601 n 第 20章 数据库函数库 603 n 20.1 引言 603 n 20.2 历史 603 n 20.3 函数库 604 n 20.4 实现概述 605 n 20.5 集中式或非集中式 608 n 20.6 并发 610 n 20.7 构造函数库 610 n 20.8 源代码 611 n 20.9 性能 635 n 20.10 小结 639 n 习题 639 n 第 21章 与网络打印机通信 640 n 21.1 引言 640 n 21.2 网络打印协议 640 n 21.3 超文本传输协议 642 n 21.4 打印假脱机技术 643 n 21.5 源代码 644 n 21.6 小结 684 n 习题 684 n 附录A 函数原型 685 n 附录B 其他源代码 721 n 附录C 部分习题答案 730 n 附录参考书目 763
作者介绍
作者简介 W. 理查德.史蒂文斯(W. Richard Stevens)国际知名的UNIX和网络专家,备受赞誉的技术作家。生前著有多部经典的传世之作,包括《UNIX网络编程》(两卷本)、《TCP/IP详解》(三卷本)和本书版。
史蒂芬.A. 拉戈(Stephen A. Rago)资深UNIX程序员,目前任NEC美国实验室存储系统研究组研究员。之前是贝尔实验室的UNIX系统V版本4的开发人员之一。著有《UNIX系统V网络编程》,是本书版的技术审校和第2版的共同作者。
20多年来,严谨的C程序员都是依靠一本书来深入了解驱动UNIX和Linux内核的编程接口的实用知识的,这本书就是W. Richard Stevens所著的《UNIX环境高级编程》。现在,Stevens的同事Stephen Rago更新了这本经典著作。 n n 新的第3版支持当今领先的系统平台,反映了新技术进展和佳实践,并且符合新的Single UNIX Specification第4版(SUSv4)。 n Rago保留了使本书前版成为经典之作的精髓和方法。他在Stevens原著的基础上,从基础的文件、目录和进程讲起,并给诸如信号处理和终端I/O之类的先进技术保留较大的篇幅。他还深入讨论了线程和多线程编程、使用套接字接口驱动进程间通信(IPC)等方面的内容。 n n 这一版涵盖了70多个新接口,包括POSIX异步I/O、旋转锁、屏障(barrier)和POSIX信号量。此外,这一版删除了许多过时的接口,保留了一些广泛使用的接口。书中几乎所有实例都已经在主流的4个平台上测试过,包括Solaris 10、Mac OS X 10.6.8(Darwin 10.8.0)、Free-BSD 8.0和Ubuntu 12.04(基于Linux 3.2)。 n n 与前两版一样,读者仍可以通过实例学习,这些实例包括了1万多行可下载的ISO C源代码,书中通过简明但完整的程序阐述了400多个系统调用和函数,清楚地说明它们的用法、参数和返回值。为了使读者能融会贯通,书中还提供了几个贯穿整章的案例,每个案例都根据现在的技术环境进行了全面更新。 n n 本书帮助几代程序员写出了可靠、强大、高性能的代码。第3版根据当今主流系统进行更新,更具实用价值。