【Unix】电子书 - Unix-Linux编程实践教程-其他开发书籍论坛-IT电子书-IT面试吧

【Unix】电子书 - Unix-Linux编程实践教程

该帖子部分内容已隐藏
付费阅读
金币 3
此内容为付费阅读,请付费后查看

书籍封面

书籍目录

封面

书名

版权

前言

第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连接与游戏

小结

下载地址

请登录后发表评论

    没有回复内容