书籍封面
书籍目录
封面
书名
版权
前言
第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连接与游戏
小结
没有回复内容