UNIX/Linux应用、编程与系统管理(第3版)
定 价:99 元
丛书名:国外计算机科学经典教材
- 作者:(美)达斯 著,贾洪峰,李莉 译
- 出版时间:2014/4/1
- ISBN:9787302355847
- 出 版 社:清华大学出版社
- 中图法分类:TP316.8
- 页码:717
- 纸张:胶版纸
- 版次:1
- 开本:16K
- 字数:(单位:千字)
UNIX是计算机发展历史上最成功的操作系统家族。它诞生于贝尔实验室,尔后迅速成为世界上操作系统的主流并延续至今。Linux派生于UNIX,并且在小型机和桌面计算机领域成为和微软的Windows并驾齐驱的操作系统家族。
《UNIX/Linux应用、编程与系统管理(第3版)》兼顾用户和程序员的思路来编写,是终极的UNIX/Linux教材。本书既有教学工具又有详尽的参考资料,非常适合于任何UNIX或Linux相关课程。与类似教材不同的是,本书设置了一个强大的教学框架,能够使入门级的学生牢固地掌握基本概念,而高级主题章节能激发更有经验的读者超越基础知识。书中提供了近千道练习和自测题,用于让学生测试和巩固他们对知识的理解。
一门不能改变思维方式的语言是不值得掌握的。
—Larry Wall(Perl的发明者),Randal Schwartz
早在开始讲授本课程之前,我就决定写一本关于UNIX的书。我对当时市面上的相关书籍都不满意,也几乎没有任何专家可以寻求帮助。在费尽千辛万苦学完本课程之后,我决定写本书,向大家介绍自己的经验,但当时并没有想清楚它应当面向什么样的读者对象。多年之后,在我开始讲授这门课程时却发现,学生们提出的一些问题都已经在我的书中做了解答。这时,我才知道自己做对了,这实际上是一本教科书。
UNIX经受住了时间的考验,而且在今后一段时间内应当仍然如此。但在说起UNIX时,还是有很多人会说它“不够友好”、“让人挠头”。初学者还是会因为它显而易见的复杂性而备感打击。即便是经验丰富的计算机专业人士,也很难再乐于接受它的工作方式,不愿意触碰它的命令行、无数的选项和复杂的语法。今天的所有UNIX和Linux系统都提供了图形用户界面,但命令行仍然是UNIX系统的主干。
UNIX令人激动之处在于它的许多功能都是隐藏的。UNIX并没有把一切都摆在明面上;它鼓励用户去创造、去革新。对于UNIX爱好者来说,如何找出能够完成一项复杂任务的命令组合或脚本,都是真正的挑战。这就是UNIX,而且它最好继续保持这种风格。 如果你欣赏这样一句话——“任何疯狂背后皆有章法可循”,那你也就上道了,这本书就是为你准备的。
与众不同
我最早接触的计算机就是UNIX机,在UNIX系统中摸爬滚打很长一段时间后,我认识到,妨碍理解UNIX的绊脚石并不是人们认为的那些。UNIX之所以不容易理解,并不是因为它太难了,而是因为作者们缺乏足够的想象力,没有为它换一种表现方式。例如,书中经常会给出一条命令的20个选项,而其中可能只有一两项是真正有用的。我在饱受挫折之后,决定自行编写一本“真正”的UNIX书籍——一本知道用户真正需要什么的UNIX书籍,一本用户愿意随身携带的UNIX书籍。
现实示例
UNIX的概念很简单,但也很抽象,为什么要采用某一特定方式来处理某一特定功能,其原因往往不是那么明显。要掌握这一操作系统,就需要全面理解这些概念。我确信已经足够清晰地解释了它的关键特性,既揭示了在设计时的考虑因素,也揭示了它们与现实世界的相关性。你会发现,本书中的许多例子都源于现实生活中的情景。
用户指南与程序员指南 UNIX用户主要有两类,一类用户使用UNIX的原生工具;另一类用户则使用shell脚本和UNIX系统调用库来开发工具。本书足够详细地讨论了这两方面的内容,又使篇幅保持在便于阅读、携带的范围内(在同类书籍中,可能只有本书能做到这一点)。
前11章为“用户”服务,对于导论性的UNIX课程来说,这些内容就足够了。“开发人员”是shell或系统程序员,他们还得知道工作机理,例如在创建或链接一个文件时,目录会受到什么样的影响。为他们着想,前面几章包括了一些用于探究关键概念的特殊加框文字。这种安排应当不会对初学者造成影响,他们可以悄悄地忽略这些部分。第16~18章体现了UNIX的精华,要求系统程序员必须阅读这些章节。
醒目的学习提示 教学提示是本书的一个突出特征。它们有各种不同的名称,例如“注意”、“警告”和“提示”。我认为Linux是UNIX家庭中的一个重要成员,所以特别采用企鹅标记来突出显示Linux特性。
许多作者都是在单独一章中讨论每种shell,我不太赞同这种做法。我主要使用Bash shell来讨论关键概念,然后再分别讨论C shell、Korn shell、Bourne shell的不同之处。
大量习题与练习 本书给出了大量问题,用来测验读者掌握的知识。其中有超过1/3是自测问题,其答案在附录I中给出。这些问题都是面向初学者的,在继续学习下一章之前,应当首先出色地回答这些问题。
难度更大、范围更广的问题留在“习题”部分。其中有一部分的难度很大,可能需要花费一些时间进行求解。这些习题会巩固(往往还会丰富)你的UNIX知识,所以不要忽视它们。这些问题的答案在本书网站上提供:http://www.mhhe.com/das。
新增内容
一些评论者似乎对本书第2版非常满意,他们警告说,再做改进可能不会有“太大收效”。我在牢记这一点的同时,在这一版中进行了以下修改:
●vi/vim一章得以保留,而emacs一章则被压缩,转为附录。为使初学者更轻松地过渡到vi,第3章介绍了pico编辑器。
●bc计算器实用程序在这一版中又回归了,但只是作为shell程序员的一个高效计算工具。
●专门为讨论C语言程序设计的基础知识而增加了一章。尽管有些简略,但有了这一章,就足以理解后面两章的系统程序设计内容了。
●现在的第15章包括了流行的并发版本系统(CVS),所有Linux系统中都可以找到它。SCCS和RCS在这一版中继续保有一席之地,但在下一版,至少会删除它们中的一项。
●由于GNU调试程序(gdb)优于dbx,所以这一版中已经将gdb收纳在内,不过后者依然得以保留。
这些变化使本书的篇幅稍有增加。尽管增加了对Linux和GNU工具的介绍,但本书的通用特性仍然保留下来;它没有专门关注UNIX的任何具体分发版本,而是突出介绍了Solaris和Linux中的各种变型。
组织结构
这一版在逻辑上划分为用户部分和程序设计部分。UNIX基础知识仅限于前11章,这部分内容在讨论联网工具时达到高潮。接下来的7章涵盖了程序设计的相关资料,包括awk、shell程序设计、系统程序设计和perl。
UNIX简介
第1章通过一个简单的实践练习揭示了UNIX的核心概念。接下来是UNIX的发展简史及功能展示。这一章还向读者介绍了kernel和shell,它们共同处理系统的工作负载。在为开发可移植应用程序而构建框架的过程中,一些标准机构(例如POSIX和The Open Group)扮演着重要角色,学习本章之后将会了解这些机构发挥的作用。
第2章介绍了UNIX命令行的结构。它还讨论了使用man命令查询联机文档的技巧。我们将学习使用电子邮件程序,改变密码,并了解系统中发生了什么。我们可能会出错,而且迟早会出错,所以还要知道如何使用键盘进行纠正。
文件
文件是UNIX的两大支柱之一,接下来的三章将讨论文件。第3章讨论了系统中各种类型的文件,以及处理这些文件的命令。我们将学习如何创建目录、在目录结构中导航定位、复制和删除目录中的文件。还将学习如何使用pico编辑器来编辑文件。UNIX还提供了许多压缩实用工具,可以用来节省磁盘空间。
文件拥有属性(特性),第4章介绍了文件的主要属性,特别是用ls -l命令显示的属性。要知道,文件和目录面对攻击都是大门洞开的,所以要学会如何通过管理它们的权限来提供保护。利用链接,以多个名称来访问同一文件。我们可能还会忘记文件的存放位置,所以需要熟悉find命令。
一个人的工作效率还取决于他对编辑器功能的熟悉程度。第5章介绍了vi,它在任何工作环境下都是功能最强大的文本编辑器之一。程序员使用这一编辑器的次数可能比其他任何人都多,所以本章中的大多数例子都采用程序代码段。附录D中对vi的功能进行了总结。
shell和进程 现在需要理解一个非常重要的程序,我们总是和它打交道的,那就是shell。第6章介绍了shell的解释功能,包括它的许多元字符。我们将学习使用通配符,用单个模式来匹配一组类似的文件名。使用重定向和管道来操控命令的输入和输出。shell也是一门编程语言,所以必须要等到第13章才能完全理解它。
第7章介绍了进程,它是UNIX系统的另一支柱。进程与文件类似,也拥有属性。这一章将帮助读者理解如何用fork-exec机制来创建进程,学习控制进程,在前台和后台之间移动它们,还将学习如何通过发送信号来终止进程。
UNIX shell为定制环境提供了很好的机会(第8章)。要理解和使用shell变量、创建命令别名。选择一种提供所有这些功能的合适shell,并学习使用初始化脚本来保存对环境的修改。
过滤器 接下来的两章讨论过滤器——这是UNIX工具包中的一些特殊命令,负责所有文本处理任务。第9章介绍了一些简单的过滤器,并说明它们在相互连接时,如何最为有效。专门有一个示例小节,其中给出了现实生活中的三个应用,它们都是在管道中使用这些过滤器加以解决的。
第10章讨论了两种功能强大的过滤器——grep和sed,它们共同处理所有的模式查找、编辑和替换操作。这里将介绍正则表达式,它是一种精心设计的模式匹配机制,通常会大幅简化查找与替换任务。过滤器内容之后有一章讨论联网工具(第11章),本书第一部分到此结束。
程序设计
后面的7章讨论了UNIX的大多数程序设计功能。在第12章中,awk命令表现得像是一个过滤器和一门程序设计语言。掌握了awk及其标准程序设计构造(例如if、for和while构造),应当就为shell程序设计、perl和C语言程序设计打好了基础。
最后,我们会将所有命令和管道放到shell脚本中。利用第13章讨论的shell程序设计功能,开发交互式与非交互式脚本。学习设计一种脚本,在以不同名字调用这种脚本时,其行为会发生相应变化。对shell程序员来说,本章给出的三个示例脚本是必读内容。
下面4章与C程序设计有着直接或间接的关系。第14章介绍了C语言程序设计的入门知识,这是这一版新增的唯一一章。接下来是程序开发工具(第15章)。利用make实用工具和一种功能强大的调试程序(gdb)来管理和调试程序。另外,还要学习使用SCCS、RCS和CVS来维护一个程序的多个版本。
本书有两章介绍了系统调用在C语言程序设计环境中的应用,第16章是其中的第一章,这一章讨论了与文件和I/O相关的系统调用。编写一些程序,执行面向目录的功能,例如列出文件等,还要学习如何提取和处理存储在inode中的文件属性。
第17章讨论了与进程有关的系统调用。学习使用系统调用中的fork和exec系列来创建进程。一旦理解了内核如何在内存中为已打开文件维护元数据,就能实现重定向和管道,以及如何在程序中处理信号。
我们在第18章遇到了perl,它是UNIX世界中功能最强大的过滤器和脚本设计语言。大多数UNIX概念都内嵌在perl的设计中,许多UNIX用户离开它就什么也做不了,原因就在于此。尽管我们无法在单独一章中充分欣赏perl,但第18章作为一个开端,应当是很有用的。
最后,每个用户都必须了解与系统管理有关的例程任务,第19章讨论了这一领域的基本问题。理解系统提供的重要安全功能。熟悉与系统启动与关闭相关的活动,以及如何加载文件系统,并检查一致性。还要学习如何进行基本的备份操作。
致谢
本书的每一版都使我有机会与新的团队进行合作。本项目的主要推动者是Raghu Srinivasan(全球出版商),同他和Melissa Leick(项目经理)的合作非常愉快。他们在McGraw-Hill指导团队的方式给我留下了深刻印象。我还必须感谢Brenda Rolwes(设计协调者)和Curt Reynolds(他负责营销安排)。还要特别感谢Melinda Bilecki(策划编辑),她一如既往地机敏。她是唯一一位从本书构思阶段就一直参与的人,这种连续性使我受益良多。
还必须感谢审稿者,他们对于本版形式、内容的调整发挥了重要作用:
Ivan Bajic,圣地亚哥州立大学
Bruce Elenbogen,密西根大学迪尔本分校
Ziad Kobti,加拿大温莎大学
Galina Piatnitskaia,密苏里大学圣路易斯分校
Paul Piwowarski,肯塔基大学
Darren Provine,罗文大学
Quazi M. Rahman,加拿大西安大略大学
我要向Deepti Narwat表示最诚挚的谢意,他是负责Cenveo Publisher Services的项目经理,本书的整个生产流程都由他负责。还有其他许多人不能一一提及,但他们都为本书做出了同样的贡献。
最后的“至理名言”
大多数例子都已经在Solaris和Linux上进行了测试,但不能保证它们在所有系统上都可以无错误运行。由于UNIX的分化,实际上不可能在所有UNIX中进行全面测试。如果有一些命令无法以本书说明的方式正常工作,请不要得出系统有bug的结论。不过,这些例子中仍然可能存在bug,欢迎读者指出。
在结束前言之前,应当给出一点提醒建议。许多人都因为思维混乱、受到误导而错过了UNIX班车,现在深以为憾。不要让这件事再发生在你身上。一旦你决定探索UNIX,应当学习利用已有的功能,不要再去重复实现别人已经实现过的重要功能。你很快就会发现,一个充满机会和激情的世界向你张开了怀抱。一定要充满热情和自信地探索这一领域,我与你同在。
Sumitabha Das
SumitabhaDas,获电子工程学位。他在国防部任职时开始对UNIX感兴趣并深入该领域研究。Sumitabha在UNIX实际应用方面积累了丰富的经验,对UNIX有着独到的见解。目前,他致力于讲授UNIX系统和系统开发课程。
第I部分UNIX之用户篇
第1章UNIX简介
1.1操作系统
1.2UNIX操作系统
1.3了解你的计算机
1.4系统管理员
1.5登录和注销
1.5.1登录
1.5.2注销
1.6实践练习
1.6.1用date和who查看系统信息
1.6.2用ps查看进程
1.6.3处理文件
1.6.4处理目录
1.7UNIX的成功之路
第I部分UNIX之用户篇
第1章UNIX简介
1.1操作系统
1.2UNIX操作系统
1.3了解你的计算机
1.4系统管理员
1.5登录和注销
1.5.1登录
1.5.2注销
1.6实践练习
1.6.1用date和who查看系统信息
1.6.2用ps查看进程
1.6.3处理文件
1.6.4处理目录
1.7UNIX的成功之路
1.7.1伯克利:第二学派
1.7.2UNIX的分化
1.7.3互联网
1.7.4Windows的威胁
1.8POSIX和单一UNIX规范
1.9Linux和GNU
1.10UNIX体系结构
1.10.1分工:Kernel和shell
1.10.2文件和进程
1.10.3系统调用
1.11UNIX的功能
1.11.1多用户系统
1.11.2多任务系统
1.11.3应用程序库
1.11.4构建基块方法
1.11.5模式匹配
1.11.6程序设计实用工具
1.11.7文档
1.12小结
1.13自测题
1.14习题
第2章熟悉UNIX命令
2.1命令基础
2.1.1PATH:定位命令
2.1.2命令的存放位置
2.2命令结构
2.3命令应用的灵活性
2.4man:联机帮助
2.4.1导航与查找
2.4.2用man-k和man-f获取更多帮助
2.5man文档
2.5.1了解man页
2.5.2用man来理解man
2.6echo:显示消息
2.7printf:echo的替代命令
2.8script:记录会话
2.9以mailx命令使用电子邮件
2.9.1发送邮件
2.9.2接收邮件
2.9.3mailx内部命令
2.10passwd:改变密码
2.11uname:显示计算机名和操作系统
2.12who:了解用户
2.13date:显示系统日期
2.14stty:在出错时
2.15XWindow系统
2.15.1终端模拟器
2.15.2文件管理器
2.16小结
2.17自测题
2.18习题
第3章文件系统
3.1文件
3.1.1普通(常规)文件
3.1.2目录文件
3.1.3设备文件
3.2文件名中有什么
3.3文件系统的层次结构
3.4UNIX文件系统
3.5随命令一起使用绝对路径名
3.6HOME变量和~:主目录
3.7pwd和cd:在文件系统中导航
3.8相对路径名(.和..)
3.9mkdir:创建目录
3.10rmdir:删除目录
3.11ls:列出文件
3.12cp:复制文件
3.13mv:重命名文件
3.14rm:删除文件
3.15cat:显示和串联文件
3.16more:UNIX分页器
3.17pico:基本文本编辑
3.17.1导航
3.17.2文本编辑
3.18wc:计算行数、字数和字符数
3.19lp:打印文件
3.20od:查看不可打印字符
3.21dos2unix、unix2dos和Tofrodos:在DOS和UNIX之间转换
3.22tar:存档程序
3.23gzip:压缩程序
3.24zip:压缩和存档程序
3.25使用这些命令的其他方式
3.26小结
3.27自测题
3.28习题
第4章文件属性
4.1重温ls(-l):列出文件属性
4.2文件权限
4.3chmod:改变文件权限
4.3.1相对权限
4.3.2绝对赋予权限
4.3.3递推操作(-R)
4.4目录
4.4.1读权限
4.4.2写权限
4.4.3执行权限
4.5umask:默认的文件与目录权限
4.6文件系统和inode
4.7ln:创建硬链接
4.8再论ln:创建符号链接
4.9文件所有权
4.9.1chown:改变文件所有权
4.9.2chgrp:改变用户组所有者
4.9.3如何处理入侵者
4.10修改时间与访问时间
4.11find:定位文件
4.11.1选择准则
4.11.2find操作符(!,-o和-a)
4.11.3操作部分的操作符
4.12小结
4.13自测题
4.14习题
第5章vi/vim编辑器
5.1vi基础
5.2一些提示
5.3输入模式--输入和替换文本
5.3.1插入和追加文本(i和a)
5.3.2在行的两端插入和追加文本(I和A)
5.3.3新建一行(o和O)
5.3.4替换文本(r、s、R和S)
5.3.5输入控制字符([Ctrl-v])
5.4保存文本并退出--ex模式
5.4.1保存工作(:w)
5.4.2保存并退出(:x和:wq)
5.4.3中止编辑(:q)
5.4.4写入选定行
5.4.5退出到shell(:sh和[Ctrl-z])
5.5从崩溃中恢复(:recover和-r)
5.6导航
5.6.14个方向上的相对移动(h、j、k和l)
5.6.2滚动([Ctrl-f]、[Ctrl-b]、[Ctrl-d]和[Ctrl-u])
5.6.3单词导航(b、e和w)
5.6.4移到行的末端(0、|和$)
5.6.5绝对移动(G)
5.7编辑文本,不使用操作符
5.7.1删除文本(x、X和dd)
5.7.2移动文本(p)
5.7.3合并行(J)
5.7.4改变大小写(~)
5.8纠正C程序
5.9用操作符编辑文本
5.9.1删除和移动文本(d、p和P)
5.9.2复制文本(y、p和P)
5.9.3修改文本(c)
5.10在文件之间复制和移动文本
5.11撤消之前的编辑指令(u和U)
5.12查找模式(/和?)
5.13重复上一条命令(.)
5.14替代-查找并替换(:s)
5.15set:定制vi
5.16map:映射键盘的按键
5.17abbr:文本输入的缩写
5.18小结
5.19自测题
5.20习题
第6章shell
6.1作为命令处理器的shell
6.2shell提供的功能
6.3模式匹配--通配符
6.3.1*和?
6.3.2字符类
6.3.3匹配句点
6.3.4综述
6.4转义与引用
6.4.1转义
6.4.2引用
6.4.3在echo中进行转义
6.5重定向
6.5.1标准输入
6.5.2标准输出
6.5.3文件描述符
6.5.4标准错误
6.5.5过滤器--使用标准输入与标准输出
6.6集体处理
6.6.1复制描述符
6.6.2命令分组
6.7/dev/null和/dev/tty:两个独立的文件
6.8管道
6.9tee:创建一个T型三通
6.10命令替换
6.11shell变量
6.11.1引用和转义的影响
6.11.2使用shell变量的场合
6.12shell脚本
6.13shell对命令行的处理
6.14有关通配符的更多信息
6.15xargs:构建动态命令行
6.16小结
6.17自测题
6.18习题
第7章进程
7.1进程基础
7.2shell和init
7.3ps:显示进程属性
7.4系统进程和init
7.5进程创建机制
7.6继承的进程属性
7.7不能使用单独进程的情景
7.8进程状态与僵尸进程(Zombie)
7.9信号处理
7.10在后台运行作业
7.10.1&:不注销
7.10.2nohup:安全注销
7.11作业控制
7.12at和batch:推后执行
7.12.1at:一次执行
7.12.2batch:在批队列中执行作业
7.12.3限制at和batch的使用
7.13cron和crontab:定期运行作业
7.14小结
7.15自测题
7.16习题
第8章shell-定制环境
8.1shell
8.2环境变量
8.3常见环境变量
8.4别名
8.5命令历史记录
8.5.1访问之前的命令
8.5.2在先前命令中进行替换
8.5.3使用上一条命令中的参数($_)
8.5.4历史记录变量
8.6行内命令编辑
8.7~替换
8.8使用set选项
8.9初始化脚本
8.9.1登录脚本
8.9.2rc文件
8.10Cshell
8.10.1局部变量和环境变量
8.10.2别名
8.10.3历史记录
8.10.4其他shell变量
8.10.5初始化脚本
8.11目录栈操作
8.12小结
8.13自测题
8.14习题
第9章简单过滤器
9.1pr:对文件进行编页
9.2对比文件
9.3cmp:逐字节对比
9.4comm:哪些共同内容
9.5diff:将一个文件转换为另一文件
9.6head:显示一个文件的开头
9.7tail:显示文件的末尾
9.8cut:垂直划分文件
9.9paste:粘贴文件
9.10sort:对文件进行排序
9.11uniq:定位重复行和非重复行
9.12tr:变换字符
9.13应用过滤器
9.13.1列出当前目录中5个最大的文件
9.13.2创建一份单词使用情况列表
9.13.3找出两个密码文件之间的差别
9.14小结
9.15自测题
9.16习题
第10章使用正则表达式的过滤器--grep和sed
10.1示例数据库
10.2grep:查找模式
10.2.1grep中的引用
10.2.2grep失败的场合
10.3grep选项
10.4基本正则表达式(BRE)--简介
10.4.1字符类
10.4.2*
10.4.3句点
10.4.4指定模式位置(^和$)
10.4.5元字符失去其意义的情景
10.5扩展正则表达式(ERE)和egrep
10.5.1+和?
10.5.2匹配多种模式(|、(和))
10.6sed:流编辑器
10.7行寻址
10.8sed选项
10.9上下文寻址
10.10将选定行写入文件(w)
10.11文本编辑
10.11.1插入和改变行(i、a、c)
10.11.2删除行(d)
10.12替换(s)
10.12.1在替换中使用正则表达式
10.12.2记忆模式(//)
10.13基本正则表达式回顾
10.13.1重复模式(&)
10.13.2间隔正则表达式(IRE)
10.13.3标记正则表达式(TRE)
10.14应用IRE和TRE
10.14.1处理电话簿
10.14.2用POSIX兼容的函数替换过时的函数
10.14.3变换URL中的路径名
10.15小结
10.16自测题
10.17习题
第11章联网工具
11.1TCP/IP基础知识
11.2解析主机名和IP地址
11.2.1/etc/hosts:主机文件
11.2.2域名系统(DNS)
11.3客户端-服务器:网络应用程序如何通信
11.4ping:检查网络
11.5telnet:远程登录
11.6ftp:文件传输协议
11.6.1基本文件与目录处理
11.6.2传送文件
11.6.3匿名FTP
11.7密码学基础
11.7.1对称密钥算法
11.7.2非对称密钥算法
11.8SSH:安全shell
11.8.1主机验证
11.8.2rhosts/shosts验证机制
11.8.3采用对称算法的用户验证
11.8.4使用SSH代理进行非交互式登录
11.9SSH协议
11.9.1远程登录与执行命令(ssh和slogin)
11.9.2用sftp和scp进行文件传输
11.10互联网邮件
11.11MIME:处理邮件中的二进制附件
11.12在TCP/IP网络上使用XWindow
11.12.1显示器
11.12.2使用DISPLAY变量
11.12.3使用-display选项
11.13HTTP和万维网
11.13.1统一资源定位符(URL)
11.13.2HTTP:Web的协议
11.13.3运行外部程序
11.13.4HTML:网页的语言
11.13.5Web浏览器
11.14Web上的多媒体:重温MIME
11.15小结
11.16自测题
11.17习题
第II部分UNIX之程序员篇
第12章用awk进行过滤和程序设计
12.1awk预备知识
12.2使用print和printf
12.3数字处理
12.4变量和表达式
12.5比较与逻辑运算符
12.5.1字符串和数值比较
12.5.2~和!~:正则表达式运算符
12.5.3逻辑运算符
12.6-f选项:将awk程序存储在文件中
12.7BEGIN和END节
12.8位置参数
12.9数组
12.9.1关联(哈希)数组
12.9.2ENVIRON[]:环境数组
12.10内置变量
12.11函数
12.12控制流--if语句
12.13for循环
12.14while循环
12.15结论
12.16小结
12.17自测题
12.18习题
第13章shell程序设计
13.1shell脚本
13.1.1script.sh:一个简单脚本
13.1.2She-Bang行
13.2read:使脚本变为交互式的
13.3使用命令行参数
13.4exit和$?:命令的
退出状态
13.5逻辑运算符&&和||--条件执行
13.6if条件句
13.7使用test和[]对表达式求值
13.7.1数值比较
13.7.2[]:test的快捷方式
13.7.3字符串比较
13.7.4文件属性检验
13.7.5使用复合条件
13.8两个重要的程序设计习惯
13.8.1以交互式、非交互式执行一项任务
13.8.2用不同名称调用脚本($0)
13.9case条件句
13.10expr、bc和basename:计算与字符串处理
13.10.1用expr进行计算
13.10.2用bc进行浮点计算
13.10.3用expr处理字符串
13.10.4basename:改变文件名扩展
13.11示例程序1:自动选择上一个C程序
13.12for:用列表进行循环
13.12.1列表的来源
13.12.2使用for的重要应用
13.13while:循环
13.13.1在循环中处理重定向
13.13.2使用while等待文件
13.13.3找出用户占用的空间
13.13.4break和continue
13.14示例脚本2:向备份文件提供数字扩展名
13.15用set和shift处理位置参数
13.15.1按名称杀死进程
13.15.2shift:左移位置参数
13.15.3IFS变量:set的默认分隔符
13.16示例脚本3:已下载文件的目录
13.17Here文档(<<)
13.18shell函数
13.19trap:脚本如何处理信号
13.20eval:两次求值
13.21exec语句
13.22小结
13.23自测题
13.24习题
第14章perl--高级操纵器
14.1perl预备知识
14.2变量和常数
14.3运算符
14.3.1比较与逻辑运算符
14.3.2串联运算符和重复运算符(.和x)
14.4标准条件句与循环
14.4.1if条件句
14.4.2while、do-while和for循环
14.5从命令行参数读取文件
14.5.1用单行代码读取文件
14.5.2在脚本中读取文件
14.6当前行号($.)和范围运算符(..)
14.7$_:默认变量
14.8字符串处理函数
14.9列表和数组
14.10foreach:循环遍历个列表
14.11两个重要的列表函数
14.11.1split:分割到列表或数组中
14.11.2join:联接列表
14.12dec2bin.pl:将十进制数变换为二进制
14.13关联数组
14.14使用正则表达式
14.14.1识别空白、数位和单词
14.14.2IRE的TRE功能
14.15用s和tr函数替换
14.16文件处理
14.17文件测试
14.18子例程
14.19用perl进行CGI程序设计--概述
14.19.1查询字符串
14.19.2GET和POST:请求方法
14.20小结
14.21自测题
14.22习题
第15章C语言简介
15.1C语言
15.2first_prog.c:理解我们的第一个C程序
15.2.1预处理器部分
15.2.2主体
15.2.3main:独一无二的函数
15.3printf和scanf:两个重要函数
15.3.1printf:打印到终端
15.3.2scanf:由键盘输入
15.4变量和常数
15.5基本数据类型
15.5.1整型
15.5.2浮点类型
15.5.3字符类型
15.6sizeof.c:确定基本数据类型的大小
15.7符号常量:有名称的常量
15.8数组
15.9arrays.c:打印数组元素
15.10结构
15.11运算符和表达式
15.11.1位运算符
15.11.2自动变换
15.11.3隐式变换
15.12type_conversion.c:演示类型变换
15.13求值顺序
15.13.1运算符优先级
15.13.2运算符结合性
15.14控制流回顾
15.14.1用switch进行决策
15.14.2用do-while重复
15.14.3break和continue
15.15函数
15.16first_func.c:两个参数和返回值
15.17函数实参、形参和局部变量
15.17.1按值传递
15.17.2swap_failure.c:形参与局部变量的可见性
15.17.3以数组为函数实参
15.17.4以结构作为函数实参
15.18指针
15.19pointers.c:指针的基本功能
15.20指针属性
15.20.1指针运算
15.20.2其他属性
15.21指针和函数
15.21.1解决交换问题
15.21.2用指针返回多个值
15.22指针和其他数据类型
15.22.1指针和数组
15.22.2指针和字符串
15.22.3字符串数组
15.22.4指针和结构
15.23小结
15.24自测题
15.25习题
第16章程序开发工具
16.1处理拥有多个源文件的C应用程序
16.1.1包含多个源文件的应用程序
16.1.2编译和链接应用程序
16.1.3为什么需要.o文件
16.2make:使程序保持最新
16.2.1删除冗余
16.2.2make的其他功能:清理与备份
16.2.3宏
16.3ar:生成库(档案)
16.3.1使用库
16.3.2用make维护档案
16.4静态库和共享库
16.5用SCCS、RCS和CVS实现版本控制
16.6SCCS会话
16.6.1admin:创建一个SCCS文件
16.6.2get:签出
16.6.3delta:签入
16.6.4unget:如果改变主意
16.7活动与历史信息
16.7.1sact:显示活动状态
16.7.2prs:显示SCCS历史
16.8继续以SCCS编辑
16.8.1get-r:改变默认的编号顺序
16.8.2处理多个版本
16.8.3rmdel和comb:删除和合并版本
16.8.4使用标识关键字
16.9控制对SCCS的访问权限
16.9.1控制用户访问
16.9.2控制发布版本
16.10版本控制系统(RCS)
16.10.1用ci创建RCS文件
16.10.2co和ci:签出和签入
16.10.3指定修订
16.10.4rlog和rcs:其他RCS功能
16.11并发版本系统(CVS)
16.11.1建立存储库
16.11.2导入文件
16.11.3签出
16.11.4编辑和签入
16.11.5合并和解决冲突
16.11.6设置标记并导出存储库
16.11.7其他功能
16.12用gdb调试程序
16.12.1启动gdb
16.12.2使用断点
16.12.3单步执行程序
16.12.4再赋值
16.12.5设定观察点
16.12.6gdb的其他功能
16.13小结
16.14自测题
16.15习题
第17章系统程序设计I--文件
17.1系统调用的基础知识
17.1.1系统调用剖析
17.1.2系统调用与库函数的对比
17.2errno和perror:处理错误
17.3open:打开和创建文件
17.4close:关闭文件
17.5read:读取文件
17.6write:写文件
17.7ccp.c:复制文件
17.8lseek:定位偏移指针
17.9truncate和ftruncate:截短文件
17.10umask:在创建期间修改文件权限
17.11目录导航
17.12读取目录
17.13修改目录中的项目
17.13.1mkdir和rmdir:创建和删除目录
17.13.2link和symlink:创建硬链接和符号链接
17.13.3unlink:删除链接
17.13.4rename:对文件、目录或符号链接重命名
17.14读取Inode:structstat和stat
17.14.1attributes.c:显示一些文件属性
17.14.2S_IFMT:处理st_mode成员
17.14.3用S_ISxxx宏确定文件类型
17.14.4访问权限位
17.14.5lsdir.c:仅列出目录
17.15access:检查实际用户的权限
17.16修改文件属性
17.16.1chmod和fchmod:改变文件权限
17.16.2chown:改变所有权
17.16.3utime:改变时间戳记
17.16.4atimemtime.c:创建一个具有相同时间戳记的文件
17.17小结
17.18自测题
17.19习题
第18章系统程序设计II--进程控制
18.1进程回顾
18.1.1虚拟地址空间
18.1.2进程表
18.2进程环境
18.3fork:复制当前进程
18.4exec:进程创建的最终步骤
18.4.1execl和execv:关键成员
18.4.2其他exec成员
18.5收集退出状态
18.5.1wait:当父进程等待时
18.5.2waitpid:一种功能更强大的等待机制
18.6fork_exec_wait.c:使用全部三个调用
18.7文件共享
18.7.1文件说明符表
18.7.2文件表
18.7.3vnode表
18.7.4当链接发生变化时
18.8文件说明符处理
18.8.1dup和dup2:复制文件说明符
18.8.2redirection.c:最后讨论重定向
18.8.3fcntl:对其推荐程度高于dup和dup
18.9信号处理
18.10sigaction:安装信号处理器
18.10.1signal.c:捕获SIGALRM信号
18.10.2捕获终端生成的信号
18.11killprocess.c:使用fork-exec-wait和SIGCHLD
18.12用未命名管道实现进程间通信
18.12.1和fork一起使用pipe
18.12.2pipe2.c:在管道中运行UNIX命令
18.13小结
18.14自测题
18.15习题
第III部分系统管理
第19章系统管理
19.1root:系统管理员的登录
19.2管理员的特权
19.3用户管理
19.3.1理解/etc/group
19.3.2理解/etc/passwd
19.3.3添加和修改用户配置文件
19.4维护安全
19.4.1受限制的shell
19.4.2Set-User-Id(SUID):临时能力
19.4.3粘着位
19.5启动与关机
19.5.1启动
19.5.2关机
19.6init如何控制系统
19.6.1init如何创建shell
19.6.2rc脚本
19.7设备文件
19.7.1块设备和字符设备
19.7.2主次设备号
19.8文件系统
19.8.1文件系统的组成部分
19.8.2标准文件系统及其类型
19.9加载和卸载文件系统
19.9.1mount:加载文件系统
19.9.2umount:卸载文件系统
19.10fsck:文件系统检查
19.11管理磁盘空间
19.11.1df:报告空闲空间
19.11.2du:磁盘利用率
19.11.3find回顾:管理员的工具
19.12处理软盘
19.12.1format和fdformat:格式化磁盘
19.12.2dd:复制磁盘
19.12.3处理DOS磁盘
19.13tar:备份文件
19.13.1备份文件(-c)
19.13.2恢复文件(-x)
19.13.3显示档案(-t)
19.13.4其他选项
19.14用rpm安装程序
19.14.1安装和升级包
19.14.2删除包
19.14.3查询包
19.15小结
19.16自测题
19.17习题
附录ACshell--程序设计构造
附录BKorn和Bashshell--独有的程序设计构造
附录CGNUemacs编辑器
附录Dvi/vim命令参考
附录E正则表达式超集
附录F常用操作指南
附录GASCII字符集
附录H术语表
附录I自测题解答