| 作者 |
| (美)Kay Robbins(凯·罗宾斯) , Steve Robbins(斯蒂芬·罗宾斯) |
| 丛书名 |
| 出版社 |
| 电子工业出版社 |
| ISBN |
| 9787121340352 |
| 简要 |
| 简介 |
| 内容简介书籍计算机书籍 《UNIX系统编程: 通信、并发与线程》是一本基于最新UNIX标准的完备的参考书,对UNIX编程的要点进行了清晰易懂的介绍,从一些用于说明如何使用系统调用的短小代码段开始,逐渐过渡到能帮助读者扩展自己技能水平的实际项目中。《UNIX系统编程: 通信、并发与线程》中对通信、并发和线程问题进行了深入探讨,对复杂的概念(如信号和并发)进行了全面且清晰的解释,还覆盖了与文件、信号、信号量、POSIX线程和客户机-服务器通信相关的内容。《UNIX系统编程: 通信、并发与线程》中不仅提供了大量实例和练习,还专门设计了有针对性的项目并给出了参考答案。本书分为4部分,每部分都包含主题章节和项目章节。《UNIX系统编程: 通信、并发与线程》在第一部分:基础知识中介绍了UNIX操作系统的基础知识,包括文件、进程和特殊文件等;第二部分:异步事件主要介绍了信号和定时器;第三部分:并发主要介绍了信号量和进程同步的相关内容;第四部分:通信则主要介绍通信的相关话题。其中,第一部分:基础知识是本书其余部分的基础,读者在阅读完第一部分后,就可以以任意顺序阅读本书其他部分的相关内容。 |
| 目录 |
| 第一部分 基础知识 第1章 技术对程序的影响 3 1.1 术语的变化 3 1.2 时间和速度 5 1.3 多道程序设计和分时 6 1.4 应用层的并发 8 1.4.1 中断 8 1.4.2 信号 9 1.4.3 输入和输出 10 1.4.4 进程、线程和资源共享 10 1.4.5 具有共享内存的多个处理器 11 1.4.6 网络作为计算机 11 1.5 安全和容错 12 1.6 非法入侵造成的缓冲区溢出 13 1.6.1 缓冲区溢出的后果 14 1.6.2 缓冲区溢出和安全 16 1.7 UNIX标准 17 1.8 延伸阅读 19 第2章 程序、线程和进程 21 2.1 程序是如何成为进程的 21 2.2 线程和执行线程 22 2.3 程序映象的布局 23 2.4 库函数调用 26 2.5 函数返回值和错误 29 2.6 参数数组 31 2.6.1 用makeargv函数创建一个数组 32 2.6.2 makeargv函数的实现 34 2.7 线程安全函数 38 2.8 静态变量的使用 40 2.9 静态对象的结构 42 2.10 进程环境 48 2.11 进程终止 51 2.12 练习:一个env实用程序 54 2.13 练习:消息日志 55 2.14 延伸阅读 57 第3章 UNIX中的进程 58 3.1 进程标识符 58 3.2 进程状态 60 3.3 UNIX 进程创建和fork函数 63 3.4 wait函数 70 状态值 76 3.5 exec函数 77 3.6 后台进程和守护进程 83 3.7 临界区 86 3.8 练习:进程链 87 3.9 练习:进程扇 88 3.10 延伸阅读 89 第4章 UNIX I/O 90 4.1 设备术语 90 4.2 读/写 91 4.3 打开和关闭文件 102 4.4 select函数 107 4.5 poll函数 116 4.6 文件表示 119 4.6.1 文件描述符 119 4.6.2 文件指针和缓冲 122 4.6.3 文件描述符的继承 124 4.7 过滤器和重定向 128 4.8 文件控制 132 4.9 练习:原子日志 135 原子日志库 139 4.10 练习:cat实用程序 141 4.11 延伸阅读 143 第5章 文件和 144 5.1 UNIX文件系统导航 144 5.1.1 当前工作 145 5.1.2 搜索路径 150 5.2 访问 151 5.2.1 访问文件状态信息 153 5.2.2 确定文件的类型 156 5.3 UNIX文件系统实现 157 5.3.1 UNIX文件实现 158 5.3.2 实现 161 5.4 硬链接和符号链接 161 5.4.1 创建或删除一个链接 162 5.4.2 创建和删除符号链接 167 5.5 练习:which命令 172 5.6 练习:邮件通知程序 173 5.7 练习:新闻通知程序 176 5.8 练习:遍历 177 5.9 延伸阅读 179 第6章 UNIX特殊文件 180 6.1 管道 180 6.2 流水线 184 6.3 FIFO 189 6.4 管道与客户机-服务器模型 193 6.5 终端控制 200 规范和非规范的输入处理 208 6.6 音频设备 212 6.7 练习:音频 218 6.8 练习:屏障 220 6.9 练习:stty命令 221 6.10 练习:重提客户机-服务器 222 6.11 延伸阅读 222 第7章 项目:令牌环 224 7.1 环形拓扑 224 7.2 环的形成 226 7.3 环的探讨 232 7.4 简单通信 234 7.5 用令牌环实现互斥 235 7.6 用投票实现互斥 237 7.7 匿名环中的领导者选举 238 7.8 用于通信的令牌环 240 7.9 流水线预处理机 242 7.10 并行环算法 244 7.10.1 图像过滤 244 7.10.2 矩阵乘法 247 7.11 弹性环 248 7.12 延伸阅读 249 第二部分 异步事件 第8章 信号 253 8.1 信号的基本概念 253 8.2 信号的产生 254 8.3 对信号掩码和信号集进行操作 259 8.4 捕获和忽略信号-sigaction 266 8.5 等待信号-pause、sigsuspend和sigwait 272 8.5.1 pause函数 272 8.5.2 sigsuspend函数 274 8.5.3 sigwait函数 282 8.6 处理信号:错误和异步信号安全 283 8.7 用siglongjmp和sigsetjmp进行程序控制 286 8.8 使用异步I/O编程 288 8.9 练习:转储统计 300 8.10 练习:同时处理慢速设备 301 8.11 延伸阅读 301 第9章 时间和定时器 303 9.1 POSIX时间 303 9.1.1 用从Epoch开始的秒数表示时间 304 9.1.2 显示日期和时间 305 9.1.3 使用struct timeval表示时间 308 9.1.4 使用实时时钟 311 9.1.5 耗时和处理器时间的对比 313 9.2 睡眠函数 316 9.3 POSIX:XSI间隔定时器 319 9.4 实时信号 323 9.5 POSIX:TMR间隔定时器 328 9.6 定时器漂移、溢出和绝对时间 333 9.7 延伸阅读 344 第10章 项目:虚拟定时器 345 10.1 项目概述 345 10.2 简单的定时器 348 10.3 对5个定时器中的一个进行设置 351 10.3.1 virtualtimers对象 351 10.3.2 hardwaretimer对象 353 10.3.3 主程序实现 354 10.3.4 用show谱写定时器代码 355 10.4 使用多个定时器 361 10.4.1 设置多个定时器 364 10.4.2 用多个定时器进行测试 365 10.5 多定时器的健壮实现 369 10.6 POSIX:TMR定时器的实现 371 10.7 一个小型的cron工具mycron 372 10.8 延伸阅读 372 第11章 项目:破解shell 373 11.1 构建一个简单的shell 373 11.2 重定向 378 11.3 流水线 382 11.4 前台的信号处理 385 11.5 进程组、会话和控制终端 391 11.5.1 进程组 391 11.5.2 会话 393 11.6 ush中的后台进程 396 11.7 作业控制 403 11.8 ush的作业控制 407 11.8.1 一个作业列表对象 407 11.8.2 ush中的作业列表 409 11.8.3 ush中的作业控制 409 11.8.4 等待流水线时的进程行为 410 11.9 延伸阅读 411 第三部分 并 发 第12章 POSIX线程 415 12.1 监视文件描述符的方法 415 12.2 使用线程监视多个文件描述符 417 12.3 线程管理 420 12.3.1 用ID引用线程 421 12.3.2 创建一个线程 422 12.3.3 分离和连接 423 12.3.4 退出和取消 426 12.3.5 向线程传递参数并返回值 429 12.4 线程安全 438 12.5 用户级线程 VS 内核级线程 439 12.6 线程属性 442 12.6.1 线程状态 443 12.6.2 线程栈 444 12.6.3 线程调度 446 12.7 练习:并行文件复制 450 12.8 延伸阅读 451 第13章 线程同步 452 13.1 POSIX同步函数 452 13.2 互斥锁 453 13.2.1 创建并初始化一个互斥量 454 13.2.2 销毁一个互斥量 455 13.2.3 锁定和解锁互斥量 456 13.2.4 保护不安全的库函数 458 13.2.5 同步标志和全局值 459 13.2.6 让数据结构成为线程安全的 465 13.3 最多一次和至少一次的执行 467 13.4 条件变量 471 13.4.1 条件变量的创建和销毁 473 13.4.2 等待并通知条件变量 475 13.5 信号处理和线程 478 13.5.1 将信号定向到一个特定的线程中 479 13.5.2 为线程屏蔽信号 480 13.5.3 信号处理的专用线程 480 13.6 读者和写者 484 13.7 strerror_r实现 489 13.8 死锁和其他讨厌的问题 491 13.9 练习:多个屏障 492 13.10 延伸阅读 492 第14章 临界区和信号量 493 14.1 临界区的处理 493 14.2 信号量 496 14.3 POSIX:SEM匿名信号量 499 14.4 POSIX:SEM信号量操作 501 14.5 POSIX:SEM命名信号量 508 14.5.1 创建并打开命名信号量 509 14.5.2 关闭信号量并删除其链接 512 14.6 练习:许可管理器 514 14.6.1 license对象 515 14.6.2 runsim主程序 515 14.6.3 对许可管理器的扩展 516 14.7 延伸阅读 516 第15章 POSIX IPC 517 15.1 POSIX:XSI进程间通信 517 15.1.1 标识并访问IPC对象 518 15.1.2 在shell中访问POSIX:XSI IPC资源 519 15.2 POSIX:XSI信号量集 520 15.2.1 信号量的创建 521 15.2.2 信号量的控制 523 15.2.3 POSIX信号量集操作 525 15.3 POSIX:XSI共享内存 532 15.3.1 访问共享内存段 532 15.3.2 共享内存段的连接和分离 533 15.3.3 控制共享内存 534 15.3.4 共享内存示例 535 15.4 POSIX:XSI消息队列 541 访问消息队列 542 15.5 练习:POSIX匿名信号量 549 15.6 练习:POSIX命名信号量 550 15.7 练习:用共享内存实现管道 551 15.8 练习:用消息队列实现管道 554 15.9 延伸阅读 554 第16章 项目:生产者-消费者同步 555 16.1 生产者-消费者问题 555 16.2 受互斥锁保护的有界缓冲区 557 16.3 使用信号量的缓冲区实现 560 16.4 一个简单的生产者-消费者问题简介 566 16.5 使用条件变量的有界缓冲区 570 16.6 带有完成条件的缓冲区 571 16.7 并行文件复制 580 16.7.1 并行文件复制的生产者 580 16.7.2 并行文件复制的消费者 581 16.7.3 并行文件复制的main程序 582 16.7.4 并行文件复制的增强 582 16.8 线程化打印服务器 583 16.8.1 请求缓冲区 584 16.8.2 生产者线程 585 16.8.3 消费者线程 586 16.8.4 打印服务器 586 16.8.5 其他增强功能 586 16.9 延伸阅读 587 第17章 项目:非完全并行虚拟机 588 17.1 PVM的历史、术语和结构 588 17.2 非完全并行虚拟机 591 17.3 NTPVM项目概述 593 17.3.1 NEWTASK分组 596 17.3.2 DATA分组 596 17.3.3 DONE分组 597 17.4 调度程序的I/O和测试 598 17.4.1 用多个窗口测试 604 17.4.2 用远程日志测试 605 17.5 没有输入的单任务 607 17.6 顺序任务 608 17.6.1 输入线程 609 17.6.2 输出线程 610 17.7 并发任务 611 17.8 分组通信、广播和屏障 611 17.9 终止和信号 612 17.10 有序的消息传递 613 17.11 延伸阅读 613 第四部分 通 信 第18章 面向连接的通信 617 18.1 客户机-服务器模型 617 18.2 通信信道 618 18.3 面向连接的服务器策略 622 18.4 通用因特网通信接口(UICI) 625 18.4.1 处理错误 627 18.4.2 读和写 627 18.5 不同服务器策略的UICI实现 628 18.6 UICI客户机 631 18.7 UICI的套接字实现 637 18.7.1 socket函数 638 18.7.2 bind函数 639 18.7.3 listen函数 641 18.7.4 u_open函数的实现 642 18.7.5 accept函数 643 18.7.6 u_accept函数的实现 645 18.7.7 connect函数 646 18.7.8 u_connect函数的实现 647 18.8 主机名和IP地址 649 18.9 线程安全的UICI 658 18.10 练习:ping服务器 661 18.11 练习:音频的传输 662 18.12 延伸阅读 664 第19章 项目:WWW重定向 665 19.1 万维网 665 19.2 统一资源定位符(URL) 666 19.3 HTTP入门 668 19.3.1 客户端请求 669 19.3.2 服务器响应 669 19.3.3 HTTP消息交换 670 19.4 Web通信模式 673 19.4.1 隧道 673 19.4.2 代理 674 19.4.3 高速缓存和透明性 676 19.4.4 网关 678 19.5 单连接的通过型监控 679 19.6 隧道服务器的实现 682 19.7 用于测试的服务器驱动程序 682 19.8 HTTP头解析 684 19.9 简单的代理服务器 686 19.10 代理监视器 688 19.11 代理高速缓存 691 19.12 门户网站的网关 692 19.13 用于负载平衡的网关 692 19.14 事后的调查分析 693 19.14.1 线程和计时错误 693 19.14.2 未捕获的错误和错误的退出 694 19.14.3 书写风格和表示 695 19.14.4 糟糕的测试和结果表示 696 19.14.5 编程错误和不好的风格 697 19.15 延伸阅读 698 第20章 无连接通信和多播 699 20.1 无连接通信简介 699 20.2 无连接通信的简化接口 701 20.2.1 主机名和u_buf_t结构 703 20.2.2 UICI UDP的返回错误 703 20.2.3 UDP缓冲区大小和UICI UDP 703 20.3 简单-请求协议 704 20.4 请求-应答协议 710 20.5 有超时和重试的请求-应答 716 20.6 请求-应答-确认协议 722 20.7 UICI UDP的实现 723 20.7.1 u_openudp函数的实现 723 20.7.2 sendto函数 725 20.7.3 u_sendto和 u_sendtohost函数的实现 726 20.7.4 recvfrom函数 727 20.7.5 u_recvfrom和u_recvfromtimed函数的实现 728 20.7.6 主机名和u_buf_t 730 20.8 UDP和TCP的比较 732 20.9 多播 733 20.9.1 多播寻址 733 20.9.2 u_join函数的实现 735 20.9.3 u_leave函数的实现 736 20.10 练习:UDP端口服务器 737 20.11 练习:无状态文件服务器 738 远程文件服务 739 20.12 延伸阅读 740 第21章 项目:互联网广播 741 21.1 项目概述 741 21.2 音频设备模拟 744 21.3 具有一个节目和一个接收者的UDP实现 744 21.3.1 简单实现 744 21.3.2 接收者的终止 747 21.3.3 接收者缓冲来处理网络延迟 748 21.3.4 接收者缓冲来处理乱序传递 751 21.4 具有多个节目和接收者的UDP实现 754 21.4.1 多个节目和单个接收者 754 21.4.2 多个节目和多个接收者 755 21.5 音频广播的UDP实现 756 21.6 无线电广播的多播实现 758 21.7 TCP实现的差异 758 21.7.1 单个节目和单个接收者的TCP实现 759 21.7.2 多个节目和单个接收者的TCP实现 760 21.7.3 无线电广播的TCP实现 761 21.8 通过浏览器接收流式音频 764 21.8.1 使用浏览器助手应用程序 764 21.8.2 在你的Web服务器中设置一种新的mime类型 765 21.8.3 设置你的浏览器来处理新的mime类型 766 21.8.4 创建Web页面 766 21.8.5 使用预定义的mime类型 767 21.9 延伸阅读 767 第22章 项目:服务器性能 769 22.1 服务器性能成本 769 22.2 服务器架构 770 22.3 项目概述 774 22.4 单客户端驱动程序 775 22.4.1 处理一个连接 775 22.4.2 对响应进行编程 776 22.4.3 收集统计信息 777 22.4.4 测试客户端 777 22.5 多客户端驱动程序 778 另一种多客户端设计 781 22.6 实现每个请求一个线程和每个请求一个进程 781 22.7 线程工作者池策略 782 22.8 使用有界缓冲区的多线程工作者池 782 22.9 进程工作者池 783 22.10 磁盘I/O的影响 783 22.11 性能研究 787 22.11.1 基线测量 787 22.11.2 波动性的根源 788 22.11.3 测量错误 789 22.11.4 同步 792 22.11.5 普通的错误 793 22.11.6 要测量什么 794 22.11.7 数据分析和表示 796 22.12 报告撰写 797 22.12.1 引言 797 22.12.2 设计、实现和测试 798 22.12.3 实验 798 22.12.4 结果和分析 799 22.12.5 结论 799 22.12.6 参考文献 799 22.13 延伸阅读 800 附录A UNIX基础 801 附录B 重启库 819 附录C UICI实现 829 附录D 日志函数 846 附录E POSIX扩展 864 参考文献 867 |