Unix/linux编程实践教程 PDF电子书


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

连接与游戏

立 即 下 载

相关资源

发表评论

点 击 提 交