Unix/linux编程实践教程 PDF电子书
Unix环境高级编程虽然是一本很经典的案头必备的书籍,但它更像是一本字典,对于初学者来说看起来很艰难,《Unix/Linux编程实践教程》中有趣的实例与循序渐进的讲解,我认为更适合初学者的学习
【课程目录】
第1章:unix系统编程概述
介绍
什么是系统编程
简单的程序模型
系统模型
操作系统的职责
为程序提供服务
理解系统编程
系统资源
目标:理解系统编程
方法:通过三个问题来理解
从用户的角度来理解unix
unix能做些什么
登录--运行程序--注销
目录操作
文件操作
从系统的角度来看unix
用户和程序之间的连接方式
网络桥牌
bc:unix的计算器
从bc/dc到web
动手实践
工作步骤与概要图
接下来的工作步骤
unix的概要图
unix的发展历程
第2章:用户、文件操作与联机帮助:编写who命令
介绍
关于命令who
问题1:who命令能做些什么
问题2:who命令是如何工作的
问题3:如何编写who
问题:如何从文件中读取数据结构
答案:使用open、read和close
编写wh01.c
显示登录信息
编写wh02.c
回顾与展望
编写cp(读和写)
问题1:cp命令能做些什么
问题2:cp命令是如何创建/重写文件的
问题3:如何编写cp
unix编程看起来好像很简单
提高文件i/o效率的方法:使用缓冲
缓冲区的大小对性能的影响
为什么系统调用需要很多时间
低效率的wh02.c
在wh02.c中运用缓冲技术
内核缓冲技术
文件读写
注销过程:做了些什么
注销过程:如何工作的
改变文件的当前位置
编写终端注销的代码
处理系统调用中的错误
第3章:目录与文件属性:编写ls
介绍
问题1:1s命令能做什么
1s可以列出文件名和文件的属性
列出指定目录或文件的信息
经常用到的命令行选项
问题1的答案
文件树
问题2:1s是如何工作的
什么是目录
是否可以用open、read和close来操作目录
如何读目录的内容
问题3:如何编写ls
编写ls-1
问题1:ls-1能做些什么
问题2:ls-1是如何工作的
用stat得到文件信息
stat提供的其他信息
如何实现
将模式字段转换成字符
将用户/组id转换成字符串
编写ls2.c
三个特殊的位
set-user-id位
set-group-id位
sticky位
用ls-1看到的特殊属性
ls小结
设置和修改文件的属性
文件类型
许可位与特殊属性位
文件的链接数
文件所有者与组
文件大小
时间
文件名
第4章:文件系统:编写pwd
介绍
从用户的角度看文件系统
目录和文件
目录命令
文件操作命令
针对目录树的命令
目录树的深度几乎没有限制
unix文件系统小结
unix文件系统的内部结构
第一层抽象:从磁盘到分区
第二层抽象:从磁盘到块序列
第三层抽象:从块序列到三个区域的划分
文件系统的实现:创建一个文件的过程
文件系统的实现:目录的工作过程
文件系统的实现:cat命令的工作原理
i-节点和大文件
unix文件系统的改进
理解目录
理解目录结构
与目录树相关的命令和系统调用
编写pwd
pwd的工作过程
pwd的一种版本
多个文件系统的组合:由多棵树构成的树
装载点
多重i-节点号和设备交叉链接
符号链接
第5章:连接控制:学习stty
为设备编程
设备就像文件
设备具有文件名
设备和系统调用
例子:终端就像文件
设备文件的属性
编写write程序
设备文件和i-节点
设备与文件的不同之处
磁盘连接的属性
属性1:缓冲
属性2:自动添加模式
用open控制文件描述符
磁盘连接小结
终端连接的属性
终端的i/o并不如此简单
终端驱动程序
stty命令
编写终端驱动程序:关于设置
编写终端驱动程序:关tx数
编写终端驱动程序:关于位
编写终端驱动程序:几个程序例子
终端连接小结
其他设备编程:ioctl
文件、设备和流
第6章:为用户编程:终端控制和信号
软件工具与针对特定设备编写的程序
终端驱动程序的模式
规范模式:缓冲和编辑
非规范处理
终端模式小结
编写一个用户程序:play_again.c
信号
ctrl-c做什么
信号是什么
进程该如何处理信号
信号处理的例子
为处理信号做准备:play_again4.c
进程终止
为设备编程
第7章:事件驱动编程:编写一个视频游戏
视频游戏和操作系统
任务:单人弹球游戏(pong)
屏幕编程:curses库
介绍curses
curses内部:虚拟和实际屏幕
时间编程:sleep
时钟编程1:alarms
添加时延:sleep
sleep()是如何工作的:使用unix中的alarms
调度将要发生的动作
时间编程2:间隔计时器
添加精度更高的时延:usleep
三种计时器:真实、进程和实用
两种间隔:初始和重复
用间隔计时器编程
计算机有几个时钟
计时器小结
信号处理1:使用signal
早期的信号处理机制
处理多个信号
测试多个信号
信号机制其他的弱点
信号处理2:sigaction
处理多个信号:sigaction
信号小结
防止数据损毁(datacorruption)
数据损毁的例子
临界(criticalsections)
阻塞信号:sigprocmask和sigsetops
重入代码(reentrantcode):递归调用的危险
视频游戏中的临界区
kill:从另--个进程发送的信号
使用计时器和信号:视频游戏
bounceld.c:在一条线上控制动画
bounce2d.c:两维动画
完成游戏
输入信号,异步i/o
使用异步i/o
方法1:使用oasync
方法2:使用aio..read
弹球程序中需要异步读人吗
异步输入、视频游戏和操作系统
第8章:进程和程序:编写命令解释器sh
进程=运行中的程序
通过命令ps学习进程
系统进程
进程管理和文件管理
内存和程序
shell:进程控制和程序控制的--个工具
shell是如何运行程序的
shell的主循环
问题1:一个程序如何运行另一个程序
问题2:女口何建立新的进程
问题3:父进程如何等待子进程的退出
小结:shell如何运行程序
实现一个shell:psh2.c
思考:用进程编程
exit和exec的其他细节
进程死亡:exit和_exit
exec家族
第9章:可编程的shell、shell变量和环境:编写自己的shell
shell编程
什么是以及为什么要使用shell脚本语言
smshl--命令行解析
shell中的流程控制
if语句做些什么
if是女口何工作的
在stash中增加if
smsh2.c:修改后的代码
shell变量:局部和全局
使用shell变量
变量的存储
增加变量命令:built-ins
效果如何
环境:个性化设置
使用环境
什么是环境以及它是如何工作的
在smsh中增加环境处理
varlib.c的代码
已实现的shell的功能
第10章:i/o重定向和管道
shell编程
一个shell应用程序:监视系统用户
标准i/o与重定向的若干概念
概念1:3个标准文件描述符
默认的连接:tty
程序都输出到stdout
重定向i/o的是shell而不是程序
理解i/o重定向
概念2:“最低可用文件描述符(lowest-available-fd)”原则
两个概念的结合
如何将stdin定向到文件
方法1:closethenopen
方法2:open..close..dup..close
系统调用dup小结
方法3:open..dup2..close
shell为其他程序重定向stdin
为其他程序重定向i/o:who]userlist
管道编程
创建管道
使用fork来共享管道
使用pipe、fork以及exec
技术细节:管道并非文件
第11章:连接到近端或远端的进程:服务器与socket(套接宇)
产品和服务
一个简单的比喻:饮料机接口
bc:unix中使用的计算器
编写bc:pipe、fork、dup、exec
对协同进程的讨论
fdopen:让文件描述符像文件--样使用
popen-让进程看似文件
popen的功能
实现popen:使用fdopen命令
访问数据:文件、应用程序接el(apl)和服务器
socket:与远端进程相连
类比:“电话中传来声音:现在时间是…”
因特网时间、dap和天气服务器
服务列表:众所周知的端口
编写timeserv . cc时间服务器
测试timeserv.c
编写timecint.c:时间服务客户端
测试timecint.c
另一种服务器:远程的ls
软件精灵
第12章:连接和协议:编写web服务器
服务器设计重点
三个主要操作
操作1和操作2:建立连接
操作1:建立服务器端socket
操作2:建立到服务器的连接
socklib.c
操作3:客户/服器的会话
使用socklib.c的timeserv/timecint
第2版的服务器:使用fork
服务器的设计问题:diy或代理
编写web服务器
web服务器功能
设计web服务器
web服务器协议
编写web服务器
运行web服务器
webserv的源程序
比较web服务器
第13章:基于数据报(datagram)的编程:编写许可证服务器
软件控制
许可证控制简史
一个非计算机系统实例:轿车管理系统
轿车钥匙管理描述
用客户/服务器方式管理轿车
许可证管理
许可证服务系统:它做些什么
许可证服务系统:如何工作
一个通信系统的例子
数据报socket
流与数据报的比较
数据报编程
sendto和recvfrom的小结
数据报应答
数据报小结
许可证服务器版本1.0
客户端版本1
服务器端版本1
测试版本1
进一步的工作
处理现实的问题
处理客户端崩溃
处理服务器崩溃
测试版本2
分布式许可证服务器
unix域socket
文件名作为socket地址
使用unix域socket编程
小结;socket和服务器
第14章:线程机制:并发函数的使用
同一时刻完成多项任务
函数的执行路线
一个单线程程序
一个多线程程序
相关函数小结
线程间的分工合作
例1:incrprint.c
例2:twordcount.c
线程内部的分工合作:小结
线程与进程
线程间互通消息
通知选举中心
使用条件变量编写程序
使用条件变量的函数
回到web服务器的例子
多线程的web服务器
web服务器程序的改进
多线程版本允许一个新的功能
防止僵尸线程(zombiethreads):独立线程
web服务器代码
线程和动画
使用线程的优点
多线程版本的bouneeld.c
基于多线程机制的多重动画:tanimate.c
tanimate.c中的互斥量
屏幕控制线程
第15章:进程间通信(1pc)
编程方式的选择
talk命令:从多个数据源读取数据
同时从两个文件描述符读取数据
select系统调用
select与talk
select与poll
通信的选择
一个问题的三种解决方案
通过文件的进程间通信
命名管道
共享内存
各种进程间通信方法的比较
进程之间的分工合作
文件锁
信号量(semaphores)
socket及fifo与共享的存储
打印池
多个写者、一个读者
客户/服务器模型
纵观ipc
连接与游戏
相关资源