最近在复习Linux,用的教材是《Linux教程(第5版)孟庆昌版》,但每章的课后复习题答案没给,不太方便,我整理了一下

思考题1

1.1  什么是软件?软件分为哪几种?

答:软件是相对硬件而言的,它是与数据处理系统操作有关的计算机程序和相关数据等的总称。

软件通常可分为三大类,即系统软件、应用软件和支撑软件。

1.2  根据你的理解,简述操作系统的定义。

答:(学生可根据自己的理解予以表述,要符合下面定义所包含的基本点)

操作系统是控制和管理计算机系统内各种硬件和软件资源、有效地组织多道程序运行的系统软件(或程序集合),是用户与计算机之间的接口。

1.3  操作系统的主要功能是什么?

答:操作系统的主要功能包括存储管理、进程和处理机管理、文件管理、设备管理和用户接口服务。

1.4  独立运行的多用户系统和单用户机器组成的计算机网络之间有哪些共同点和不同点?

答:共同点:①都是多用户系统,多个用户可以同时上机使用计算机系统;②系统中某些资源可以共享;③系统中各用户可以彼此独立的操作,互不干扰;④系统中的用户可以交换信息。

不同点:①分布性:独立运行的多用户系统是多个用户同时在一台主机上运行多道程序,而单用户机器组成的计算机网络是通过通信线路将地理上分散的多台计算机连接在一起;②自治性:前者中所有用户共享同一CPU、内存、盘空间等资源,有统一任务调度,而后者共享不同计算机上的资源,松散耦合,不具备整个系统统一任务调度;③体系结构:前者是单机系统,后者是多机系统;④通信方式:前者中进程通过共享内存、消息传递等进行通信,后者通过网络互联协议实现数据通信和资源共享目的;⑤容错性:前者中某一部件出现故障将影响整个系统,而后者不受影响,可靠性更高;⑥并行性:前者只能实现并发计算,而后者可以实现并行计算。

1.5  列出Linux系统的主要特点。

答:Linux系统具有一系列显著特点,包括:与UNIX系统兼容;自由软件和源码公开;性能高和安全性强;便于定制和再开发;互操作性强;全面的多任务和真正的64位操作系统。

1.6  解释核心版本和发行版本的含义。Linux 2.1.1版和2.2.1版中,哪一个版本是稳定的?

答:核心版本主要是Linux的内核,由Linus等人在不断地开发和推出新的内核。Linux内核的官方版本由Linus Torvalds本人维护着。发行版本是各个公司推出的版本,它们与核心版本是各自独立发展的。发行版本通常内附有一个核心源码,以及很多针对不同硬件设备的核心映像。所以发行版本是一些基于Linux核心的软件包。

核心版本的序号由三部分数字构成:major.minor.patchlevel。Linux 2.1.1版的次版本号为奇数,不一定很稳定,相当于测试版;而Linux 2.2.1版的次版本号为偶数,是稳定的版本。

1.7  某用户的硬盘空间是10GB,内存是256MB。他想安装普华LinuxV4.0系统,是否可以?

答:不行。因为该计算机的内存空间和硬盘空间配置不满足普华Linux桌面版V4.0的基本需求(最小内存为1GB,最少15.4GB自由硬盘空间,建议20GB以上)。

1.8  安装Linux系统之前,需要做哪几方面的准备工作?

答:比较重要的准备工作有: 备份数据、硬件检查、准备硬盘分区等。

1.9  普华Linux的主要安装过程是什么?

答:将安装光盘放入光驱中,系统将被自动引导。主要安装过程是:语言选择,许可协议,选择安装模式,磁盘分区,检查安装选项,安装系统,初始化设置。

1.10  什么是硬盘分区?一块硬盘上可以有几种类型的分区?各自可以有多少个?在它们上面能否安装Linux系统?

答:硬盘分区是对硬盘的一种格式化,格式化后才能使用硬盘保存各种信息。在创建分区时,就设置好硬盘的各项物理参数,指定硬盘主引导记录和引导记录备份的存放位置。另外,分区时必须把硬盘的主分区设定为活动分区,这样才能够通过硬盘启动系统。

硬盘上的分区有三种类型: 主分区、扩展分区和逻辑分区。

一个硬盘最多只能有4个主分区;扩展分区可以有1个;扩展分区中可以划分出多个逻辑分区(事实上只能建立20多个)。

Linux既可以安装在主分区上,也可以安装在逻辑分区上,但在扩展分区上不能直接安装。

1.11  多启动系统与虚拟机系统有何异同?利用VMWare安装Linux的基本步骤是什么?

答:多启动系统:一台机器上同时存在多个操作系统,每个操作系统单独占用硬盘的一个分区,每一时刻只能运行一个系统,在系统切换时需要重新启动机器。

虚拟机系统:在一台机器上安装多个操作系统,它们在主系统(如Windows)的平台上同时运行,就像标准Windows应用程序那样切换,而且每个操作系统都可以进行虚拟分区、配置而不影响真实硬盘的数据。

利用VMWare安装Linux的基本步骤:下载并安装VMWare,创建虚拟机;安装Linux操作系统;安装VMWare Tools。

1.12  X Window的体系结构包括哪两部分?

答:X Window的体系结构包括两个部分: 客户-服务器模型和X协议。

1.13  系统设置的主要功能是什么?访问它的方法是怎样的?

答:系统设置是普华Linux V4.0提供的一个集成的图形化配置环境。在系统设置中,几乎能找到所有的系统配置和管理工具。它可以方便有效地进行如下几类操作:

  1. 查看系统信息,执行系统管理任务。
  2. 配置系统中的基本硬件设备。
  3. 定制个性化的桌面环境。
  4. 管理鼠标、键盘的定制。

访问系统设置,可在系统主菜单中选择“程序”→“设置”→“系统设置”。

1.14  KDE桌面环境由哪几部分组成?

答:KDE桌面环境由面板和桌面两部分组成。

1) 面板。屏幕底部是面板,也称K面板。可以从这里启动应用程序和在桌面上切换。它比Windows 7任务栏的配置更灵活,功能更强。面板包括系统主菜单按钮、经常使用的应用程序、桌面小程序图标,以及显示当前运行应用程序的任务条。

2) 桌面。屏幕中间的部分是KDE桌面,上面放置了一些常用的应用程序和文件的图标,在上面双击鼠标左键可运行相应程序或打开文件,也可以拖动它们,改变其位置,或者添加/删除桌面图标。

1.15  试配置所用的显示器。

答:(上机题)配置所用的显示器的基本步骤是:单击屏幕左下角的“开始”按钮,选择“程序”→“设置”→“系统设置”,弹出“系统设置”窗口,双击“硬件”栏中的“显示和监控”。然后在打开的显示配置界面上,在“分辨率”栏中用滑动条设置屏幕分辨率,像素范围从640×480到1920×1080。通常可选择1024×768;“方向”选择“普通”即可。在“刷新率”下拉列表中设定显示器的刷新频率,通常选择“自动”即可。配置完成后单击“应用”按钮。

思考题2

2.1  简述Linux命令的一般格式。

答:Linux命令的一般格式是: 命令名[选项][参数]…

2.2  请说明下述命令的功能:date,cd,cp,pwd,rm,mkdir,echo,who,ls,cat,more,man。

答:date命令用于在屏幕上显示或设置系统的日期和时间。

cd命令改变工作目录。

cp命令将源文件或目录复制到目标文件或目录中。

pwd命令显示出当前目录的路径。

rm命令可以删除文件或目录。

mkdir命令用来创建目录。

echo命令可以将命令行中的参数显示到标准输出(即屏幕)上。

who命令将列出所有正在使用系统的用户、所用终端名和注册到系统的时间。

ls命令列出指定目录的内容。

cat命令连接文件并打印到标准输出设备上。cat经常用来显示文件的内容。

more命令显示文件内容,每次显示一屏。

man命令格式化并显示某一命令的联机帮助手册页。

2.3  公元2049年的元旦是星期几?

答:运行命令:cal  1  2049  或  cal  Jan  2049

从显示结果可知,2049年的元旦是星期五。

2.4  什么是文件?Linux下主要有哪些不同种类的文件?

答:文件(File)是被命名的相关信息的集合体。它通常存放在外存(如磁盘、光盘)上,可以作为一个独立单位存放和实施相应的操作(如打开、关闭、读、写等)。

Linux系统中主要有以下类型的文件: 普通文件、目录文件、特别文件以及符号链接文件。

2.5  确定当前工作目录是什么?把工作目录改到父目录上,然后用长格式列出其中所有的内容。

答:(上机做)执行命令:pwd  在屏幕上显示出当前工作目录的绝对路径名。

然后依次执行命令:

cd  ..

ls  -lai

2.6  在所用的Linux系统上,根目录下含有哪些内容?各自的功能是什么?

答:执行命令:cd  /   将当前目录改到根目录

ls  -l    列出它的清单

上机操作并参照本教材8.3.3节相关内容,阐述根目录下各目录的基本功能。

2.7  说出下列每一项信息各对应哪一类文件:

(1)drwxr-xr-x         (2)/bin       (3)/etc/passwd     (4)brw-rw-rw-

(5)/dev/fd0          (6)/usr/lib    (7)-rwx--x—x

答:(1)目录文件 (2)目录文件(其中包含Linux命令)(3) 普通文件(密码文件)(4) 块设备文件(5)块设备(软盘)文件 (6)目录文件,其中包含用户可共享的库文件  (7) 普通文件(可执行文件)

2.8  要想改变目录列表中下面三部分的内容,应该分别用什么命令?

(1)-rwxr--r--         (2)N          (3)…ABC

答:(1)使用chmod命令改变相应文件或目录的存取权限。

(2)使用ln命令可以增加指定文件的链接数,使用rm删除文件,可以减少相应文件的链接数。

(3)使用mv命令可以对指定文件或目录重新命名。

2.9  请给出下列命令执行的结果:

(1)cd                      (2)cd  ..      (3)cd  .. / ..         (4)cd  /

答:(1) cd      将当前目录改到用户主目录。

(2) cd  ..    将当前目录向上移一级(即父目录)。

(3) cd  .. / ..    将当前目录向上移动两级。

(4) cd  /       将当前目录改到根目录。

2.10  cp,copy和mv 命令有何异同?

答:cp命令复制一个文件,而原文件保持不变,这样文件个数就增加了;mv命令将文件从一个目录移到另一个目录中,该文件就从原目录中消失,文件个数不变。

