CHINESE

Unix/Linux编程实践教程

Book information

Publisher
清华大学出版社
Year
2004
ISBN
9787302096139
Language
chinese
Format
PDF
Filesize
62 MB (65019358 bytes)
Pages
515\515
Time added
2021-10-10 08:42:34

Description

操作系统是计算机最重要的系统软件。Unix操作系统历经了几十年,至今仍是主流的操作系统。本书通过解释Unix的工作原理,循序渐进地讲解实现Unix中系统命令的方法,让读者理解并逐步精通Unix系统编程,进而具有编制Unix应用程序的能力。书中采用启发式、举一反三、图示讲解等多种方法讲授,语言生动、结构合理、易于理解。每一章后均附有大量的习题和编程练习,以供参考。 本书适合作为高等院校计算机及相关专业的教材和教学参考书,亦可作为有一定系统编程基础的开发人员的自学教材和参考手册。 封面 书名 版权 前言 第1章 Unix系统编程概述 1.1 介绍 1.2 什么是系统编程 1.2.1简单的程序模型 1.2.2系统模型 1.2.3操作系统的职责 1.2.4为程序提供服务 1.3理解系统编程 1.3.1 系统资源 1.3.2 目标:理解系统编程 1.3.3方法:通过三个问题来理解 1.4从用户的角度来理解Unix 1.4.1 Unix能做些什么 1.4.2登录-运行程序-注销 1.4.3 目录操作 1.4.4文件操作 1.5从系统的角度来看Unix 1.5.1用户和程序之间的连接方式 1.5.2 网络桥牌 1.5.3 bc:Unix的计算器 1.5.4从bc/dc到Web 1.6动手实践 1.7工作步骤与概要图 1.7.1接下来的工作步骤 1.7.2 Unix的概要图 1.7.3 Unix的发展历程 小结 第2章 用户、文件操作与联机帮助:编写who命令 2.1介绍 2.2关于命令who 2.3 问题1:who命令能做些什么 2.4问题2:who命令是如何工作的 2.5 问题3:如何编写who 2.5.1 问题:如何从文件中读取数据结构 2.5.2 答案:使用open、read和close 2.5.3 编写who1.c 2.5.4 显示登录信息 2.5.5 编写who2.c 2.5.6 回顾与展望 2.6 编写cp(读和写) 2.6.1 问题1:cp命令能做些什么 2.6.2问题2:cp命令是如何创建/重写文件的 2.6.3问题3:如何编写cp 2.6.4 Unix编程看起来好像很简单 2.7提高文件I/O效率的方法:使用缓冲 2.7.1缓冲区的大小对性能的影响 2.7.2为什么系统调用需要很多时间 2.7.3低效率的who2.c 2.7.4在who2.c中运用缓冲技术 2.8内核缓冲技术 2.9文件读写 2.9.1注销过程:做了些什么 2.9.2注销过程:如何工作的 2.9.3改变文件的当前位置 2.9.4编写终端注销的代码 2.10处理系统调用中的错误 小结 第3章 目录与文件属性:编写Is 3.1介绍 3.2问题1:ls命令能做什么 3.2.1 1s可以列出文件名和文件的属性 3.2.2列出指定目录或文件的信息 3.2.3经常用到的命令行选项 3.2.4问题1的答案 3.3文件树 3.4问题2:ls是如何工作的 3.4.1什么是目录 3.4.2是否可以用open、read和close来操作目录 3.4.3如何读目录的内容 3.5问题3:如何编写ls 3.6编写ls-l 3.6.1 问题1:ls-l能做些什么 3.6.2问题2:ls-l是如何工作的 3.6.3用stat得到文件信息 3.6.4 stat提供的其他信息 3.6.5如何实现 3.6.6将模式字段转换成字符 3.6.7将用户/组ID转换成字符串 3.6.8 编写ls2.c 3.7三个特殊的位 3.7.1 set-user-ID位 3.7.2 set-group-ID位 3.7.3 sticky位 3.7.4用ls-1看到的特殊属性 3.8 ls小结 3.9设置和修改文件的属性 3.9.1文件类型 3.9.2许可位与特殊属性位 3.9.3文件的链接数 3.9.4文件所有者与组 3.9.5文件大小 3.9.6 时间 3.9.7文件名 小结 第4章 文件系统:编写pwd 4.1介绍 4.2从用户的角度看文件系统 4.2.1 目录和文件 4.2.2 目录命令 4.2.3文件操作命令 4.2.4针对目录树的命令 4.2.5 目录树的深度几乎没有限制 4.2.6 Unix文件系统小结 4.3 Unix文件系统的内部结构 4.3.1第一层抽象:从磁盘到分区 4.3.2第二层抽象:从磁盘到块序列 4.3.3第三层抽象:从块序列到三个区域的划分 4.3.4文件系统的实现:创建一个文件的过程 4.3.5文件系统的实现:目录的工作过程 4.3.6文件系统的实现:cat命令的工作原理 4.3.7 i-节点和大文件 4.3.8 Unix文件系统的改进 4.4理解目录 4.4.1理解目录结构 4.4.2与目录树相关的命令和系统调用 4.5编写pwd 4.5.1 pwd的工作过程 4.5.2 pwd的一种版本 4.6多个文件系统的组合:由多棵树构成的树 4.6.1装载点 4.6.2多重i-节点号和设备交叉链接 4.6.3符号链接 小结 第5章 连接控制:学习stty 5.1为设备编程 5.2设备就像文件 5.2.1设备具有文件名 5.2.2设备和系统调用 5.2.3例子:终端就像文件 5.2.4设备文件的属性 5.2.5编写write程序 5.2.6设备文件和i-节点 5.3设备与文件的不同之处 5.4磁盘连接的属性 5.4.1属性1:缓冲 5.4.2属性2:自动添加模式 5.4.3用open控制文件描述符 5.4.4磁盘连接小结 5.5终端连接的属性 5.5.1终端的I/O并不如此简单 5.5.2终端驱动程序 5.5.3 stty命令 5.5.4编写终端驱动程序:关于设置 5.5.5编写终端驱动程序:关于函数 5.5.6编写终端驱动程序:关于位 5.5.7编写终端驱动程序:几个程序例子 5.5.8终端连接小结 5.6其他设备编程:ioctl 5.7文件、设备和流 小结 第6章 为用户编程:终端控制和信号 6.1软件工具与针对特定设备编写的程序 6.2终端驱动程序的模式 6.2.1规范模式:缓冲和编辑 6.2.2非规范处理 6.2.3终端模式小结 6.3编写一个用户程序:play_again.c 6.4信号 6.4.1 Ctrl-C做什么 6.4.2信号是什么 6.4.3进程该如何处理信号 6.4.4信号处理的例子 6.5为处理信号做准备:play_again4.c 6.6进程终止 6.7为设备编程 小结 第7章 事件驱动编程:编写一个视频游戏 7.1视频游戏和操作系统 7.2任务:单人弹球游戏(Pong) 7.3屏幕编程:curses库 7.3.1介绍curses 7.3.2 curses内部:虚拟和实际屏幕 7.4 时间编程:sleep 7.5时钟编程1:Alarms 7.5.1添加时延:sleep 7.5.2 sleep()是如何工作的:使用Unix中的Alarms 7.5.3调度将要发生的动作 7.6时间编程2:间隔计时器 7.6.1添加精度更高的时延:usleep 7.6.2三种计时器:真实、进程和实用 7.6.3两种间隔:初始和重复 7.6.4用间隔计时器编程 7.6.5计算机有几个时钟 7.6.6计时器小结 7.7信号处理1:使用signal 7.7.1早期的信号处理机制 7.7.2处理多个信号 7.7.3测试多个信号 7.7.4信号机制其他的弱点 7.8信号处理2:sigaction 7.8.1处理多个信号:sigaction 7.8.2信号小结 7.9 防止数据损毁(Data Corruption) 7.9.1数据损毁的例子 7.9.2临界区(Critical Sections) 7.9.3阻塞信号:sigprocmask和sigsetops 7.9.4重入代码(Reentrant Code):递归调用的危险 7.9.5视频游戏中的临界区 7.10 kill:从另一个进程发送的信号 7.11使用计时器和信号:视频游戏 7.11.1 bou nceld.c:在一条线上控制动画 7.11.2 bounce2d.c:两维动画 7.11.3完成游戏 7.12输入信号:异步I/O 7.12.1使用异步I/O 7.12.2 方法1:使用O_ASYNC 7.12.3方法2:使用aio_read 7.12.4弹球程序中需要异步读入吗 7.12.5异步输入、视频游戏和操作系统 小结 第8章 进程和程序:编写命令解释器sh 8.1进程=运行中的程序 8.2通过命令ps学习进程 8.2.1 系统进程 8.2.2进程管理和文件管理 8.2.3内存和程序 8.3 shell:进程控制和程序控制的一个工具 8.4 shell是如何运行程序的 8.4.1 shell的主循环 8.4.2 问题1:一个程序如何运行另一个程序 8.4.3问题2:如何建立新的进程 8.4.4问题3:父进程如何等待子进程的退出 8.4.5小结:shell如何运行程序 8.5实现一个shell:psh2.c 8.6思考:用进程编程 8.7 exit和exec的其他细节 8.7.1进程死亡:exit和_exit 8.7.2 exec家族 小结 第9章 可编程的shell、shell变量和环境:编写自己的shell 9.1 shell编程 9.2什么是以及为什么要使用shell脚本语言 9.3 smshl——命令行解析 9.4 shell中的流程控制 9.4.1 if语句做些什么 9.4.2 if是如何工作的 9.4.3在smsh中增加if 9.4.4 smsh2.c:修改后的代码 9.5 shell变量:局部和全局 9.5.1使用shell变量 9.5.2变量的存储 9.5.3 增加变量命令:Built-ins 9.5.4效果如何 9.6环境:个性化设置 9.6.1使用环境 9.6.2什么是环境以及它是如何工作的 9.6.3在smsh中增加环境处理 9.6.4 varlib.c的代码 9.7 已实现的shell的功能 小结 第10章 I/O重定向和管道 10.1 shell编程 10.2一个shell应用程序:监视系统用户 10.3 标准I/O与重定向的若干概念 10.3.1概念1:3个标准文件描述符 10.3.2默认的连接:tty 10.3.3程序都输出到stdout 10.3.4重定向I/O的是shell而不是程序 10.3.5理解I/O重定向 10.3.6概念2:“最低可用文件描述符(Lowest-Available-fd)”原则 10.3.7两个概念的结合 10.4如何将stdin定向到文件 10.4.1方法1:close then open 10.4.2方法2:open..close..dup..close 10.4.3系统调用dup小结 10.4.4方法3:open..dup2..close 10.4.5 shell为其他程序重定向stdin 10.5为其他程序重定向I/O:who>userlist 10.6管道编程 10.6.1创建管道 10.6.2使用fork来共享管道 10.6.3使用pipe、fork以及exec 10.6.4技术细节:管道并非文件 小结 第11章 连接到近端或远端的进程:服务器与Socket(套接字) 11.1产品和服务 11.2一个简单的比喻:饮料机接口 11.3 bc:Unix中使用的计算器 11.3.1 编写bc:pipe、fork、dup、exec 11.3.2对协同进程的讨论 11.3.3 fdopen:让文件描述符像文件一样使用 11.4 popen:让进程看似文件 11.4.1 popen的功能 11.4.2实现popen:使用fdopen命令 11.4.3访问数据:文件、应用程序接口(API)和服务器 11.5 socket:与远端进程相连 11.5.1类比:“电话中传来声音:现在时间是 11.5.2 因特网时间、DAP和天气服务器 11.5.3服务列表:众所周知的端口 11.5.4编写timeserv.c:时间服务器 11.5.5测试timeserv.c 11.5.6编写timeclnt.c:时间服务客户端 11.5.7测试timeclnt.c 11.5.8另一种服务器:远程的ls 11.6软件精灵 小结 第12章 连接和协议:编写Web服务器 12.1服务器设计重点 12.2三个主要操作 12.3操作1和操作2:建立连接 12.3.1操作1:建立服务器端socket 12.3.2操作2:建立到服务器的连接 12.3.3 socklib.c 12.4操作3:客户/服务器的会话 12.4.1使用socklib.c的timeserv/timeclnt 12.4.2第2版的服务器:使用fork 12.4.3服务器的设计问题:DIY或代理 12.5编写Web服务器 12.5.1 Web服务器功能 12.5.2设计Web服务器 12.5.3 Web服务器协议 12.5.4编写Web服务器 12.5.5运行Web服务器 12.5.6 Webserv的源程序 12.5.7比较Web服务器 小结 第13章 基于数据报(Datagram)的编程:编写许可证服务器① 13.1软件控制 13.2许可证控制简史 13.3一个非计算机系统实例:轿车管理系统 13.3.1轿车钥匙管理描述 13.3.2用客户/服务器方式管理轿车 13.4许可证管理 13.4.1许可证服务系统:它做些什么 13.4.2许可证服务系统:如何工作 13.4.3一个通信系统的例子 13.5数据报socket 13.5.1流与数据报的比较 13.5.2数据报编程 13.5.3 sendto和recvfrom的小结 13.5.4数据报应答 13.5.5数据报小结 13.6许可证服务器版本1.0 13.6.1客户端版本1 13.6.2服务器端版本1 13.6.3测试版本1 13.6.4进一步的工作 13.7处理现实的问题 13.7.1处理客户端崩溃 13.7.2处理服务器崩溃 13.7.3测试版本2 13.8分布式许可证服务器 13.9 Unix 域socket 13.9.1文件名作为socket地址 13.9.2使用Unix域socket编程 13.10小结:socket和服务器 小结 第14章 线程机制:并发函数的使用 14.1 同一时刻完成多项任务 14.2函数的执行路线 14.2.1一个单线程程序 14.2.2一个多线程程序 14.2.3相关函数小结 14.3线程间的分工合作 14.3.1 例1:incrprint.c 14.3.2 例2:twordcount.c 14.3.3线程内部的分工合作:小结 14.4线程与进程 14.5线程间互通消息 14.5.1通知选举中心 14.5.2使用条件变量编写程序 14.5.3使用条件变量的函数 14.5.4 回到Web服务器的例子 14.6多线程的Web服务器 14.6.1 Web服务器程序的改进 14.6.2多线程版本允许一个新的功能 14.6.3 防止僵尸线程(Zombie Threads):独立线程 14.6.4 Web服务器代码 14.7线程和动画 14.7.1使用线程的优点 14.7.2多线程版本的bounceld.c 14.7.3基于多线程机制的多重动画:tanimate.c 14.7.4 tanimate.c中的互斥量 14.7.5屏幕控制线程 小结 第15章 进程间通信(IPC) 15.1编程方式的选择 15.2 talk命令:从多个数据源读取数据 15.2.1 同时从两个文件描述符读取数据 15.2.2 select系统调用 15.2.3 select与talk 15.2.4 select与poll 15.3通信的选择 15.3.1一个问题的三种解决方案 15.3.2通过文件的进程间通信 15.3.3命名管道 15.3.4共享内存 15.3.5各种进程间通信方法的比较 15.4进程之间的分工合作 15.4.1文件锁 15.4.2信号量(Semaphores) 15.4.3 socket及FIFO与共享的存储 15.5打印池 15.5.1多个写者、一个读者 15.5.2客户/服务器模型 15.6纵观IPC 15.7连接与游戏 小结 第1章 Unix系统编程概述 1.1 介绍 1.2 什么是系统编程 1.2.1简单的程序模型 1.2.2系统模型 1.2.3操作系统的职责 1.2.4为程序提供服务 1.3理解系统编程 1.3.1 系统资源 1.3.2 目标:理解系统编程 1.3.3方法:通过三个问题来理解 1.4从用户的角度来理解Unix 1.4.1 Unix能做些什么 1.4.2登录-运行程序-注销 1.4.3 目录操作 1.4.4文件操作 1.5从系统的角度来看Unix 1.5.1用户和程序之间的连接方式 1.5.2 网络桥牌 1.5.3 bc:Unix的计算器 1.5.4从bc/dc到Web 1.6动手实践 1.7工作步骤与概要图 1.7.1接下来的工作步骤 1.7.2 Unix的概要图 1.7.3 Unix的发展历程 小结 第2章 用户、文件操作与联机帮助:编写who命令 2.1介绍 2.2关于命令who 2.3 问题1:who命令能做些什么 2.4问题2:who命令是如何工作的 2.5 问题3:如何编写who 2.5.1 问题:如何从文件中读取数据结构 2.5.2 答案:使用open、read和close 2.5.3 编写who1.c 2.5.4 显示登录信息 2.5.5 编写who2.c 2.5.6 回顾与展望 2.6 编写cp(读和写) 2.6.1 问题1:cp命令能做些什么 2.6.2问题2:cp命令是如何创建/重写文件的 2.6.3问题3:如何编写cp 2.6.4 Unix编程看起来好像很简单 2.7提高文件I/O效率的方法:使用缓冲 2.7.1缓冲区的大小对性能的影响 2.7.2为什么系统调用需要很多时间 2.7.3低效率的who2.c 2.7.4在who2.c中运用缓冲技术 2.8内核缓冲技术 2.9文件读写 2.9.1注销过程:做了些什么 2.9.2注销过程:如何工作的 2.9.3改变文件的当前位置 2.9.4编写终端注销的代码 2.10处理系统调用中的错误 小结 第3章 目录与文件属性:编写Is 3.1介绍 3.2问题1:ls命令能做什么 3.2.1 1s可以列出文件名和文件的属性 3.2.2列出指定目录或文件的信息 3.2.3经常用到的命令行选项 3.2.4问题1的答案 3.3文件树 3.4问题2:ls是如何工作的 3.4.1什么是目录 3.4.2是否可以用open、read和close来操作目录 3.4.3如何读目录的内容 3.5问题3:如何编写ls 3.6编写ls-l 3.6.1 问题1:ls-l能做些什么 3.6.2问题2:ls-l是如何工作的 3.6.3用stat得到文件信息 3.6.4 stat提供的其他信息 3.6.5如何实现 3.6.6将模式字段转换成字符 3.6.7将用户/组ID转换成字符串 3.6.8 编写ls2.c 3.7三个特殊的位 3.7.1 set-user-ID位 3.7.2 set-group-ID位 3.7.3 sticky位 3.7.4用ls-1看到的特殊属性 3.8 ls小结 3.9设置和修改文件的属性 3.9.1文件类型 3.9.2许可位与特殊属性位 3.9.3文件的链接数 3.9.4文件所有者与组 3.9.5文件大小 3.9.6 时间 3.9.7文件名 小结 第4章 文件系统:编写pwd 4.1介绍 4.2从用户的角度看文件系统 4.2.1 目录和文件 4.2.2 目录命令 4.2.3文件操作命令 4.2.4针对目录树的命令 4.2.5 目录树的深度几乎没有限制 4.2.6 Unix文件系统小结 4.3 Unix文件系统的内部结构 4.3.1第一层抽象:从磁盘到分区 4.3.2第二层抽象:从磁盘到块序列 4.3.3第三层抽象:从块序列到三个区域的划分 4.3.4文件系统的实现:创建一个文件的过程 4.3.5文件系统的实现:目录的工作过程 4.3.6文件系统的实现:cat命令的工作原理 4.3.7 i-节点和大文件 4.3.8 Unix文件系统的改进 4.4理解目录 4.4.1理解目录结构 4.4.2与目录树相关的命令和系统调用 4.5编写pwd 4.5.1 pwd的工作过程 4.5.2 pwd的一种版本 4.6多个文件系统的组合:由多棵树构成的树 4.6.1装载点 4.6.2多重i-节点号和设备交叉链接 4.6.3符号链接 小结 第5章 连接控制:学习stty 5.1为设备编程 5.2设备就像文件 5.2.1设备具有文件名 5.2.2设备和系统调用 5.2.3例子:终端就像文件 5.2.4设备文件的属性 5.2.5编写write程序 5.2.6设备文件和i-节点 5.3设备与文件的不同之处 5.4磁盘连接的属性 5.4.1属性1:缓冲 5.4.2属性2:自动添加模式 5.4.3用open控制文件描述符 5.4.4磁盘连接小结 5.5终端连接的属性 5.5.1终端的I/O并不如此简单 5.5.2终端驱动程序 5.5.3 stty命令 5.5.4编写终端驱动程序:关于设置 5.5.5编写终端驱动程序:关于函数 5.5.6编写终端驱动程序:关于位 5.5.7编写终端驱动程序:几个程序例子 5.5.8终端连接小结 5.6其他设备编程:ioctl 5.7文件、设备和流 小结 第6章 为用户编程:终端控制和信号 6.1软件工具与针对特定设备编写的程序 6.2终端驱动程序的模式 6.2.1规范模式:缓冲和编辑 6.2.2非规范处理 6.2.3终端模式小结 6.3编写一个用户程序:play_again.c 6.4信号 6.4.1 Ctrl-C做什么 6.4.2信号是什么 6.4.3进程该如何处理信号 6.4.4信号处理的例子 6.5为处理信号做准备:play_again4.c 6.6进程终止 6.7为设备编程 小结 第7章 事件驱动编程:编写一个视频游戏 7.1视频游戏和操作系统 7.2任务:单人弹球游戏(Pong) 7.3屏幕编程:curses库 7.3.1介绍curses 7.3.2 curses内部:虚拟和实际屏幕 7.4 时间编程:sleep 7.5时钟编程1:Alarms 7.5.1添加时延:sleep 7.5.2 sleep()是如何工作的:使用Unix中的Alarms 7.5.3调度将要发生的动作 7.6时间编程2:间隔计时器 7.6.1添加精度更高的时延:usleep 7.6.2三种计时器:真实、进程和实用 7.6.3两种间隔:初始和重复 7.6.4用间隔计时器编程 7.6.5计算机有几个时钟 7.6.6计时器小结 7.7信号处理1:使用signal 7.7.1早期的信号处理机制 7.7.2处理多个信号 7.7.3测试多个信号 7.7.4信号机制其他的弱点 7.8信号处理2:sigaction 7.8.1处理多个信号:sigaction 7.8.2信号小结 7.9 防止数据损毁(Data Corruption) 7.9.1数据损毁的例子 7.9.2临界区(Critical Sections) 7.9.3阻塞信号:sigprocmask和sigsetops 7.9.4重入代码(Reentrant Code):递归调用的危险 7.9.5视频游戏中的临界区 7.10 kill:从另一个进程发送的信号 7.11使用计时器和信号:视频游戏 7.11.1 bou nceld.c:在一条线上控制动画 7.11.2 bounce2d.c:两维动画 7.11.3完成游戏 7.12输入信号:异步I/O 7.12.1使用异步I/O 7.12.2 方法1:使用O_ASYNC 7.12.3方法2:使用aio_read 7.12.4弹球程序中需要异步读入吗 7.12.5异步输入、视频游戏和操作系统 小结 第8章 进程和程序:编写命令解释器sh 8.1进程=运行中的程序 8.2通过命令ps学习进程 8.2.1 系统进程 8.2.2进程管理和文件管理 8.2.3内存和程序 8.3 shell:进程控制和程序控制的一个工具 8.4 shell是如何运行程序的 8.4.1 shell的主循环 8.4.2 问题1:一个程序如何运行另一个程序 8.4.3问题2:如何建立新的进程 8.4.4问题3:父进程如何等待子进程的退出 8.4.5小结:shell如何运行程序 8.5实现一个shell:psh2.c 8.6思考:用进程编程 8.7 exit和exec的其他细节 8.7.1进程死亡:exit和_exit 8.7.2 exec家族 小结 第9章 可编程的shell、shell变量和环境:编写自己的shell 9.1 shell编程 9.2什么是以及为什么要使用shell脚本语言 9.3 smshl——命令行解析 9.4 shell中的流程控制 9.4.1 if语句做些什么 9.4.2 if是如何工作的 9.4.3在smsh中增加if 9.4.4 smsh2.c:修改后的代码 9.5 shell变量:局部和全局 9.5.1使用shell变量 9.5.2变量的存储 9.5.3 增加变量命令:Built-ins 9.5.4效果如何 9.6环境:个性化设置 9.6.1使用环境 9.6.2什么是环境以及它是如何工作的 9.6.3在smsh中增加环境处理 9.6.4 varlib.c的代码 9.7 已实现的shell的功能 小结 第10章 I/O重定向和管道 10.1 shell编程 10.2一个shell应用程序:监视系统用户 10.3 标准I/O与重定向的若干概念 10.3.1概念1:3个标准文件描述符 10.3.2默认的连接:tty 10.3.3程序都输出到stdout 10.3.4重定向I/O的是shell而不是程序 10.3.5理解I/O重定向 10.3.6概念2:“最低可用文件描述符(Lowest-Available-fd)”原则 10.3.7两个概念的结合 10.4如何将stdin定向到文件 10.4.1方法1:close then open 10.4.2方法2:open..close..dup..close 10.4.3系统调用dup小结 10.4.4方法3:open..dup2..close 10.4.5 shell为其他程序重定向stdin 10.5为其他程序重定向I/O:who>userlist 10.6管道编程 10.6.1创建管道 10.6.2使用fork来共享管道 10.6.3使用pipe、fork以及exec 10.6.4技术细节:管道并非文件 小结 第11章 连接到近端或远端的进程:服务器与Socket(套接字) 11.1产品和服务 11.2一个简单的比喻:饮料机接口 11.3 bc:Unix中使用的计算器 11.3.1 编写bc:pipe、fork、dup、exec 11.3.2对协同进程的讨论 11.3.3 fdopen:让文件描述符像文件一样使用 11.4 popen:让进程看似文件 11.4.1 popen的功能 11.4.2实现popen:使用fdopen命令 11.4.3访问数据:文件、应用程序接口(API)和服务器 11.5 socket:与远端进程相连 11.5.1类比:“电话中传来声音:现在时间是 11.5.2 因特网时间、DAP和天气服务器 11.5.3服务列表:众所周知的端口 11.5.4编写timeserv.c:时间服务器 11.5.5测试timeserv.c 11.5.6编写timeclnt.c:时间服务客户端 11.5.7测试timeclnt.c 11.5.8另一种服务器:远程的ls 11.6软件精灵 小结 第12章 连接和协议:编写Web服务器 12.1服务器设计重点 12.2三个主要操作 12.3操作1和操作2:建立连接 12.3.1操作1:建立服务器端socket 12.3.2操作2:建立到服务器的连接 12.3.3 socklib.c 12.4操作3:客户/服务器的会话 12.4.1使用socklib.c的timeserv/timeclnt 12.4.2第2版的服务器:使用fork 12.4.3服务器的设计问题:DIY或代理 12.5编写Web服务器 12.5.1 Web服务器功能 12.5.2设计Web服务器 12.5.3 Web服务器协议 12.5.4编写Web服务器 12.5.5运行Web服务器 12.5.6 Webserv的源程序 12.5.7比较Web服务器 小结 第13章 基于数据报(Datagram)的编程:编写许可证服务器① 13.1软件控制 13.2许可证控制简史 13.3一个非计算机系统实例:轿车管理系统 13.3.1轿车钥匙管理描述 13.3.2用客户/服务器方式管理轿车 13.4许可证管理 13.4.1许可证服务系统:它做些什么 13.4.2许可证服务系统:如何工作 13.4.3一个通信系统的例子 13.5数据报socket 13.5.1流与数据报的比较 13.5.2数据报编程 13.5.3 sendto和recvfrom的小结 13.5.4数据报应答 13.5.5数据报小结 13.6许可证服务器版本1.0 13.6.1客户端版本1 13.6.2服务器端版本1 13.6.3测试版本1 13.6.4进一步的工作 13.7处理现实的问题 13.7.1处理客户端崩溃 13.7.2处理服务器崩溃 13.7.3测试版本2 13.8分布式许可证服务器 13.9 Unix 域socket 13.9.1文件名作为socket地址 13.9.2使用Unix域socket编程 13.10小结:socket和服务器 小结 第14章 线程机制:并发函数的使用 14.1 同一时刻完成多项任务 14.2函数的执行路线 14.2.1一个单线程程序 14.2.2一个多线程程序 14.2.3相关函数小结 14.3线程间的分工合作 14.3.1 例1:incrprint.c 14.3.2 例2:twordcount.c 14.3.3线程内部的分工合作:小结 14.4线程与进程 14.5线程间互通消息 14.5.1通知选举中心 14.5.2使用条件变量编写程序 14.5.3使用条件变量的函数 14.5.4 回到Web服务器的例子 14.6多线程的Web服务器 14.6.1 Web服务器程序的改进 14.6.2多线程版本允许一个新的功能 14.6.3 防止僵尸线程(Zombie Threads):独立线程 14.6.4 Web服务器代码 14.7线程和动画 14.7.1使用线程的优点 14.7.2多线程版本的bounceld.c 14.7.3基于多线程机制的多重动画:tanimate.c 14.7.4 tanimate.c中的互斥量 14.7.5屏幕控制线程 小结 第15章 进程间通信(IPC) 15.1编程方式的选择 15.2 talk命令:从多个数据源读取数据 15.2.1 同时从两个文件描述符读取数据 15.2.2 select系统调用 15.2.3 select与talk 15.2.4 select与poll 15.3通信的选择 15.3.1一个问题的三种解决方案 15.3.2通过文件的进程间通信 15.3.3命名管道 15.3.4共享内存 15.3.5各种进程间通信方法的比较 15.4进程之间的分工合作 15.4.1文件锁 15.4.2信号量(Semaphores) 15.4.3 socket及FIFO与共享的存储 15.5打印池 15.5.1多个写者、一个读者 15.5.2客户/服务器模型 15.6纵观IPC 15.7连接与游戏 小结

Similar books