Unix/Linux 编程实践教程.PDF,作者:Bruce Molay(美),翻译:杨宗源、黄海涛,出版:清华大学出版社。 内容预览: 第一章 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 的发展历程 小结 第二章 用户、文件操作与联机帮助:编写 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 编写 whol,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 处理系统调用中的错误 小结 第三章 目录与文件属性:编写 ls 3.1 介绍 3.2 问题 1:ls 命令能做什么 3.2.1 ls 可以列出文件名和文件的属性 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 -l 看到的特殊属性 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 文件名 小结 第四章 文件系统:编写 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 符号链接 小结 第五章 连接控制:学习 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.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.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 重入代码(Reectrant Code):递归调用的危险 7.9.5 视频游戏中的临界区 7.10 kill:从另一个进程发送的信号 7.11 使用计时器和信号:视频游戏 7.11.1 bounce1d.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 异步输入、视频游戏和操作系统 小结 第八章 进程和程序:编写命令解释器 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 家族 小结 第九章 可编程的 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 的功能 小结 第十章 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 技术细节:管道并非文件 小结 第十一章 连接到近端或远端的进程:服务器与 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 编写 timeserv.c:时间服务器客户端 11.5.7 测试 timeclnt.c 11.5.8 另一种服务器:远程的 ls 11.6 软件精灵 小结 第十二章 连接和协议:编写 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 版的服务器:使用 fock 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 服务器 小结 第十三章 基于数据报(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.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 防止僵尸线程(Zombic 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 屏幕控制线程 小结 第十五章 进程间通信(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











- 粉丝: 7101
- 资源: 509

我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
已下载
下载帮助


- 1
- 2
- 3
- 4
- 5
- 6
- 19
前往页