不能直接用copy作为复制文件的命令。因为Linux系统提供的众多命令都是有一定规则和限制的,cp是copy的缩写,是Linux默认的复制文件的命令,而copy并不是Linux的合法命令。

2.11  用什么命令能把两个文件合并成一个文件?

答:使用cat命令,例如:cat   file1  file2 >file3    将文件file1和file2合并后放入file3中。

2.12  如何确定系统中是否有ps命令?如果有,它的功能是什么?

答:可以使用man  ps  命令。如果系统中有ps命令,将显示ps命令的联机帮助手册页,列出有关该命令的完整说明;否则,将显示出错信息。

ps命令的功能是查看当前系统中运行的进程信息。

2.13  要确定在文件ABC中是否含有表示星期六或者星期日字符的行,应使用什么命令?

答:grep  ‘Saturday|Sunday’  ABC   或者 grep  -i  ‘saturday|sunday’   ABC

2.14  如何对文件ABC分别按字典顺序、月份顺序、算术值进行排序?

答:按字典顺序排序 sort  -d  ABC

按月份顺序排序 sort  --M  ABC

按算术值排序 sort  –n  ABC

2.15  目录ABC下有两个子目录a1,b2,以及5个普通文件。如果想删除ABC目录,应使用什么命令?

答:(1)最简单,但是风险较大的方法:rm  -r  ABC

(2)如果5个普通文件分别在子目录a1和b2之下,则可以使用以下命令:

cd  ABC/a1

rm   *

cd  ../b2

rm  *

cd  ../..

rmdir  -p  ABC

(3)如果5个普通文件并未全在两个子目录之下,则可以使用以下命令:

cd   ABC

rm  -r  *

cd  ..

rmdir  ABC

2.16  如何用一个命令行统计给定目录中有多少个子目录?

答:设给定目录名为DIR,则可以使用以下命令行:

ls  -ld  DIR|wc -l

2.17  类似于DOS下的dir,del,type命令的Linux命令各是什么?

答:分别是:ls ,rm和cat。

2.18  试说明find,tee,gzip命令的功能。

答:分别使用以下命令:

man  find  显示该命令的功能是:查找Linux系统上的文件或目录。

man  tee   显示该命令的功能是:从标准输入设备读取数据,将其输出到标准输出设备,同时保存到指定的文件中。

man  gzip  显示该命令的功能是:对文件进行压缩和解压缩。

思考题3

3.1  进入和退出vi的方法有哪些?

答:进入vi的方法:在系统提示符(设为$ )下输入命令vi和想要编辑(建立)的文件名,便可进入vi,如:$ vi  filename

退出vi的方法:

(1) :wq       把编辑缓冲区的内容写到你编辑的文件中,退出编辑器,回到 shell下。

(其操作过程是,先输入冒号“: ”,再输入命令wq。以下命令操作相同。)

(2) :ZZ(大写字母ZZ)      仅当做过修改时才将缓冲区内容写到文件上。

(3) :x         与:ZZ相同。

(4) :q!        强行退出vi。感叹号(!)告诉vi,无条件退出,丢弃缓冲区内容。

3.2  vi编辑器的工作方式有哪些?相互间如何转换?

答:vi编辑器有三种工作方式: 命令方式、插入方式和ex转义方式。

●Shell命令→vi的命令方式:输入命令vi进入编辑器时,就处于vi的命令方式。

●vi的命令方式→Shell命令:在vi的命令方式下使用退出命令,可以返回shell命令方式。

●vi命令方式→插入方式:通过输入vi的插入命令(i)、附加命令(a)、打开命令(o)、替换命令(s)、修改命令(c)或取代命令(r)可以从命令方式进入到插入方式。

●插入方式→vi命令方式:由插入方式回到命令方式的办法是按Esc键(通常在键盘的左上角)。

●vi的命令方式→Ex转义方式:在vi的命令方式下,输入一个冒号(:),就进入Ex转义方式。

●Ex转义方式→vi的命令方式:转义命令执行后,自动回到vi命令方式。

3.3  建立一个文本文件,如会议通知。

(1)建立文件notes,并统计其大小。

(2)重新编辑文件notes,加上一个适当的标题。

(3)修改notes中开会的时间和地点。

(4)删除文件中第3行,然后予以恢复。

答:上机题。体会vi编辑器的工作方式及相互转换,熟悉基本命令的使用。可参照以下步骤做:

(1)进入vi ,建立一个空文件notes;

(2)进入插入方式,编辑一个会议通知;

(3)返回vi命令方式,保存编辑的内容并退出vi;

(4)在shell命令方式下,执行wc命令,统计文件notes的大小;

(5)利用vi,重新编辑文件notes,加上一个会议通知的标题;

(6)保存编辑内容并退出vi,利用cat命令查看该文件的内容;

(7)重新编辑文件notes,修改其中开会的时间和地点;

(8)保存内容并退出vi,然后利用cat命令查看该文件的内容,注意内容的变化;

(9)重新编辑该文件,利用文本删除命令删除其中的第3行;接着分别利用复原命令u和U恢复删除的内容。注意各个命令执行后屏幕显示内容的变化。从中体会各命令的功能。3.4  建立一个文本文件,将光标移至第5行上。分别利用c,C和cc命令进行修改。

答:上机题。体会在vi编辑方式下,光标移动的方式和不同修改命令的功能。注意各命令的使用方式和光标位置的移动。

3.5  在vi之下,上、下、左、右移动光标的方式有哪些?

答:参照本教材P78的图3-2解答。

3.6  解释下述vi命令的功能:

20G    18 |        dM       6H            d4B      x       cw         10cc   3rk     5s      
7S      >8M       /this     ?abc?-5      mg      g/int/p

答:20G    光标移至第20行的开头。

18 |     光标移至当前行的第18列上。

dM    删除从当前行至屏幕中间行的所有行

6H     将光标移到距离屏幕顶部5行的行首

d4B    从光标位置反向删除4个词(包括光标所在词)。

x        删除光标所在的字符。

cw     将光标所在字符至词尾删除,然后用新输入的文本代替。

10cc    先删除光标所在行及其下面9行(共10行),然后以新输入的文本代替。

3rk     表示从光标位置开始向右共有3个字符被k替代。

5s       光标所在字符及其后的4个字符(共5个字符)被新输入的字符序列替代。

7S      当前行及其下面6行(共7行)被新输入的正文替换。

>8M   将当前行和屏幕中间行之间各行向右移动8个字符

/this    从光标所在行开始向前查找字符串“this”,找到后就做上标记。

?abc?-5   从光标所在行开始向后查找字符串“abc”,光标停在首次找到行之前的倒数第5行的行首,即行号是(匹配行号-5)。

mg      在光标所在位置做上标记g,但屏幕上并不显示 “ g ”。

g/int/p  在屏幕上显示当前所编辑的文件中所有包含字符串“int”的行。

3.7  如果希望进入vi后光标位于文件的第10行上,应输入什么命令?

答:设要编辑的文件名是abc,且该文件大于10行。在shell提示符后输入以下命令:

vi  +10  abc

3.8  不管文件中某一行被编辑了多少次,总能把它恢复成被编辑之前的样子,应使用什么命令?

答:使用U(大写字母)命令就能把当前行恢复成被编辑之前的样子。

3.9  要将编辑文件中所有的字符串s1全部用字符串s2替换,包括在一行中多次出现的字符串,应使用什么命令格式?

答:可以使用的命令格式是:g/s1/s//s2/g

思考题4

4.1  常用的shell有哪几种?Linux系统中默认的shell是什么?

答:常用的有: Bourne  shell(简称sh)、C shell(简称csh)、Korn  shell(简称ksh)和Bourne Again shell(简称bash)。

Linux系统中默认的shell是bash。

4.2  简述shell的主要特点。bash有什么特点?

答:shell具有如下主要特点:

(1)命令组合,构成新的命令;

(2)提供了文件名扩展字符(通配符,如* 、 ?、 [ ]);

(3) 可以直接使用shell的内置命令,而不需创建新的进程;

(4)允许灵活地使用数据流,提供通配符、输入/输出重定向、管道线等机制,方便了模式匹配、I/O处理和数据传输;

(5) 结构化的程序模块,提供了顺序流程控制、条件控制、循环控制等;

(6)提供了在后台(&)执行命令的能力;

(7)提供了可配置的环境,允许创建和修改命令、命令提示符和其他的系统行为;

(8)提供了一个高级的命令语言,能创建从简单到复杂的程序。这些shell程序称为shell脚本。

bash是Linux系统默认的一个shell。bash不但与Bourne shell兼容,还继承了C shell,Korn shell等下述优点:

① 命令行历史。使用命令行历史特性,可以恢复以前输入的命令。

② 命令行编辑。可以利用编辑器(如vi)修改已经输入的命令。

③ 命令补全。能在输入文件名的一部分之后,由系统自动填入剩余的部分。

④ 别名扩展。能建立代表某些命令的名字。

4.3  执行shell脚本的方式主要是哪些?

答:执行shell脚本的常用方式基本上有两种:

(1) 以脚本名作为参数。其一般形式是: $  bash  脚本名  [参数]

(2) 将shell脚本的权限设置为可执行,然后在提示符下直接执行它。

例如,设abcd是shell脚本文件,执行步骤如下:

$ chmod  a+x  abcd

$ PATH=$PATH:·

$ abcd    或者

$ · /abcd

4.4  将主提示符改为用户的主目录名,并予以输出。

答:$ PS1="$HOME>  "

echo  $PS1

$ export  PS1

4.5  说明三种引号的作用有什么区别。

答:在shell中引号分为三种: 双引号、单引号和倒引号。

(1)由双引号括起来的字符(除$、倒引号ˋ 和转义字符\外)均作为普通字符对待,而那三个字符仍保留其特殊功能。

(2)由单引号括起来的所有字符都作为普通字符出现。

(3)用倒引号括起来的字符串被shell解释为命令行,在执行时,shell会先执行该命令行,并以执行结果取代用倒引号括起的部分。另外,可以将一个命令的执行结果赋给变量,即命令替换。

4.6  利用变量赋值方式,将字符串DOS  file  c : > \$student\*显示出来。

答:$  string=’ DOS  file  c:>\$student\*’

$  echo  $string

4.7  显示环境变量的设置情况,说明各自的意义。

答:执行env命令,在屏幕上将会显示出当前环境下的所有环境变量及其值。读者可以依据所用机器上实际显示的信息,进行说明。常用的环境变量有以下几个。

(1) HOME: 用户主目录的全路径名。

