UNIX环境高级编程(第3版) pdf下载
选择版本
内容简介
本篇主要提供UNIX环境高级编程(第3版)电子书的pdf版本下载,本电子书下载方式为百度网盘方式,点击以上按钮下单完成后即会通过邮件和网页的方式发货,有问题请联系邮箱ebook666@outlook.com
基本信息
参考信息(以实物为准)
内容简介
本书一共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应用软件开发的读者或者对此感兴趣的读者。
前言序言
第3版前言
引言
从我第一次修订《UNIX 环境高级编程》一书以来已经将近8年,这期间发生了许多□化。
— 在出版第2版之前,Open Group完成了2004版的Single UNIX Specification,它修改了两套勘误表的内容。2008年,Open Group完成了当时□□版的Single UNIX Specification,它更新了基本定义,添加了新的接口,并且去除了弃用的接口。这套规范被称为2008年版的POSIX.1,其中包含第7版的基本规范,并在2009年发行。2010年,它与更新后的curses接口捆绑,作为Single UNIX Specification第4版(SUSv4)。
— 运行在Intel处理器上的Mac OS X操作系统10.5、10.6和10.8版,被Open Group认证为UNIX。
— 苹果公司停止了PowerPC平台上Mac OS X的开发。在10.6发行版(Snow Leopard)之后,只针对x86平台发布了新的操作系统版本。
— Solaris操作系统以开源的形式发布,试图与FreeBSD、Linux和Mac OS X遵循的开发模式在声望上一争高下。2010年,Oracle收购了Sun Microsystems之后,OpenSolaris的开发被终止。作为替代,Solaris社区组建了Illumos项目来继续基于OpenSolaris的开源开发。
— 2011年,C语言标准更新,但是因为系统并未跟上其□化,本书依然参照1999版撰写。最重要的是,在第2版中使用的平台已经过时了,因此第3版涉及以下平台。
1.FreeBSD 8.0,前身是加州大学伯克利分校CSRG(计算机系统研究组)发布的4.4BSD系统,运行在32位Intel Pentium系统上。
2.Linux 3.2.0(Ubuntu 12.04发布版),这是一个免费的类UNIX操作系统,运行在64位的Intel Core i5处理器上。
3.Apple Mac OS X 10.6.8版(Darwin 10.8.0),运行在64位Intel Core2 Duo处理器上(Darwin基于的是FreeBSD和Mach)。我选择从PowerPC平台转向Intel平台,是因为□□版的Mac OS X不再支持Power PC平台。这个选择带来的弊端是涉及的处理器倾向了Intel,而当讨论到异构问题时,涉及的处理器如果能在字节序和整型数大小等方面有不同的特性,就会很有帮助。
4.Solaris 10,Sun Microsystems(现在的Oracle)的System V Release 4的派生系统,运行在64位Ultra SPARC IIi处理器上。
与第2版的不同
□□的□化之一是,POSIX.1-2008中Single UNIX Specification启用了一些STREAMS相关接口。(这是准备在该标准的未来版本中删除这些接口之前的第一步。)因此,我不情愿地在第3版中删除了STREAMS的内容。这是一个不幸的□化,因为STREAMS接口为socket接口提供了一个很好的对照,并且在很多方面更加灵活。不可否认,当谈论到STREAMS时,我并非绝对公正,但是毫无疑问的是,在现有系统中它的分量已经减轻。
— Linux基础系统中未包含STREAMS,虽然添加该功能的包(LiS和OpenSS7)是可用的。
— 虽然Solaris 10中包含了STREAMS,但是Solaris 11的socket实现并没有构建在STREAMS之上。
— Mac OS X不包含STREAMS支持。
— FreeBSD不包含STREAMS支持(也从未包含过)。
随着STREAMS相关内容的去除,新的主题有机会替代它,例如POSIX异步I/O。
在本书第2版中,Linux是基于2.4版的。在第3版中,我们将Linux更新到了3.2版。两个Linux版本的□□不同之一是线程系统。在Linux 2.4和Linux 2.6之间,线程的实现□为Native POSIX Thread Library(NPTL)。NPTL使得Linux线程的行为与其他线程更加相似。
总的来说,第3版涵盖了超过70个新的接口,包括处理异步I/O、自旋锁、屏障和POSIX信号量等的接口。除了一些普遍使用的接口被保留,大多数弃用的接口被删除。
致谢
许多读者为第2版发来了□□和错误报告,感谢他们提高了第2版的准确性。下面是最早提出建议或者指出错误的朋友:Seth Arnold、Luke Bakken、Rick Ballard、Johannes Bittner、David Bronder、Vlad Buslov、Peter Butler、Yuching Chen、Mike Cheng、Jim Collins、Bob Cousins、Will Dennis、Thomas Dickey、Loïc Domaigné、Igor Fuksman、Alex Gezerlis、M. Scott Gordon、Timothy Goya、Tony Graham、Michael Hobgood、Michael Kerrisk、Youngho Kwon、Richard Li、Xueke Liu、Yun Long、Dan McGregor、Dylan McNamee、Greg Miller、Simon Morgan、Harry Newton、Jim Oldfield、Scott Parish、Zvezdan Petkovic、David Reiss、Konstantinos Sakoutis、David Smoot、David Somers、Andriy Tkachuk、Nathan Weeks、Florian Weimer、Qingyang Xu和Michael Zalokar。
技术审校者们也提高了内容的准确性,感谢Steve Albert、Bogdan Barbu和Robert Day。特别感谢Geoff Clare和Andrew Josey为Single UNIX Specification的更新和第2章的准确性提供了帮助。另外,感谢Ken Thompson对□□问题做了解答。
我得再说一次,与Addison-Wesley的工作人员合作非常愉快。感谢Kim Boedigheimer、Romny Fench、Jhon Goldstein、Julie Nahil和Debra Williams-Cauley,此外感谢Jill Hobbs的专业审稿能力。
最后,感谢我的家人对我在这次再版上花费了如此多时间给予的理解。
我也非常欢迎读者发来邮件、发表□□、提出建议并订正错误。
Stephen A. Rago
sar@apuebook.com
2013年1月于新泽西州沃伦市
目录
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
作者简介
已故的W. Richard Stevens是《UNIX网络编程》(这本书被公认为是UNIX网络领域的经典著作)第 1 和第 2 卷的作者,也是《TCP/IP 详解》第 1~3 卷及本书第 1 版的作者。
Stephen A. Rago是NEC Laboratories America 的存储系统团队的研究人员。在此之前,他是Bell Laboratories的开发者之一,曾开发 UNIX System V Release 4。他还是《UNIX System V Network Programming》的作者、本书第 1 版的审稿人和第 2 版的合著者。
张毅峰,软件架构师,目前在上汽创新研发总院软件部门负责智能网联相关基础软件的项目预研、新技术导入及行业趋势跟踪等工作,是上汽集团□□会的多个产学研课题负责人,也是AUTOSAR中国中心的项目发言人。长期从事一线研发工作,具有丰富的车载嵌入式软硬件协同开发经验,负责过上汽集团多个嵌入式项目的基础软件开发和管理工作,对智能化时代的车载基础软件核心要素和发展趋势有着深刻的认识和见解。
马树超,腾讯后台开发工程师,曾就职百度从事接入接出网关研发运营相关工作,目前从事高性能负载均衡网关设计和研发工作;具有丰富的系统网络开发经验。 当前主要关注网络转发、网络安全、加解密协议等领域。
池艳广,中兴通讯专家级软件开发工程师、高级TL、安全编码专家、题库设计专家、面试官,在TCP/IP协议、WiFi驱动、嵌入式Linux等领域有着丰富的实战经验。CSDN博客专家、Linux领域优质创作者、CSDN C语言社区管理员、阿里云专家博主。公众号:Linux探索者;CSDN博客:花神庙码农。
刚铎,毕业于大连理工大学,硕士研究生,系统分析与集成专业。先后就职于华为、神州数码,曾获得多个厂商的高级技术认证。现就职于电信数智科技有限公司,从事云网技术架构与落地工作,关注网络和安全、云计算和人工智能等方向。