(2) LOGNAME: 即用户注册名,由Linux自动设置。

(3) PWD: 当前工作目录的路径。

(4) PATH: shell查找命令的路径(目录)列表,各个目录用冒号(: )隔开。

(5) PS1: shell的主提示符。用户可以设置PS1的值。

⑹ SHELL: 当前使用的shell。通常,它的值是/bin/bash。

⑺TERM: 终端类型。

(8) MAIL: 系统信箱的路径。

4.8  分析下列shell脚本的功能:

count=$#

cmd=echo

while [ $count  -gt  0 ]

do

cmd= "$cmd  \$$count "

count= ` expr  $count - 1 `

done

eval  $cmd

答:该脚本的功能是:逆向输出用户在命令行上提供的各个参数。例如,设该脚本名是ABC,执行该脚本的命令行是:$ ABC  apple  big  cat  dog

则结果输出是:dog  cat  big  apple

4.9  编写一个shell脚本,它把第二个位置参数及其以后的各个参数指定的文件复制到第一个位置参数指定的目录中。

答:上机实践题。参考脚本如下:

#!/bin/bash

count=$#

if [  -d   "$1 "  ]

then

n=2

dir=$1

while [  $n  –le  $count  ]

do

if [  -f  $2  ]

then  cp  $2  $dir

else  echo   "$2  is  not an ordinary  file. "

fi

shift

((n=n+1))

done

else  echo   "$1  is  not  a  directory. "

fi

4.10  编写一个shell脚本,显示当天日期,查找给定的某用户是否在系统中工作。如果在系统中,就发一个问候给他。

答:上机实践题。参考脚本如下:

#!/bin/bash

date

echo   "Input  a  user  name  for  searching "

read  name

if  who|grep   "$name "

then

echo   "Lucky, there  is  $name in  my  system  now. "

echo   "Hi,how are you! " > /var/spool/mail/$name

else  echo   "Unlucky, there  is not  $name in  my  system. "

fi

4.11  打印给定目录下的某些文件,由第一个参数指出文件所在的目录,其余参数是要打印的文件名。

答:上机实践题。参考脚本如下:

#!/bin/bash

count=$#

if [  -d   "$1 "  ]

then

cd  $1

n=2

while[  $n  –le  $count  ]

do

if [  -f  $2  ]

then  cat  $2

else  echo   "Sorry, cannot  display  $2. "

fi

shift

((n=n+1))

done

else  echo   "$1  is  not  a  directory. "

fi

4.12  利用for循环将当前目录下的 .c文件移到指定的目录下,并按文件大小排序,显示移动后指定目录的内容。

答:上机实践题。参考脚本如下:

#!/bin/bash

echo   "Input  the  name  of  a  directory. "

read  dir

if [  -d  $dir  ]

then

for  name  in  *.c

do

mv  $name  dir

done

ls  -S  dir

ls  dir

else  echo  "Sorry!$dir  is  not  a  directory. "

fi

4.13  利用数组形式存放10个城市的名字,然后利用for循环把它们打印出来。

答:上机实践题。参考脚本如下:

#!/bin/bash

city=( Beijing Shanghai Tianjin Guangzhou Chongqing Hangzhou Nanjing Shenyang Taiyuan Jinan)

for i in ${city[*]}

do

echo $i

done

4.14  编写一个shell脚本,求费波纳奇数列的前10项及总和。

答:上机实践题。参考脚本如下:

#!/bin/bash

fib[1]=1

fib[2]=1

n=3

((sum= fib[1]+fib[2]))

while [  $n  –lt  10  ]

do

((fib[n]=fib[n-1]+fib[n-2]))

((fib[n+1]=fib[n-1]+fib[n]))

((sum=sum+fib[n]+fib[n+1]))

((n=n+2))

done

for ((i=1;i<=10;i++))

do

echo  ${fib[i]}

done

echo  $sum

4.15  下述表达式的作用是什么?

${ name[*] }                   ${ name[@] }           ${ name #*/ }

${ name %%.* }                ${ #name[*] }         ${ name:-Hello }

答:${name[*]}和${name[@]}  都表示数组name中所有非空元素的值,每个元素的值用空格分开。

${ name #*/ }  如果name值的开头包含模式*/,那么该表达式的值就是name中去掉最少匹配*/部分后的结果;否则,就是name的值。

${ name %%.* } 如果name值的末尾包含.*,那么该表达式的值就是name中去掉最多匹配.*部分后的结果;否则,就是name的值。

${#nane[*]}的值是数组name中已经设置的元素的个数。

${ name:-Hello }  如果name的值为空,则整个表达式的值等于给定的字符串Helloname保持不变;否则,整个表达式的值等于name的值,name保持不变。

4.16  显示前面所执行的40个命令的清单,重新执行倒数第5条命令。编辑其中一条命令,然后执行。

答:上机实践题。

$ history 40

$ !-5

然后,按↑键或↓键,找到你要编辑的命令;

进行编辑;

按Enter键,执行该命令。

4.17  定义一个别名命令,它等价的功能是:显示当前日期及工作目录,并列出有多少用户在系统上工作。

答:上机实践题。

$ alias  cmd=’date;pwd;who|wc –l’

$ cmd

4.18  设计一个程序cuts,它由标准输入读取数据,获取由第一个参数n和第二个参数m所限定范围的数据,nm都是整数,即从输入的字符串中抽取第n个字符至第m个字符之间的所有字符(包括这两个字符)。例如:

$ cuts  11  14

this is a test of cuts program (输入)

test (显示结果)

答:上机实践题。参考脚本如下:

#!/bin/bash

read  -p  "Input a string: "  str

echo  $str | cut  -c  $1-$2

思考题5

5.1  说明Linux系统的体系结构分为哪几层。

答:Linux系统的体系结构大致可分为三层:

① 靠近硬件的底层是内核,即Linux操作系统常驻内存部分。

② 中间层是内核之外的shell层,即操作系统的系统程序部分。

③ 最高层是应用层,即用户程序部分。

5.2  说明Linux系统核心结构的组成情况。

答:Linux是采用单体结构的操作系统,所有的内核系统功能都包含在一个大型的内核软件之中。Linux内核分为用户层、核心层和硬件层3个层次,其内核结构框图如下图所示。

5.3  什么是进程?什么是线程?Linux系统中的进程有哪些状态?如何获取系统中各进程的状态?

答:简单地说,进程就是程序的一次执行过程。具体地说,进程是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。

线程(Thread)是进程中实施调度和分派的基本单位。

在Linux系统中,进程有五种状态:①运行态(TASK_RUNNING)。②可中断等待态(TASK_INTERRUPTIBLE)。③不可中断等待态(TASK_UNINTERRUPTIBLE)。④停止态(TASK_STOPPED)。⑤僵死态(TASK_ZOMBIE)。

利用命令ps  aux可以获取系统中各进程的状态。

5.4  Linux系统中进程有哪两种模式?各有何特点?

答:Linux系统中进程的运行模式划分为用户模式和内核模式。

在内核模式下运行的进程可以执行机器的特权指令,该进程的运行不受用户的干预,即使是root用户也不能干预内核模式下进程的运行。

用户模式中执行的进程,可以通过系统调用或在出现中断、异常时进入内核模式。

5.5  Linux系统中进程控制块的作用是什么?它与进程有何关系?

答:Linux系统中的每个进程都有一个名为task_struct的数据结构,它相当于“进程控制块”,包含了进程的描述信息和控制信息,是进程组成中最关键的部分。

每个进程有唯一的进程控制块;操作系统根据它对进程实施控制和管理,是进程存在的唯一标志。

5.6  Linux系统如何执行进程调度?

答:Linux系统的进程调度涉及调度方式、调度策略和调度时机三个方面。

Linux内核的调度方式基本上采用“抢占式优先级”方式。

Linux系统针对不同类别的进程提供了三种不同的调度策略,即: SCHED_FIFO(适合于实时进程)、SCHED_RR(对应“时间片轮转法”)以及SCHED_OTHER(适合于交互式的分时进程)。

核心进行进程调度的时机有以下几种情况: (1)当前进程调用系统调用nanosleep()或者pause(),使自己进入睡眠状态,主动让出一段时间的CPU使用权; (2)进程终止,永久地放弃对CPU的使用; (3)在时钟中断处理程序执行过程中,发现当前进程连续运行的时间过长; (4)当唤醒一个睡眠进程时,发现被唤醒的进程比当前进程更有资格运行; (5)一个进程通过执行系统调用来改变调度策略或者降低自身的优先权,从而引起立即调度。

5.7  shell的基本工作过程是怎样的?

答:shell命令解释程序不属于内核部分,而是在核心之外,以用户态方式运行。其基本工作流程是:

① 读取用户由键盘输入的命令行。

② 判断命令是否正确,且将命令行的其他参数改造为系统调用exec ( )内部处理所要求的形式。

③ 终端进程调用fork( )建立一个子进程。

④ 终端进程本身用系统调用wait4( )来等待子进程完成(如果是后台命令,则不等待)。

⑤ 当调度子进程运行时,它调用exec( )—— 根据文件名(即命令名)到目录中查找有关文件(可执行文件),调入内存,更换自己的映像,然后执行这个程序(即执行这条命令)。

⑥ 如果命令行末尾有&(后台命令符号),则终端进程不执行系统调用wait4( ),而是立即发提示符$,让用户输入下一个命令,转①;如果命令末尾没有&,则终端进程要一直等待。当子进程(即执行该命令程序的进程)完成处理后终止,向父进程(终端进程)报告。此时,终端进程被唤醒,在做必要的判别等工作后,终端进程发提示符$,让用户输入新的命令,重复上述处理过程。

5.8  Linux系统一般采用哪种文件系统?其构造形式如何?

答:目前,Linux主要使用的文件系统是ext2、ext3和ext4。ext3是ext2的升级版本,加入了记录数据的日志功能。ext4是ext3文件系统的后继版本,是扩展日志式文件系统。

ext2文件系统中的文件信息都保存在数据块中。ext2文件系统将逻辑块划分成块组,每个块组重复保存着一些有关整个文件系统的关键信息以及实际的文件和目录的数据块。Ext2文件系统的物理构造形式如下图所示 

5.9  什么是块组?什么是超级块?超级块的功能是什么?

答: Linux主要使用的文件系统是ext2和ext3,各自划分成若干块组。每个块组重复保存着一些有关整个文件系统的关键信息,以及真正的文件和目录的数据块,其中包含超级块、块组描述结构、块位示图、索引节点位示图、索引节点表和数据块。

超级块位于每个块组的最前面,其中包含有关该文件系统的全部关键参数。当计算机加电进行引导或第1次遇到该文件系统时,就把超级块中的信息读入内存。超级块中包含标识文件系统类型的幻数、文件系统中的盘块数量、修改标记及其他关键管理信息。

超级块中包含有文件系统本身的大小和形式的基本信息,文件系统管理员可以利用这些信息来使用和维护文件系统。

5.10  什么是索引节点?索引节点主要有哪些内容?它与文件有何关系?

答:索引节点又被称为I节点,是一个结构数组,其中包含有关该文件的全部管理信息。

索引节点主要包括以下内容: 文件模式,文件属主信息,文件大小,时间戳,文件链接计数,数据块索引表等。

ext2文件系统的索引节点起着文件控制块的作用,利用这种数据结构可对文件进行控制和管理。每个文件都只有一个索引节点。

5.11  为什么要设立虚拟文件系统(VFS)?它与实际文件系统的关系是怎样的?

答:Linux系统可以支持多种文件系统,为此,必须使用一种统一的接口,这就是虚拟文件系统(VFS)。通过VFS将不同文件系统的实现细节隐藏起来,从外部看上去所有的文件系统都是一样的。

VFS是建立在具体文件系统之上的,VFS必须管理所有的文件系统。用户程序(进程)通过有关文件系统操作的系统调用进入系统空间,然后经由VFS才可使用Linux系统中具体的文件系统。

5.12  Linux系统通常为什么要把硬盘划分为多个文件系统?简述文件系统安装的基本过程。

答:一个硬盘上可以同时存在多个文件系统,每个文件系统占据硬盘的一个独立分区。Linux文件系统可以根据需要随时装卸,从而实现文件存储空间的动态扩充和信息安全。在系统初启时,只有根文件系统,其他的文件系统可以根据需要作为子系统动态地安装到主系统中,已安装的子文件系统也可从整个文件系统上卸下来,恢复安装前的独立状态。

文件系统安装的基本过程是:超级用户可以使用命令mount将新文件系统安装到主文件系统中。该命令带有3个主要参数:要安装的文件系统类型、该文件系统所在分区名和安装新文件系统的路径名(即安装点)。执行该命令时,Linux系统内核必须首先检查有关参数的有效性。VFS首先应找到要安装的文件系统,通过查找由file_systems指针指向的链表中的每一个file_system_type数据结构来搜索已知的文件系统(该结构包含文件系统的名字和指向VFS超级块读取程序地址的指针),当找到一个匹配的名字时,就可以得到读取文件系统超级块的程序的地址。接着要查找作为新文件系统安装点的VFS索引节点,并且在同一目录下不能安装多个文件系统。VFS安装程序必须分配一个VFS超级块(super_block),并且向它传递一些有关文件系统安装的信息。申请一个vfsmount数据结构(其中包括存储文件系统的块设备的设备号、文件系统安装的目录和一个指向文件系统的VFS超级块的指针),并使它的指针指向所分配的VFS超级块。当文件系统安装以后,该文件系统的根索引节点就一直保存在VFS索引节点缓存中。

5.13  Linux系统采用哪两种内存管理技术?各自的基本实现思想是什么?

答:Linux系统采用交换和请求分页两种内存管理技术。

请求分页存储管理技术是在简单分页存储技术基础上发展起来的,它的基本思想是:当进程运行时,不必把整个进程映像都放在内存中,只需在内存保留当前用到的那一部分页面。当进程访问到某些尚未在内存的页面时,就由核心把这些页面装入内存。这种策略使进程的虚拟地址空间映射到机器的物理空间时具有更大的灵活性,通常允许进程的大小可大于可用内存的总量,并允许更多进程同时在内存中执行。

内存交换的基本思想是:当系统中出现内存不足时,Linux内存管理子系统就释放一些内存页,从而增加系统中空闲内存页的数量,此任务是由内核的交换守护进程kswapd完成的。

5.14  何谓虚拟存储器?Linux系统如何支持虚存?

答:所谓虚拟存储器是用户能作为可编址内存对待的虚拟存储空间,它使用户逻辑存储器与物理存储器分离,是操作系统给用户提供的一个比真实内存空间大得多的地址空间。

Linux存储管理采用请求分页技术,请求分页提供虚拟存储器。它的基本思想是: 当我们要执行一个程序时才把它换入内存; 但并不把全部程序都换入内存,而是用到哪一页时才换入它。这样,就减少了对换时间和所需内存数量,允许增加程序的道数。

5.15  Linux系统中交换空间为何采用连续空间?

答:因为进程使用交换空间是临时性的,速度是关键性问题,系统一次进行多个盘块I/O传输比每次一块、多次传输的速度要快,所以核心在交换设备上是分配一片连续空间,而不管碎片的问题。

5.16  Linux为什么要采用三级页表?该机制如何工作?

答:现在地址码通常采用32位,这样,每个进程的虚拟存储空间可达4 GB。而Linux系统中页面的大小为4KB,因此进程虚拟存储空间要划分为220(1M)个页面。如果直接用页表描述这种映射关系,那么每个进程的页表就要有220(1M)个表项。很显然,用大量的内存资源来存放页表是不可取的。为此,Linux系统采用三级页表的方式。Linux系统三级页表地址映射如下图所示。

图中PGD表示页面目录,PMD表示中间目录,PT表示页表。一个线性虚拟地址在逻辑上划分成4个位段,从高位到低位分别用做检索页面目录PGD的下标、中间目录PMD的下标、页表PT的下标和物理页面(即内存块)内的位移。把一个线性地址映射成物理地址分为以下4步:

① 以线性地址中最高位段作为下标,在PGD中找到相应的表项,该表项指向相应的PMD。

② 以线性地址中第2个位段作为下标,在PMD中找到相应的表项,该表项指向相应的PT。

③ 以线性地址中第3个位段作为下标,在PT中找到相应的表项,该表项指向相应的物理页面(即该物理页面的起始地址)。

④ 线性地址中的最低位段是物理页面内的相对位移量,此位移量与该物理页面的起始地址相加就得到相应的物理地址。

5.17  Linux信号机制是如何实现进程通信的?

答:信号机制是在软件层次上对中断机制的一种模拟。异步进程可以通过彼此发送信号来实现简单通信。系统预先规定若干个不同类型的信号,各表示发生了不同的事件,每个信号对应一个编号。运行进程当遇到相应事件或者出现特定要求时,就把一个信号写到相应进程task_struct结构的signal位图中。接收信号的进程在运行过程中要检测自身是否收到了信号,如果已收到信号,则转去执行预先规定好的信号处理程序。处理之后,再返回原先正在执行的程序。

5.18  管道文件如何实现两个进程间的通信?

答:管道文件是连接两个命令的一个打开文件。一个命令向该文件中写入数据,称作写者;另一个命令从该文件中读出数据,称作读者。系统自动处理二者之间的同步、调度和缓冲。利用管道文件可以实现两个或多个进程间的直接通信。

5.19  Linux系统中设备驱动分层结构是怎样的?如何实现与设备的无关性?

答:设备驱动的分层结构自顶向下依次为:应用层、文件系统层、设备驱动层、物理设备层。

Linux系统采用设备文件统一管理硬件设备,从而将硬件设备的特性及管理细节对用户隐藏起来,实现用户程序与设备无关性。

5.20  Linux系统中可安装模块的思想是什么?

答:可安装模块是可以在系统运行时动态地安装和拆卸的内核模块。利用这个机制,可以根据需要在不必对内核重新编译连接的条件下,将可安装模块动态插入运行中的内核,成为其中一个有机组成部分; 或者从内核卸载已安装的模块。设备驱动程序或者与设备驱动紧密相关的部分(如文件系统) 都是利用可安装模块实现的。

5.21  什么是中断?中断的一般处理过程是什么?

答:所谓中断是指CPU对系统发生的某个事件作出的一种反应——CPU暂停正在执行的程序,保留现场后自动地执行相应的处理程序,处理完该事件后,如被中断进程的优先级最高,则返回断点继续执行被“打断”的程序。

中断的一般处理过程:保存被中断程序的现场,分析中断原因,转入相应处理程序进行处理,恢复被中断程序现场(即中断返回)。

5.22  Linux系统怎样处理系统调用?

答:Linux的系统调用是通过中断指令INT 0x80实现的。当CPU执行到中断指令INT 0x80时,硬件就作出一系列响应,其动作与中断响应相同。CPU穿过陷阱门,从用户空间进入系统空间。相应地,进程的上下文从用户堆栈切换到系统堆栈。接着运行内核函数system_call()。首先,进一步保存各寄存器的内容;接着调用syscall_trace(),以系统调用号为下标检索系统调用入口表sys_call_table,从中找到相应的函数; 然后,转去执行该函数,完成具体的服务。执行完服务程序,核心检查是否发生错误,并作相应处理。如果本进程收到信号,则对信号作相应处理。最后进程从系统空间返回到用户空间。

思考题6

6.1  gcc编译过程一般分为哪几个阶段?各阶段的主要工作是什么?

答:gcc编译过程可以分为4个阶段,包括预处理(Preprocessing)、编译(Compiling)、汇编(Assembling)和连接(Linking)。

●预处理程序读取C语言源文件,对其中以“#”开头的指令(伪指令)和特殊符号进行处理。

●编译程序对预处理之后的输出文件进行词法分析和语法分析,试图找出所有不符合语法规则的部分,并根据问题的大小做出不同处理。在确定各成分都符合语法规则后,将其“翻译”为功能等价的中间代码表示或者汇编代码。

●汇编程序把汇编语言代码翻译成目标机器代码。

●连接程序要解决外部符号访问地址问题,也就是将一个文件中引用的符号(如变量或函数调用)与该符号在另外一个文件中的定义连接起来,从而使有关的目标文件连成一个整体,最终成为可被操作系统执行的可执行文件。

6.2  对C语言程序进行编译时,针对以下情况应使用的编译命令行是什么?

(1)只生成目标文件,不进行连接。

(2)在预处理后的输出中保留源文件中的注释。

(3)将输出写到file指定的文件中。

(4)指示编译程序在目标代码中加入供调试程序gdb使用的附加信息。

(5)连接时搜索由library命名的库。

答:(1) 只生成目标文件,不进行连接:gcc  -c  源文件名

(2) 在预处理后的输出中保留源文件中的注释: gcc  -C  源文件名

(3) 将输出写到file指定的文件中:  gcc  -o  file源文件名

(4) 指示编译程序在目标代码中加入供调试程序gdb使用的附加信息:

gcc  -g  源文件名

(5) 连接时搜索由library命名的库:gcc  -llibrary源文件名

6.3  通常,程序中的错误按性质分为哪三种?

答:程序中的错误按其性质可分为以下三种:(1) 编译错误,即语法错误。(2)  运行错误。(3) 逻辑错误。

6.4  gdb主要帮助用户在调试程序时完成哪些工作?

答:gdb主要帮助用户在调试程序时完成四方面的工作:

(1) 启动程序,可以按用户要求影响程序的运行行为。

(2) 使运行程序在指定条件处停止。

(3) 当程序停止时,检查它出现了什么问题。

(4) 动态改变程序的执行环境,这样就可以纠正一个错误的影响,然后再纠正其他错误。

6.5  调试下面的程序:

/*badprog.c错误地访问内存*/

#include  <stdio.h>

#include <stdlib.h>

int main(int argc, char **argv)

{

char *p;

int i;

p=malloc(30);

strcpy(p,"not 30 bytes");

printf("p=<%s>\n",p);

if(argc==2){

if(strcmp(argv[1], "-b")==0)

p[50]='a';

else if(strcmp(argv[1], "-f ")==0){

free(p);

p[0]='b';

}

}

/*free(p);*/

return 0;

}

答:这是上机操作题。先利用gcc  -g  badprog.c   -o  badprog对源文件进行编译;通过编译后,运行badprog文件,看看出现什么问题;然后利用gdb工具调试该程序。参考书中6.2.6节的示例,依据调试时实际显示的即时信息,分析可能的原因(注意数组大小!),使用相应的命令一步步调试,直至找出问题根源;然后予以改正,再重新编译、运行。

6.6  调试下面的程序:

/*callstk.c有3个函数调用深度的调用链*/

#include <stdio.h>

#include <stdlib.h>

int make_key(void);

int get_key_num(void);

int number(void);

int main(void)

{

int ret=make_key();

printf("make_key returns %d\n",ret);

exit(EXIT_SUCCESS);

}

int make_key(void)

{

int ret=get_key_num();

return ret;

}

int get_key_num(void)

{

int ret=number();

return ret;

}

int number(void)

{

return 10;

}

答:这是上机操作题。体会函数调用的层次关系。

6.7  GNU make的工作过程是怎样的?

答:GNU make的工作过程是:

① 依次读入各makefile文件;

② 初始化文件中的变量;

③ 推导隐式规则,并分析所有规则;

④ 为所有的目标文件创建依赖关系链;

⑤ 根据依赖关系和时间数据,确定哪些目标文件要重新生成;

⑥ 执行相应的生成命令。

6.8  makefile的作用是什么?其书写规则是怎样的?

答: makefile文件是make命令必备的一个文本形式的数据库文件,它定义了一系列规则,记录了文件之间的依赖关系及在此依赖关系基础上所应执行的命令序列,即定义了一系列规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译等。此外,还可以有变量定义、注释等。

makefile的通用形式如下所示:

目标文件:[相依文件…]

<tab>命令1[#注释]

<tab>命令n[#注释]

其书写规则是:依赖行从一行的开头开始书写。各命令行单独占一行,每个命令行的第一个字符必须是制表符<tab>,而不能使用8个空格;#号后的内容为注释。它可以位于一行的开头;在依赖行上,目标文件和相依文件之间要用一个或两个冒号分开。一个目标文件可以出现在多个依赖行上,此时所有的依赖行的类型必须一致(一个冒号或两个冒号)。

6.9  设某个正在开发的程序由以下内容组成:

① 4个C语言源文件:a.c,b.c,c.c和d.c。设b.c和d.c都使用了defs.h中的声明。

② 汇编语言源文件assmb.s被某个C语言源文件调用。

③ 使用了在/home/user/lib/libm.so中的一组例程。

设最后生成的可执行文件名为prog。试编写相应的makefile文件。

答:先根据题意,画出依赖关系图,再编写makefile文件。makefile文件如下所示:

prog:a.o  b.o  c.o  d.o  assmb.o

gcc  a.o  b.o  c.o  d.o  assmb.o  -L/home/user/lib  -lm  –o  prog

a.o:a.c

gcc  –c  a.c

b.o:b.c  defs.h

gcc  -c  b.c

c.o:c.c

gcc  -c  c.c

d.o:d.c  defs.h

gcc  -c  d.c

assmb.o:assmb.s

as  -o  assmb.o  assmb.s

clean:

rm  prog  *.o

思考题7

7.1  什么是系统调用?什么是库函数?二者有何异同?

答:系统调用是操作系统内核提供的、与用户程序之间的接口,也就是操作系统提供给程序员的接口,一般位于操作系统核心的最高层。

库函数:由系统提供,用于解决共性问题,为程序的开发和执行提供方便的程序,本身并不属于操作系统的内核部分。

相同点:系统调用和库函数都是由程序代码构成,二者调用方式相同,都需要在调用时传送参数,实参的个数、出现的次序和实参的类型与原型说明中形参表的设计相同。

区别:库函数调用依赖于所运行的用户环境,程序调用库函数时,它运行的目标代码是属于程序的,程序处于“用户态”执行;而系统调用的使用不依赖于它运行的用户环境,是操作系统内核提供的低层服务,系统调用时所执行的代码是属于内核的,程序处于“核心态”执行。库函数的调用最终还是要通过系统调用来实现,库函数一般执行一条指令,该指令(操作系统陷阱operating  system  trap)将进程执行方式变为核心态,然后使内核为系统调用执行代码。

7.2  使用系统调用的一般方式是什么?

答:1、标明相应的文件包含。不同的系统调用所需要的头文件(又称前导文件)是不同的。这些头文件包含了相应程序代码中用到的宏定义、类型定义、全称变量及函数说明等。

2、在C语言程序中,系统调用的调用方式与调用库函数相同,即调用时,提供的实参的个数、出现的顺序和实参的类型应与原型说明中形参表的设计相同。

7.3  编写一个程序,把一个文件的内容复制到另一个文件上,即实现简单的copy功能。要求:只用open( ),read( ),write( )和close( )系统调用,程序的第一个参数是源文件,第二个参数是目的文件。

答:(上机题)该程序对应命令的使用格式是:命令名  源文件  目的文件

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <unistd.h>

#include <errno.h>

#include <stdio.h>

#include <stdlib.h>

#define  SIZE  512

int main( int argc, char const *argv[] )

{

int fd1,fd2,N;

char buf[SIZE];

if(argc<3){

fprintf(stderr, "usage :%s origin destination\n",argv[0]);

return 1;

}

fd1=open(argv[1],O_RDONLY);   //以只读方式打开源文件

fd2=open(argv[2],O_CREAT|O_RDWR,S_IRWXU);  //打开目的文件,不存在则创建

if(fd1<0||fd2<0){

fprintf(stderr, "Cannot open a file!\n");

return 1;

}

while((N=read(fd1,buf, SIZE))>0)

write(fd2,buf,N);     //从源文件读,写入目的文件,实现copy功能

close(fd1);

close(fd2);

return 0;

}

7.4  编写一个程序,它把给定的正文插入到文件的任意指定位置,并输出最后结果。

答:(上机题)该程序对应命令的使用格式是:命令名  待插入文件名

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <unistd.h>

#include <errno.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define  SIZE  512

int main( int argc, char const *argv[] )

{

int POS;

int fd,fdtmp,n;

char str[SIZE];

char buf[SIZE];

fd=open(argv[1],O_RDWR,S_IRWXU);   //待插入文件,由argv[1]给出

fdtmp=open("tmp.txt",O_CREAT|O_RDWR,S_IRWXU); //辅助文件

if(fd<0||fdtmp<0){

fprintf(stderr, "Cannot open a file!\n");

return 1;

}

truncate("tmp.txt",0);  //清空tmp.txt

printf("original file is:\n");   //输出插入前的文件内容

lseek(fd,0,SEEK_SET);

while((n=read(fd,buf, SIZE))>0)

write(STDOUT_FILENO,buf,n);

printf("input position:");

scanf("%d",&POS);  //输入插入位置

printf("input string:");

scanf("%s",str);   //输入插入文本

lseek(fd,POS,SEEK_SET);

while((n=read(fd,buf, SIZE))>0)   //把插入位置后的文件内容先暂存到辅助文件

write(fdtmp,buf,n);

truncate(argv[1],POS);         //清除插入位置后的文件内容

lseek(fd,POS,SEEK_SET);     //将输入的文本写到文件指定位置

write(fd,str,strlen(str));

lseek(fdtmp,0,SEEK_SET);     //将辅助文件的内容写回,实现插入功能

while((n=read(fdtmp,buf, SIZE))>0){

write(fd,buf,n);

}

printf("After Insert:\n");      //输出插入后的文件内容

lseek(fd,0,SEEK_SET);

while((n=read(fd,buf, SIZE))>0)

write(STDOUT_FILENO,buf,n);

close(fd);

close(fdtmp);

return 0;

}

7.5  编写一个程序,它首先打开一个文件,然后利用fork( )创建一个子进程;随后,当父进程运行时先执行wait( );父子进程都打印自己和其父进程的ID号;并且,二者都向该文件写入(利用write)一条信息,表明是在哪个进程中。试问:如果没有wait调用,会出现什么情况?

答:(上机题)该程序对应命令的使用格式是:命令名  文件名

#include <sys/stat.h>

#include <sys/types.h>

#include <sys/wait.h>

#include <unistd.h>

#include <stdio.h>

#include <stdlib.h>

#include <fcntl.h>

#include <errno.h>

#include <string.h>

int main(int argc, char* argv[])

{

int file;

pid_t pid;

char buf_child[]="I’m the child process.\n";

char buf_father[]="I’m the father process.\n";

if((file=open(argv[1],O_CREAT|O_RDWR,S_IRWXU))<0){ //打开文件,文件名由argv[1]提供

perror("open  argv[1] ");

exit(EXIT_FAILURE);

}

if((pid=fork())<0){

fprintf(stderr,"%s:fork of child failed:%s\n",argv[0],strerror(errno));

exit(1);

};

if(pid==0){     //子进程

printf("\n\nIn th child process\n");

printf("Current Process ID:%d\n",getpid());

printf("Parent Process ID:%d\n",getppid());

write(file,buf_child,strlen(buf_child));

}

else if(pid>0){   //父进程

wait(NULL);   //等待子进程完成

printf("\n\nIn the father process\n");

printf("Current Process ID:%d\n",getpid());

printf("Parent: Process ID %d\n",getppid());

write(file,buf_father,strlen(buf_father));

}

}

利用系统调用wait( )可以实现父子进程的同步,即:保证子进程输出在前,父进程输出在后。如果没有wait(),则输出结果的先后顺序会有随机性,那样,每次运行的结果都有可能不同。

7.6  编写一个程序,尽可能多地输出有关当前进程的信息:PID、PPID、打开文件、当前目录、nice值等。请简要说明,如何确定哪些文件是打开的?如何确定多个文件描述符表示同一个文件?

答:(上机题)该程序对应命令的使用方式是:命令名  文件1  文件2

#include <sys/stat.h>

#include <sys/types.h>

#include <unistd.h>

#include <stdio.h>

#include <stdlib.h>

#include <fcntl.h>

#include <sys/time.h>

#include <sys/resource.h>

#include <string.h>

int main(int argc, char* argv[])

{

int file1,file2;

pid_t pid,ppid;

char str[20],dir[100]="/proc/";

char subdir[20]="/fd";

if(argc<3){

fprintf(stderr, "usage :%s  file1  file2\n",argv[0]);

return 1;

}

if((file1=open(argv[1],O_CREAT|O_RDWR,S_IRWXU))<0){

perror("open  argv[1] ");

exit(EXIT_FAILURE);

}

if((file2=open(argv[2],O_CREAT|O_RDWR,S_IRWXU))<0){

perror("open  argv[2] ");

exit(EXIT_FAILURE);

}

pid=getpid();

ppid=getppid();

printf("Current Process:%d\n",pid);

printf("Parent Process:%d\n",ppid);

printf("Nice of current process:%d\n",getpriority(PRIO_PROCESS,pid));

system("echo current directory is `pwd`    ");

sprintf(str,"%d",pid);  //将pid转换为字符串,保存在str中

strcat(dir,str);

strcat(dir,subdir);  //拼接字符串,形成如下形式的/proc/3724/fd,设3724为getpid( )返回值

chdir(dir);

printf("The number of files to be opened :\n");

system("ls | wc -l");     //统计打开的文件数量

return 0;

}

利用getpid()获取当前进程的id,假设为3724。然后进入目录 /proc/3724/fd ,利用命令  ls  -l可以看出该进程打开了哪些文件。系统为每个进程自动打开三个标准文件(即标准输入、标准输出和错误输出),其文件描述符分别为0,1和2,本题给出的参考代码中,打开了两个文件,这样可以更加清楚的看到进程打开的所有文件。

如果文件描述符后面->所指向的文件名称一致,则代表这些文件描述符对应同一个文件。运行本代码时,可以让文件1和文件2这两个参数相同,即同一个文件打开两次,能够看到不同的文件描述符对应了同一个文件的情况。

另外,root用户还可以使用lsof命令查看某进程所打开的文件信息:# lsof –p 进程号

7.7  编写一个管道程序,它所创建的管道等价于下面的shell管道:

$ echo good morning|sed s/good/hi/g

该程序的实现过程是:调用pipe( )建立一个管道,利用fork( )创建两个子进程:一个是左侧进程,另一个是右侧进程。

左侧进程使用close(pipefd[0])关闭管道读取端,使用close(1)关闭最初的标准输出,使用dup(pipefd[1])将管道的写入端改为文件描述符1,使用close(pipefd[1])关闭打开文件描述符的一个副本,调用execvp( )启动运行的程序。

右侧进程的工作与此相似,使用close(pipefd[1])关闭管道写入端,使用close(0)关闭最初的标准输入,使用dup(pipefd[0])将管道的读取端改为文件描述符0,使用close(pipefd[0])关闭打开文件描述符的一个副本,调用execvp( )启动运行的程序。

在父进程中,关闭管道的两端:close(pipefd[0])和close(pipefd[1])。最后,在父进程中使用wait( )等待两个子进程结束。

答:(上机题)

#include <unistd.h>

#include <stdio.h>

#include <errno.h>

#include <sys/types.h>

#include <stdlib.h>

int main(int argc, char* argv[])

{

int pipefd[2];

pid_t leftpid,rightpid;

char *arg1[]={"echo","good morning",0};

char *arg2[]={"sed","s/good/hi/g",0};

if(pipe(pipefd)){      //创建管道

fprintf(stderr,"%s:pipe failed:%s\n",argv[0],strerror(errno));

exit(1);

};

if((leftpid=fork())<0){   //创建左侧子进程

fprintf(stderr,"%s:fork of left child failed:%s\n",argv[0],strerror(errno));

exit(1);

};

if(leftpid==0){   //子进程

close(pipefd[0]);

close(1);

dup(pipefd[1]);

close(pipefd[1]);

execvp("echo",arg1 );  //执行echo good morning,结果写入管道

}

if((rightpid=fork())<0){    //创建右侧子进程

fprintf(stderr,"%s:fork of right child failed:%s\n",argv[0],strerror(errno));

exit(1);

};

if(rightpid==0){    //右侧子进程

close(pipefd[1]);

close(0);

dup(pipefd[0]);

close(pipefd[0]);

execvp("sed",arg2 );  //执行sed,完成替换

}

else{

close(pipefd[0]);

close(pipefd[1]);

wait(NULL);

wait(NULL);

}

}

7.8  调用msgget( )创建一个消息队列,输出其队列ID。然后再次调用msgget( )打开已有的队列。如果两次得到的ID相同,则显示打开队列的ID。

答:(上机题)

#include <unistd.h>

#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/msg.h>

#include <sys/ipc.h>

#define MSGKEY 1234

int main(void)

{

int qid,qid2;

if((qid=msgget(MSGKEY,IPC_CREAT|0x0666))<0){  //创建消息队列

perror("msgget:create");

exit(EXIT_FAILURE);

}

printf("Create  a message queue,its ID is:%d\n",qid);

qid2=msgget(MSGKEY,IPC_EXCL);   //IPC_EXCL检查消息队列是否存在

if(qid2==qid){

printf("Open a message queue,its ID is :%d \n",qid2);

}

msgctl(qid,IPC_RMID,0);  //删除创建的消息队列

return 0;

}

7.9  编写一个程序,它创建一个子进程。父进程向子进程发送一个信号,然后等待子进程终止;子进程接收信号,输出自己的状态信息,最后终止自己。

答:(上机题)

#include <unistd.h>

#include <errno.h>

#include <sys/types.h>

#include <stdio.h>

#include <stdlib.h>

#include <wait.h>

#include <signal.h>

void handler(int signo)

{

printf("\n\nthis is child process,pid=%d ,parent id=%d \n",getpid(),getppid());

}

int main(void )

{

int pid;

if((pid=fork())<0) {

perror("fork of child failed");

exit(EXIT_FAILURE);

}

else if(pid==0) {

signal(SIGUSR1,handler);  //子进程捕捉信号SIGUSR1,用handler处理

pause();

printf("child process exit\n");

exit(0);

}

else{     //父进程

int status;

int childpid;

printf("this is parent process,pid=%d \n",getpid());

printf("the child process is %d\n",pid);

printf("Sending SIGUSR1 to %d\n",pid);

printf("waiting for child process exit\n");

kill(pid,SIGUSR1);          //利用kill给子进程发信号SIGUSR1

childpid=wait(&status);      //等待子进程完成,并返回status

printf("\n\nprocess %d eixt,the return status is 0x%x\n",childpid,status);

exit(EXIT_SUCCESS);

}

return 0;

}

7.10  编写一个程序,它能阅读任意长度的行,并确保它们填充正在使用的缓冲区,同时要处理续行——以反斜线结束的行继续到下一行。在缓冲区结构中,应记录缓冲区的开始、当前行的开始、下一行的开始、缓冲区分配的大小、文件描述符等信息。

答:(上机题)

#include <sys/stat.h>

#include <sys/types.h>

#include <sys/wait.h>

#include <unistd.h>

#include <stdio.h>

#include <stdlib.h>

#include <fcntl.h>

#include <errno.h>

#include <string.h>

#define BUFSIZE 1024

struct buf{

char *buf_start;  //缓冲区的开始

int curline;     //当前行在文件中的行号

size_t size;    //缓冲区的大小

int len;       //当前行的长度

char file[20];  //文件名称

};

int main(int argc, char* argv[])

{

struct buf mybuf;

FILE *file;

char strtmp[4096],str2[512];

int lineno=1;

if((file=fopen(argv[1],"r"))<0){      //打开由argv[1]提供的文件

fprintf(stderr,"cannot open %s for reading\n",argv[1]);

exit(EXIT_FAILURE);

};

while(fgets(strtmp,512,file)!=NULL){    //从文件读取一行,一直到文件结束

mybuf.curline=lineno;

int len=strlen(strtmp);

lineno++;

//printf("The last char is %c\n",strtmp[len-2]);

while(strtmp[len-2]=='\\'){   //处理续行符号,将带有续行符的文本合并成一行

fgets(str2,512,file);

lineno++;

for(int n=0;n<strlen(str2);n++){

strtmp[len-2+n]=str2[n];

}

strtmp[len-2+strlen(str2)]='\0';

len=strlen(strtmp);

}

if(!(mybuf.buf_start=(char *)malloc(len*sizeof(char)))){  //分配内存空间

printf("can't get memory.\n");

exit(EXIT_FAILURE);

};

strcpy(mybuf.buf_start,strtmp);

strcpy(mybuf.file,argv[1]);

mybuf.size=len;

mybuf.len=len-1;

printf("This buffer start at %d\n",mybuf.buf_start);

printf("Size of buffer is %d\n",mybuf.size);

printf("line number in the file is %d\n", mybuf.curline);

printf("content of current line is %s",mybuf.buf_start);

printf("Length of curline is %d\n",mybuf.len);

printf("File:%s\n\n", mybuf.file);

}

return 0;

}

思考题8

8.1  系统管理员的职责主要有哪些方面?

答:一般说来,系统管理员的任务包括以下几个方面:

① 设置整个计算机系统,包括硬件和软件,如安装硬件设备、安装操作系统和软件包、为用户建立账户等。

② 做适当的备份(系统中常规文件复制)和需要时的恢复。

③ 处理由于计算机有限资源的使用(如磁盘空间、进程数目等)而遇到的问题。

④ 排除由于连接问题而造成的系统通信(网络)阻塞。

⑤  进行操作系统的升级和维护。

⑥ 为用户提供常规支持。

8.2  为了修改文件test.txt的权限保护位,使文件属主拥有读、写和执行的权限,组成员和其他用户可以读和执行,应该怎么做?

答:执行以下命令:

chmod  u=w,ugo=rx  test.txt     或者

chmod  u=rwx,go=rx  test.txt    或者

chmod  0755  test.txt

8.3  试在系统中为新用户建立账号、密码等。采用不同方式设置用户密码。

答:(上机操作)

1.使用KDE桌面系统为新用户建立账户和密码的步骤如下:

①点击“开始”菜单,选择“设置”→“系统设置”,弹出系统设置窗口,在“个性化”选项下面选择“账户细节”,可打开账户细节管理工具。

② 在“账户细节”窗口中,点击“密码和用户信息”项。然后,单击“密码和用户信息”窗口中的“+”号按钮,弹出“增加用户”对话框,按要求输入新用户的账号名称、显示名称、密码、确认密码。所有信息设置完成后点击“添加”按钮。

③由于该操作需要root权限,会弹出 “需要认证”窗口,输入root密码,点击“确定”按钮,完成添加新用户操作,新用户将加入到用户列表中。

2. 普通用户可以在登录系统后使用passwd命令来更改自己的密码。

8.4  如何查封一个用户账号?要使一个用户账号失效,应该怎么做?请至少列举三种方法。

答:▲当需要查封某个账号时,可以:

①将用户记录从/etc/passwd文件中去掉,但是保留该用户的主目录和其他文件;

②在/etc/passwd(或/etc/shadow)文件中,在相关用户记录的passwd字段的首字符前加上符号“*”。

③管理员还可以将用户账号的shell设置成一个特定的只打印出一条信息的程序。

▲要使一个用户账号永久失效,即删除该用户账号。

●在图形界面下删除一个用户账户的步骤如下:

①点击“开始”菜单,选择“设置”→“系统设置”,弹出系统设置窗口,在“个性化”选项下面选择“账户细节”,打开账户细节管理工具

② 在“密码和用户信息”标签页中所列出的用户清单里,选取你要删除的一个用户,该栏目被高亮度化。 ③点击“  ”按钮,弹出确认删除用户界面,选择是否同时删除账号及账号所属的文件,点击“确认”按钮删除用户。

●还可以使用userdel命令删除已经存在的用户账户。必须从/etc/passwd文件中删除此用户的记录项、从/etc/group文件中删除提及的此用户,并且删除用户的主目录及其他由该用户创建或属于此用户的文件。userdel命令的一般使用格式是:

userdel  [-r] 用户名

如果使用选项-r,将把用户主目录及其下面的所有内容都删除。

8.5  如何统计系统中磁盘空间的使用情况和空闲情况?

答:可以使用du命令统计当前目录下子目录的磁盘使用情况。

使用df命令可以统计文件系统中空闲的磁盘空间,默认情况下显示所有安装文件系统的磁盘使用信息,即可以用来查看磁盘已被使用多少空间和还剩余多少空间。

8.6  在系统初启过程中,如何让系统自动启动某些程序,以及设置环境变量?请至少列举三种方法。

答:这涉及到用户登录环境的设置。可以采用的方法是:

1.编辑/etc/bashrc文件,它是脚本文件,包含系统定义的命令别名和bash的环境变量定义;

2.编辑/etc/profile文件,它是脚本文件,对系统中所有用户都起作用;

3.编辑$HOME/bash_profile,它是脚本文件,仅对当前用户起作用。

8.7  让一个用户拥有对某个组的资源的访问权限,应该怎么做?请至少列举两种方法。

答:让一个用户拥有对某个组的资源的访问权限,就要将该用户加到该组中。可以采用的方法有:

①由超级用户root使用useradd(或adduser)命令来完成添加用户的工作。利用选项

-G group,[…]  指定新用户的附加组。

②编辑/etc/group文件,将用户名加到相应组的用户列表中。

8.8  如何手工设置磁盘限额?

答:Linux系统是通过quota(磁盘限额)机制来实现对用户使用硬盘资源的控制。如果是首次安装quota,则应按下面步骤执行;如果已经配置好,则可以直接执行⑥。

① 首先在配置核心时,应该将以下核心开关选项:quota support(CONFIG_QUOTA)

设置为“Y”,使核心提供对quota机制的支持。

② 安装与quota相关的软件包。

③ 修改用户的系统初启脚本文件,使之能够检查quota,并在系统初启时开启quota功能。

④ 修改启动文件系统支持。为了在每次启动系统的时候,使文件系统上的quota有效,需要对/etc/fstab文件进行相应的修改。

⑤ 建立quota.user和quota.group文件。

⑥为特定用户指定quota。例如,系统中有一个用户user01。输入edquota user01命令后,进入vi(或是系统默认的编辑器)编辑状态,管理员可以为用户user01编辑各个启用quota的分区限额。

8.9  如何使用dd命令获得硬盘的MBR信息?

答:MBR是整个硬盘的主引导记录(Main Boot Record),它存放在硬盘的第一个扇区(对应于0号磁头的0柱面0扇区)。通常,扇区的大小为512字节。

备份磁盘开头的MBR信息到一个指定的文件,如/root/mbr_temp:

# dd  if=/dev/hda  of=/root/mbr_temp  count=1  bs=512

然后,使用文件操作命令(如cat,wc等)查看、统计文件/root/mbr_temp的信息。

8.10  当Linux系统的超级块受到破坏时,应该如何修复?

答:使用fsck命令检查并修复相应的文件系统(如/dev/hda1分区上的文件系统):

# fsck  -r  /dev/hda1

在修复该文件系统上的超级块之前,要求管理员确认。

8.11  请参照fdisk命令输出的结果来计算所指定的硬盘容量:

Disk /dev/hda: 255 heads, 63 sectors, 2480 cylinders

Units = cylinders of 16065 * 512 bytes

答:该硬盘的单位柱面容量Units=255*63*512=16065*512≈8225(KB)

整个硬盘有2480柱面,所以,整个硬盘容量=8225*2480≈20398(MB)≈20(GB)

8.12  分析/var/log目录中的日志信息,根据本章的介绍,改善自己系统的安全状况。

答:(上机操作题)在/var/log目录中存放系统运行时的使用情况、安全性、系统负载等方面的日志记录。如:

●/var/log/wtmp文件保存所有的登录、退出信息,以及系统的启动、停止记录。可以利用它查看用户的登录记录, last和ac等命令可使用wtmp文件的数据产生报告。

●/var/log/lastlog文件可以记录系统中每个用户的最后一次登录时间。当用户登录时,屏幕上显示的时间就是从lastlog文件中获得的。而且,finger命令报告的登录时间也是从这个文件中取得的。系统管理员应该告诉每个用户仔细检查上次登录的时间,并报告非正常的登录时间。因为人们通常都会记得他上次登录的时间,所以,通过这种方法很容易发现账号是否被破解。

●可以在/var/log目录下找到messages,mail.log等日志文件。/var/log/messages文件记录了命令的执行信息,包括日期、时间、产生这些消息的进程和进程的PID。messages文件中的有关记录可以提醒系统管理员,有人试图猜密码。

8.13  使用hdparm工具优化系统硬盘的性能。

答:(上机操作题)hdparm命令用于读取和设置IDE或SCSI硬盘参数。如:-m选项可查询并设置硬盘多重扇区存取的扇区数,以增进硬盘的存取效率。

8.14  参照man,解释kill -SIGHUP所表示的意义。

答:(上机题)执行命令:man  kill,了解kill命令的功能、用法及信号SIGHUP的含义。该命令让Linux和缓的执行进程关闭,然后立即重启。在配置应用程序的时候,这个命令很方便,在对配置文件修改后需要重启进程时就可以执行此命令。

思考题9

9.1  简述在图形方式下配置网卡的主要过程。

答:①从系统主菜单中选择“程序”→“设置”→“系统设置”,双击“网络设置”图标,自动启动“连接编辑器”。

②在连接编辑器对话框中,点击“添加”按钮,选择对应的网络类型,给出网络连接名称,在“常规配置”、“有线连接”、“802.1x安全”、“Ipv4”、“Ipv6”等标签页设置新连接的相关信息。

③上述参数配置好后,单击“确定”按钮,可使网络参数设置生效。

9.2  简述ping,telnet和ftp命令的功能。

答:ping命令是一种最基本的测试命令,用它来测试本机系统是否能够到达一台远程主机,以及到达的速率。该命令常用来测试本机与远程主机的通信路径是否畅通。根据ping命令运行的结果,可以确定接下来是测试网络连通还是测试应用程序。

telnet命令用于登录并管理远程主机。它采用明文传送报文,安全性不好,很多Linux服务器都不开放telnet服务,而改用更安全的ssh方式了。它还可以确定远程服务的状态,如确定远程服务器的某个端口是否能访问等。

Linux ftp命令的功能是用命令的方式来控制在本地机和远程机之间传送文件。使用ftp提供的很多相关命令,可以从远程机器上下载文件,或者将文件传输到远程机器上,等等。

9.3  电子邮件系统由哪几部分组成?它们的功能是什么?

答:电子邮件系统由邮件用户代理MUA和邮件传送代理MTA两部分组成。

MUA是一个在本地运行的程序,它使用户能通过一个友好界面来发送和接收邮件。允许用户书写、编辑、阅读、保存、删除、打印、回复和转发邮件,同时还提供创建、维护和使用通讯录,提取对方地址,信件自动回复,以及建立目录对来信进行分类保存等功能。

MTA在后台运行,它将邮件通过网络发送给对方主机,并从网络接收邮件,它有两个功能:

① 发送和接收用户的邮件。

② 向发信人报告邮件传送的情况(已交付、被拒绝、丢失等)。

9.4  什么是POP3协议?

答:TCP/IP专门设计了一个对电子邮件信箱进行远程存取的协议,它允许用户的邮箱安置在某个邮件服务器上,并允许用户从他的个人计算机中对邮箱内容进行存取。这个协议就是POP(Post Office Protocol,邮局协议)。POP最初公布于1984年。现在普遍采用的是它的第三个版本,即POP3,它在1993年成为Internet标准。

9.5  简述NFS的基本工作原理。

答:NFS是一种基于TCP/IP的,专门负责文件操作的应用层软件,它建立在XDR和RPC机制上。通过这些机制,NFS就可以屏蔽主机和网络特性,为用户提供完全透明的文件访问功能。NFS采取客户-服务器结构,客户是访问远程文件系统的主机,此时远程文件系统就像本地文件系统的一部分;服务器是提供本地资源(目录或文件)能够被远程主机安装并访问的主机。客户与服务器之间通过RPC机制进行通信。

NFS是通过将NFS服务器的文件系统安装到客户机的文件系统上而得以实现的。NFS协议只负责文件的传送工作,而不负责连接文件系统。NFS服务器可以导出一个或多个文件系统,供客户安装。被导出的文件系统可以是整个磁盘分区,或是一个子树。可以通过配置NFS服务器来指定允许访问导出文件系统的客户及访问权限。NFS允许客户把一个远程文件系统安装在自己文件系统的多个位置上。

9.6  如何配置NFS服务器?

答:①手动方式:用文本编辑器(如vi)修改配置文件/etc/exports。/etc/exports文件的格式如下:

directory_to_export  NFS_client(permissions)  [NFS_client(permissions)…]

其中,directory_to_export是要导出的文件系统或目录的绝对路径名;NFS_client是允许访问该文件系统或目录的客户机名称;permissions是该客户机对此目录的访问权限,可选值为ro(只读)和rw(读、写)。

然后,在命令提示符“# ”下执行exportfs命令,使上述配置文件生效:

exportfs  -a

②图形界面:可以使用图形界面下的netconf配置工具,在“服务器端任务”页面中选择“网络文件系统(NFS)”进行配置。

9.7  网络管理系统主要有哪些功能?

答:网络管理系统应具备下述主要功能:

① 配置管理。定义、识别、初始化、监控网络中的被管对象,改变被管对象的操作特性,报告被管对象的状态。

② 故障管理。指与故障设备的监测、恢复或故障排除等措施有关的网络管理功能,其目的是保证网络能够提供可靠的服务。

③ 性能管理。以提高网络性能为原则,保证在使用最少网络资源和具有最小延时的前提下,网络能提供可行、连续的通信能力。

④ 安全管理。保证网络不被非法使用。

⑤ 计费管理。记录用户使用网络资源的情况,并收取相应的费用,同时统计网络利用率。一般来说,前两个功能是必须的。

9.8  网络安全威胁主要来自哪些方面?ISO安全模型包括哪些安全机制?

答:网络安全威胁主要来自下述方面:① 仿冒用户身份。② 信息流监视。③ 篡改网络信息。④ 否认发出的信息。⑤ 授权威胁。⑥ 活动天窗(Trapdoor)。⑦ 拒绝服务。⑧ 非法使用。⑨ 信息泄露。⑩ 物理入侵。 完整性侵犯。 特洛伊木马。 重发信息。此外,一个实际的网络中往往存在一些安全缺陷,如路由器配置错误、存在匿名FTP、Telnet开放、密码文件/etc/password缺乏安全保护等。

ISO安全模型包括的安全机制有:身份鉴别,访问控制,数据加密,数据完整性,数字签名,防重发和审计机制等。

9.9  Linux系统的安全设定包括哪些方面?

答:对Linux系统的安全设定包括取消不必要的服务、限制远程存取、隐藏重要资料、修补安全漏洞、采用安全工具及经常性的安全检查等。

9.10 什么是计算机病毒?它有何特征?对付病毒的常用方法有哪些?

答:计算机病毒是人为非法制造的带破坏性的一个程序片段,它能攻击合法的程序,使之受到感染。它可以隐藏在可执行程序或数据文件中。当带毒程序运行时,它们通过非授权方式入侵计算机系统,依靠自身的强再生机制不断进行病毒体的扩散。

计算机病毒主要有五个特征:① 病毒程序是人为编制的软件,具有短小精悍的突出特点。② 病毒可以隐藏在可执行程序或数据文件中。③ 可传播性,具有强再生机制。④ 可潜伏性,具有依附于其他媒体寄生的能力。⑤ 病毒可在一定条件下被激活,从而对系统造成危害。

对付病毒的六条措施:① 购买、安装正版软件。② 不要随意打开未知用户发来的邮件。③ 安装杀毒软件,定期或不定期地运行杀毒工具,并及时升级杀毒软件版本。④ 及时下载操作系统的补丁软件包。⑤ 系统重新安装之前,最好将整个硬盘重新格式化,包括重新格式化引导区。⑥ 为文件和目录设置最低权限。9.11 什么是防火墙?它如何发挥作用?主要类型是什么?

答:防火墙是一类安全防范措施的统称,是计算机网络系统总体安全策略的重要组成部分。防火墙通过特定的硬件和软件系统在两个网络之间实现访问控制策略,用来保护内部的网络不易受到来自Internet的侵害。

防火墙系统决定了哪些内部服务可以被外界访问,哪些外界人员可以访问内部的哪些服务,以及哪些外部服务可以被内部人员访问。这样,所有来往Internet的信息都必须经过防火墙,并且接受它的检查。由于Internet来客要访问内部网路,必须先透过防火墙,从而对来自Internet的攻击有较好的免疫作用。

目前,防火墙有多种类型,但大致可以分为两类: 一类基于包过滤(Packet filter)技术,另一类基于代理服务(Proxy Service)技术。

Linux教程(第5版)孟庆昌版 课后答案相关推荐

  1. Linux教程第四版(孟庆昌)--思考题 2 答案

    1.简述Linux命令的一般格式 bash 命令的一般格式是: 命令名 [选项] [参数1] [参数2] 2.请说明下述命令的功能:date,cd,cp,pwd,rm,mkdir,echo,who,l ...

  2. linux死锁的例子,操作系统教程—Linux实例分析 孟庆昌 第8章 死锁new.ppt

    操作系统教程-Linux实例分析 孟庆昌 第8章 死锁new.ppt 第8章 死锁 8.1 概述 8.2 产生死锁的条件 8.3 死锁的预防 8.4 死锁的避免 8.5 死锁的检测与恢复 8.6 处理 ...

  3. Linux教程(第5版) 孟庆尝 牛欣源 张志华 -课后习题答案

    文章目录 前言 Linux教程(第5版) 孟庆尝 牛欣源 张志华 思考题1 思考题2 思考题3 思考题4 思考题5 思考题6 思考题7 思考题8 dd if=/dev/hda of=/root/mbr ...

  4. 【考研复习】《操作系统原理》孟庆昌等编著课后习题+答案——第七章

    CSDN话题挑战赛第2期 参赛话题:学习笔记 前言 此书在最后的附录 B 中,有给出部分重难点部分的参考答案.如果想要此书习题答案,可点以下链接:为一个压缩包,以图片形式,习题图片按章节排序,答案图片 ...

  5. 【考研复习】《操作系统原理》孟庆昌等编著课后习题+答案——第三章

    前言 此书在最后的附录B中,有给出部分重难点部分的参考答案.会在最后放上图片.如果想要此书习题答案,可点以下链接:为一个压缩包,以图片形式,习题图片按章节排序,答案图片按书页排序. <操作系统原 ...

  6. 【考研复习】《操作系统原理》孟庆昌等编著课后习题+答案——第二章

    前言 此书在最后的附录B中,有给出部分重难点部分的参考答案.会在最后放上图片.如果想要此书习题答案,可点以下链接:为一个压缩包,以图片形式,习题图片按章节排序,答案图片按书页排序. <操作系统原 ...

  7. Linux教程第四版(孟庆昌)--思考题 4 答案

    思考题4 4.1 常用的 shell有哪几种? Linux系统中默认的shell是什么? 答: linux几种常见的Shell:sh.bash.csh.tcsh.ash Linux下默认的Shell是 ...

  8. linux孟庆昌第六章课后题_第六章课后练习题答案

    第四部分课后练习题 一.单项选择题 1 . 某投资方案的年营业收入为元, 年总营业成本为 60000 元, 其中年折旧额 10000 元,所得税率为 33 %,该方案的每年营业现金流量为 ( B ) ...

  9. linux孟庆昌第六章课后题_第六章 参数估计-矩估计:通过课后题理解矩估计

    具体思路(一般是求一阶原点矩和一阶中心矩即期望与方差) 根据总体的分布以及概率函数,计算出总体的数学期望与方差,得到总体矩的函数 用样本矩的函数取替换总体矩的函数. 题目一-基础概念题:矩估计的定义 ...

  10. 《Java基础入门第2版》--黑马程序员 课后答案及其详解 第6章 集合

    文章目录 一.填空题 二.判断题 三.选择题 四.简答题 五.编程题 六.原题及其解析 一.填空题 1.Comparator 2.hashNext().next() 3.键.值 4.ArrayList ...

最新文章

  1. CentOS 7设置ulimit不生效的问题解决
  2. 对Java泛型的简单理解
  3. Handlebars模板库浅析
  4. C语言与Java怎么沟通_c语言初学指针,对于java面向对象的初理解
  5. janusgraph整合mysql_图解图库JanusGraph系列-一文知晓“图数据“底层存储结构
  6. java中RIGHT的值_java循环遍历, reduce(),reduceRight()方法和Object,keys遍历对象的属性...
  7. 20155324 《信息安全系统设计基础》课程总结
  8. android捆绑demo_Android捆绑通知
  9. linux关机_LINUX快速入门第二章:Linux 系统启动过程
  10. 下载silverlight官网的全部视频教程
  11. 5901和5909在P570中的功用
  12. 个人博客系统测试用例
  13. Vivado2019.2下载(官网百度云)与安装(手把手)
  14. 世界各地区5G信道一览表[转载,仅作保存使用]
  15. 牛客SQL3查询薪水详情和部门编号
  16. 靠卖艺还债:罗永浩的冬天来了!
  17. java神雕侠侣1古墓情缘游戏攻略_《神雕侠侣》古墓派加点详解攻略
  18. 解决pip下载速度慢的问题
  19. 网易云音乐python爬虫(Js破解)
  20. Vant 商品规格sku用法

热门文章

  1. php使用redis实例,php中使用redis队列操作实例代码
  2. Android实战开发--三种地图类型的设计
  3. 关于计算机组件游戏,电脑游戏运行库组件补全的方法
  4. 《headfirst设计模式》读书总结-包含C++代码
  5. 生物力学有限元Mimics/ANSYS
  6. 【转】Jenkins 构建触发器操作详解
  7. grasshopper for rhino 6下载_Grasshopper做分形图案
  8. Rethinking the smaller-norm-less-infromative assumption in channel pruning of convolution layers
  9. 【Android】ListView 控件的简单使用
  10. 如何利用即时通讯工具进行营销