2023年8月2日发(作者:)

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

思考题11.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核⼼的软件包。核⼼版本的序号由三部分数字构成:evel。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;“⽅向”选择“普通”即可。在“刷新率”下拉列表中设定显⽰器的刷新频率,通常选择“⾃动”即可。配置完成后单击“应⽤”按钮。思考题22.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 -lai2.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’ ABC2.14 如何对⽂件ABC分别按字典顺序、⽉份顺序、算术值进⾏排序?答:按字典顺序排序 sort -d ABC按⽉份顺序排序 sort --M ABC按算术值排序 sort –n ABC2.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 ABC2.16 如何⽤⼀个命令⾏统计给定⽬录中有多少个⼦⽬录?答:设给定⽬录名为DIR,则可以使⽤以下命令⾏:ls -ld DIR|wc -l2.17 类似于DOS下的dir,del,type命令的Linux命令各是什么?答:分别是:ls ,rm和cat。2.18 试说明find,tee,gzip命令的功能。答:分别使⽤以下命令: man find 显⽰该命令的功能是:查找Linux系统上的⽂件或⽬录。 man tee 显⽰该命令的功能是:从标准输⼊设备读取数据,将其输出到标准输出设备,同时保存到指定的⽂件中。 man gzip 显⽰该命令的功能是:对⽂件进⾏压缩和解压缩。

思考题33.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 abc3.8 不管⽂件中某⼀⾏被编辑了多少次,总能把它恢复成被编辑之前的样⼦,应使⽤什么命令?答:使⽤U(⼤写字母)命令就能把当前⾏恢复成被编辑之前的样⼦。3.9 要将编辑⽂件中所有的字符串s1全部⽤字符串s2替换,包括在⼀⾏中多次出现的字符串,应使⽤什么命令格式?答:可以使⽤的命令格式是:g/s1/s//s2/g

思考题44.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 或者$ · /abcd4.4 将主提⽰符改为⽤户的主⽬录名,并予以输出。答:$ PS1="$HOME> " echo $PS1$ export PS14.5 说明三种引号的作⽤有什么区别。答:在shell中引号分为三种: 双引号、单引号和倒引号。(1)由双引号括起来的字符(除$、倒引号ˋ 和转义字符\外)均作为普通字符对待,⽽那三个字符仍保留其特殊功能。(2)由单引号括起来的所有字符都作为普通字符出现。(3)⽤倒引号括起来的字符串被shell解释为命令⾏,在执⾏时,shell会先执⾏该命令⾏,并以执⾏结果取代⽤倒引号括起的部分。另外,可以将⼀个命令的执⾏结果赋给变量,即命令替换。4.6 利⽤变量赋值⽅式,将字符串DOS file c : > $student*显⽰出来。答:$ string=’ DOS file c:>\$student\*’ $ echo $string4.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=echowhile [ $count -gt 0 ]do cmd= "$cmd $$count " count= ` expr $count - 1 `doneeval $cmd答:该脚本的功能是:逆向输出⽤户在命令⾏上提供的各个参数。例如,设该脚本名是ABC,执⾏该脚本的命令⾏是:$ ABC apple big

cat dog

则结果输出是:dog cat big apple4.9 编写⼀个shell脚本,它把第⼆个位置参数及其以后的各个参数指定的⽂件复制到第⼀个位置参数指定的⽬录中。答:上机实践题。参考脚本如下: #!/bin/bash

count=$#if [ -d "$1 " ] then n=2 dir=$1while [ $n –le $count ] do if [ -f $2 ]then cp $2 $direlse echo "$2 is not an ordinary file. "fishift ((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 $1n=2 while[ $n –le $count ] do if [ -f $2 ]then cat $2else echo "Sorry, cannot display $2. "fishift ((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 dirif [ -d $dir ] thenfor name in *.c do mv $name dir donels -S dir ls dir else echo "Sorry!$dir is not a directory. " fi

4.13 利⽤数组形式存放10个城市的名字,然后利⽤for循环把它们打印出来。答:上机实践题。参考脚本如下:#!/bin/bashcity=( Beijing Shanghai Tianjin Guangzhou Chongqing Hangzhou Nanjing Shenyang Taiyuan Jinan)for i in ${city[*]}doecho $idone

4.14 编写⼀个shell脚本,求费波纳奇数列的前10项及总和。答:上机实践题。参考脚本如下: #!/bin/bash fib[1]=1fib[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的值为空,则整个表达式的值等于给定的字符串Hello,name保持不变;否则,整个表达式的值等于name的值,name保持不变。4.16 显⽰前⾯所执⾏的40个命令的清单,重新执⾏倒数第5条命令。编辑其中⼀条命令,然后执⾏。答:上机实践题。$ history 40$ !-5然后,按↑键或↓键,找到你要编辑的命令;进⾏编辑;按Enter键,执⾏该命令。

4.17 定义⼀个别名命令,它等价的功能是:显⽰当前⽇期及⼯作⽬录,并列出有多少⽤户在系统上⼯作。答:上机实践题。$ alias cmd=’date;pwd;who|wc –l’$ cmd4.18 设计⼀个程序cuts,它由标准输⼊读取数据,获取由第⼀个参数n和第⼆个参数m所限定范围的数据,n和m都是整数,即从输⼊的字符串中抽取第n个字符⾄第m个字符之间的所有字符(包括这两个字符)。例如:$ cuts 11 14this is a test of cuts program (输⼊)test (显⽰结果)答:上机实践题。参考脚本如下:#!/bin/bash

read -p "Input a string: " strecho $str | cut -c $1-$2思考题55.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,从中找到相应的函数; 然后,转去执⾏该函数,完成具体的服务。执⾏完服务程序,核⼼检查是否发⽣错误,并作相应处理。如果本进程收到信号,则对信号作相应处理。最后进程从系统空间返回到⽤户空间。

思考题66.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 #include

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 #include

int make_key(void);int get_key_num(void);int number(void);int main(void){ int ret=make_key(); printf("make_key returns %dn",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的通⽤形式如下所⽰:⽬标⽂件:[相依⽂件…]命令1[#注释]…命令n[#注释]其书写规则是:依赖⾏从⼀⾏的开头开始书写。各命令⾏单独占⼀⾏,每个命令⾏的第⼀个字符必须是制表符,⽽不能使⽤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/中的⼀组例程。设最后⽣成的可执⾏⽂件名为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 proga.o:a.c

gcc –c .o:b.c defs.h gcc -c .o:c.c gcc -c .o:d.c defs.h gcc -c .o:assmb.s as -o assmb.o : rm prog *.o

思考题77.1 什么是系统调⽤?什么是库函数?⼆者有何异同?答:系统调⽤是操作系统内核提供的、与⽤户程序之间的接⼝,也就是操作系统提供给程序员的接⼝,⼀般位于操作系统核⼼的最⾼层。库函数:由系统提供,⽤于解决共性问题,为程序的开发和执⾏提供⽅便的程序,本⾝并不属于操作系统的内核部分。相同点:系统调⽤和库函数都是由程序代码构成,⼆者调⽤⽅式相同,都需要在调⽤时传送参数,实参的个数、出现的次序和实参的类型与原型说明中形参表的设计相同。区别:库函数调⽤依赖于所运⾏的⽤户环境,程序调⽤库函数时,它运⾏的⽬标代码是属于程序的,程序处于“⽤户态”执⾏;⽽系统调⽤的使⽤不依赖于它运⾏的⽤户环境,是操作系统内核提供的低层服务,系统调⽤时所执⾏的代码是属于内核的,程序处于“核⼼态”执⾏。库函数的调⽤最终还是要通过系统调⽤来实现,库函数⼀般执⾏⼀条指令,该指令(操作系统陷阱operating system trap)将进程执⾏⽅式变为核⼼态,然后使内核为系统调⽤执⾏代码。7.2 使⽤系统调⽤的⼀般⽅式是什么?答:1、标明相应的⽂件包含。不同的系统调⽤所需要的头⽂件(⼜称前导⽂件)是不同的。这些头⽂件包含了相应程序代码中⽤到的宏定义、类型定义、全称变量及函数说明等。2、在C语⾔程序中,系统调⽤的调⽤⽅式与调⽤库函数相同,即调⽤时,提供的实参的个数、出现的顺序和实参的类型应与原型说明中形参表的设计相同。7.3 编写⼀个程序,把⼀个⽂件的内容复制到另⼀个⽂件上,即实现简单的copy功能。要求:只⽤open( ),read( ),write( )和close( )系统调⽤,程序的第⼀个参数是源⽂件,第⼆个参数是⽬的⽂件。答:(上机题)该程序对应命令的使⽤格式是:命令名 源⽂件 ⽬的⽂件#include #include #include #include #include #include #include #define SIZE 512int main( int argc, char const *argv[] ){int fd1,fd2,N;char buf[SIZE];if(argc<3){ fprintf(stderr, "usage :%s origin destinationn",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 #include #include #include #include #include #include #include #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("",O_CREAT|O_RDWR,S_IRWXU); //辅助⽂件 if(fd<0||fdtmp<0){ fprintf(stderr, "Cannot open a file!n"); return 1;}

truncate("",0); //清空

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 #include #include #include #include #include #include #include #include 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:%sn",argv[0],strerror(errno)); exit(1);};if(pid==0){ //⼦进程printf("nnIn th child processn");printf("Current Process ID:%dn",getpid());printf("Parent Process ID:%dn",getppid());write(file,buf_child,strlen(buf_child));

}else if(pid>0){ //⽗进程wait(NULL); //等待⼦进程完成printf("nnIn the father processn");printf("Current Process ID:%dn",getpid());printf("Parent: Process ID %dn",getppid());write(file,buf_father,strlen(buf_father));}}

利⽤系统调⽤wait( )可以实现⽗⼦进程的同步,即:保证⼦进程输出在前,⽗进程输出在后。如果没有wait(),则输出结果的先后顺序会有随机性,那样,每次运⾏的结果都有可能不同。7.6 编写⼀个程序,尽可能多地输出有关当前进程的信息:PID、PPID、打开⽂件、当前⽬录、nice值等。请简要说明,如何确定哪些⽂件是打开的?如何确定多个⽂件描述符表⽰同⼀个⽂件?答:(上机题)该程序对应命令的使⽤⽅式是:命令名 ⽂件1 ⽂件2#include #include #include #include #include #include #include

#include #include 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 file2n",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:%dn",pid);printf("Parent Process:%dn",ppid);printf("Nice of current process:%dn",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 #include #include #include #include

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:%sn",argv[0],strerror(errno)); exit(1);};

if((leftpid=fork())<0){ //创建左侧⼦进程 fprintf(stderr,"%s:fork of left child failed:%sn",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:%sn",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 #include #include #include #include #include #define MSGKEY 1234int 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:%dn",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 #include #include #include #include #include #include

void handler(int signo){ printf("nnthis 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 exitn"); exit(0); } else{ //⽗进程 int status; int childpid; printf("this is parent process,pid=%d n",getpid()); printf("the child process is %dn",pid); printf("Sending SIGUSR1 to %dn",pid); printf("waiting for child process exitn"); kill(pid,SIGUSR1); //利⽤kill给⼦进程发信号SIGUSR1 childpid=wait(&status); //等待⼦进程完成,并返回status printf("nnprocess %d eixt,the return status is 0x%xn",childpid,status);

exit(EXIT_SUCCESS); }

return 0;}

7.10 编写⼀个程序,它能阅读任意长度的⾏,并确保它们填充正在使⽤的缓冲区,同时要处理续⾏——以反斜线结束的⾏继续到下⼀⾏。在缓冲区结构中,应记录缓冲区的开始、当前⾏的开始、下⼀⾏的开始、缓冲区分配的⼤⼩、⽂件描述符等信息。答:(上机题)#include #include #include #include #include #include #include #include #include #define BUFSIZE 1024struct 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 readingn",argv[1]); exit(EXIT_FAILURE); }; while(fgets(strtmp,512,file)!=NULL){ //从⽂件读取⼀⾏,⼀直到⽂件结束 e=lineno; int len=strlen(strtmp); lineno++; //printf("The last char is %cn",strtmp[len-2]); while(strtmp[len-2]==''){ //处理续⾏符号,将带有续⾏符的⽂本合并成⼀⾏ fgets(str2,512,file); lineno++; for(int n=0;n

思考题88.1 系统管理员的职责主要有哪些⽅⾯?答:⼀般说来,系统管理员的任务包括以下⼏个⽅⾯: ① 设置整个计算机系统,包括硬件和软件,如安装硬件设备、安装操作系统和软件包、为⽤户建⽴账户等。 ② 做适当的备份(系统中常规⽂件复制)和需要时的恢复。 ③ 处理由于计算机有限资源的使⽤(如磁盘空间、进程数⽬等)⽽遇到的问题。 ④ 排除由于连接问题⽽造成的系统通信(⽹络)阻塞。 ⑤ 进⾏操作系统的升级和维护。 ⑥ 为⽤户提供常规⽀持。8.2 为了修改⽂件的权限保护位,使⽂件属主拥有读、写和执⾏的权限,组成员和其他⽤户可以读和执⾏,应该怎么做?答:执⾏以下命令:chmod u=w,ugo=rx 或者chmod u=rwx,go=rx 或者chmod 0755 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。例如,系统中有⼀个⽤户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,等⽇志⽂件。/var/log/messages⽂件记录了命令的执⾏信息,包括⽇期、时间、产⽣这些消息的进程和进程的PID。messages⽂件中的有关记录可以提醒系统管理员,有⼈试图猜密码。8.13 使⽤hdparm⼯具优化系统硬盘的性能。答:(上机操作题)hdparm命令⽤于读取和设置IDE或SCSI硬盘参数。如:-m选项可查询并设置硬盘多重扇区存取的扇区数,以增进硬盘的存取效率。8.14 参照man,解释kill -SIGHUP所表⽰的意义。答:(上机题)执⾏命令:man kill,了解kill命令的功能、⽤法及信号SIGHUP的含义。该命令让Linux和缓的执⾏进程关闭,然后⽴即重启。在配置应⽤程序的时候,这个命令很⽅便,在对配置⽂件修改后需要重启进程时就可以执⾏此命令。思考题99.1 简述在图形⽅式下配置⽹卡的主要过程。答:①从系统主菜单中选择“程序”→“设置”→“系统设置”,双击“⽹络设置”图标,⾃动启动“连接编辑器”。②在连接编辑器对话框中,点击“添加”按钮,选择对应的⽹络类型,给出⽹络连接名称,在“常规配置”、“有线连接”、“802.1x安全”、“Ipv4”、“Ipv6”等标签页设置新连接的相关信息。③上述参数配置好后,单击“确定”按钮,可使⽹络参数设置⽣效。9.2 简述ping,telnet和ftp命令的功能。答:ping命令是⼀种最基本的测试命令,⽤它来测试本机系统是否能够到达⼀台远程主机,以及到达的速率。该命令常⽤来测试本机与远程主机的通信路径是否畅通。根据ping命令运⾏的结果,可以确定接下来是测试⽹络连通还是测试应⽤程序。telnet命令⽤于登录并管理远程主机。它采⽤明⽂传送报⽂,安全性不好,很多Linux服务器都不开放telnet服务,⽽改⽤更安全的⽅式了。它还可以确定远程服务的状态,如确定远程服务器的某个端⼝是否能访问等。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)技术。

2023年8月2日发(作者:)

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

思考题11.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核⼼的软件包。核⼼版本的序号由三部分数字构成:evel。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;“⽅向”选择“普通”即可。在“刷新率”下拉列表中设定显⽰器的刷新频率,通常选择“⾃动”即可。配置完成后单击“应⽤”按钮。思考题22.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 -lai2.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’ ABC2.14 如何对⽂件ABC分别按字典顺序、⽉份顺序、算术值进⾏排序?答:按字典顺序排序 sort -d ABC按⽉份顺序排序 sort --M ABC按算术值排序 sort –n ABC2.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 ABC2.16 如何⽤⼀个命令⾏统计给定⽬录中有多少个⼦⽬录?答:设给定⽬录名为DIR,则可以使⽤以下命令⾏:ls -ld DIR|wc -l2.17 类似于DOS下的dir,del,type命令的Linux命令各是什么?答:分别是:ls ,rm和cat。2.18 试说明find,tee,gzip命令的功能。答:分别使⽤以下命令: man find 显⽰该命令的功能是:查找Linux系统上的⽂件或⽬录。 man tee 显⽰该命令的功能是:从标准输⼊设备读取数据,将其输出到标准输出设备,同时保存到指定的⽂件中。 man gzip 显⽰该命令的功能是:对⽂件进⾏压缩和解压缩。

思考题33.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 abc3.8 不管⽂件中某⼀⾏被编辑了多少次,总能把它恢复成被编辑之前的样⼦,应使⽤什么命令?答:使⽤U(⼤写字母)命令就能把当前⾏恢复成被编辑之前的样⼦。3.9 要将编辑⽂件中所有的字符串s1全部⽤字符串s2替换,包括在⼀⾏中多次出现的字符串,应使⽤什么命令格式?答:可以使⽤的命令格式是:g/s1/s//s2/g

思考题44.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 或者$ · /abcd4.4 将主提⽰符改为⽤户的主⽬录名,并予以输出。答:$ PS1="$HOME> " echo $PS1$ export PS14.5 说明三种引号的作⽤有什么区别。答:在shell中引号分为三种: 双引号、单引号和倒引号。(1)由双引号括起来的字符(除$、倒引号ˋ 和转义字符\外)均作为普通字符对待,⽽那三个字符仍保留其特殊功能。(2)由单引号括起来的所有字符都作为普通字符出现。(3)⽤倒引号括起来的字符串被shell解释为命令⾏,在执⾏时,shell会先执⾏该命令⾏,并以执⾏结果取代⽤倒引号括起的部分。另外,可以将⼀个命令的执⾏结果赋给变量,即命令替换。4.6 利⽤变量赋值⽅式,将字符串DOS file c : > $student*显⽰出来。答:$ string=’ DOS file c:>\$student\*’ $ echo $string4.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=echowhile [ $count -gt 0 ]do cmd= "$cmd $$count " count= ` expr $count - 1 `doneeval $cmd答:该脚本的功能是:逆向输出⽤户在命令⾏上提供的各个参数。例如,设该脚本名是ABC,执⾏该脚本的命令⾏是:$ ABC apple big

cat dog

则结果输出是:dog cat big apple4.9 编写⼀个shell脚本,它把第⼆个位置参数及其以后的各个参数指定的⽂件复制到第⼀个位置参数指定的⽬录中。答:上机实践题。参考脚本如下: #!/bin/bash

count=$#if [ -d "$1 " ] then n=2 dir=$1while [ $n –le $count ] do if [ -f $2 ]then cp $2 $direlse echo "$2 is not an ordinary file. "fishift ((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 $1n=2 while[ $n –le $count ] do if [ -f $2 ]then cat $2else echo "Sorry, cannot display $2. "fishift ((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 dirif [ -d $dir ] thenfor name in *.c do mv $name dir donels -S dir ls dir else echo "Sorry!$dir is not a directory. " fi

4.13 利⽤数组形式存放10个城市的名字,然后利⽤for循环把它们打印出来。答:上机实践题。参考脚本如下:#!/bin/bashcity=( Beijing Shanghai Tianjin Guangzhou Chongqing Hangzhou Nanjing Shenyang Taiyuan Jinan)for i in ${city[*]}doecho $idone

4.14 编写⼀个shell脚本,求费波纳奇数列的前10项及总和。答:上机实践题。参考脚本如下: #!/bin/bash fib[1]=1fib[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的值为空,则整个表达式的值等于给定的字符串Hello,name保持不变;否则,整个表达式的值等于name的值,name保持不变。4.16 显⽰前⾯所执⾏的40个命令的清单,重新执⾏倒数第5条命令。编辑其中⼀条命令,然后执⾏。答:上机实践题。$ history 40$ !-5然后,按↑键或↓键,找到你要编辑的命令;进⾏编辑;按Enter键,执⾏该命令。

4.17 定义⼀个别名命令,它等价的功能是:显⽰当前⽇期及⼯作⽬录,并列出有多少⽤户在系统上⼯作。答:上机实践题。$ alias cmd=’date;pwd;who|wc –l’$ cmd4.18 设计⼀个程序cuts,它由标准输⼊读取数据,获取由第⼀个参数n和第⼆个参数m所限定范围的数据,n和m都是整数,即从输⼊的字符串中抽取第n个字符⾄第m个字符之间的所有字符(包括这两个字符)。例如:$ cuts 11 14this is a test of cuts program (输⼊)test (显⽰结果)答:上机实践题。参考脚本如下:#!/bin/bash

read -p "Input a string: " strecho $str | cut -c $1-$2思考题55.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,从中找到相应的函数; 然后,转去执⾏该函数,完成具体的服务。执⾏完服务程序,核⼼检查是否发⽣错误,并作相应处理。如果本进程收到信号,则对信号作相应处理。最后进程从系统空间返回到⽤户空间。

思考题66.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 #include

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 #include

int make_key(void);int get_key_num(void);int number(void);int main(void){ int ret=make_key(); printf("make_key returns %dn",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的通⽤形式如下所⽰:⽬标⽂件:[相依⽂件…]命令1[#注释]…命令n[#注释]其书写规则是:依赖⾏从⼀⾏的开头开始书写。各命令⾏单独占⼀⾏,每个命令⾏的第⼀个字符必须是制表符,⽽不能使⽤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/中的⼀组例程。设最后⽣成的可执⾏⽂件名为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 proga.o:a.c

gcc –c .o:b.c defs.h gcc -c .o:c.c gcc -c .o:d.c defs.h gcc -c .o:assmb.s as -o assmb.o : rm prog *.o

思考题77.1 什么是系统调⽤?什么是库函数?⼆者有何异同?答:系统调⽤是操作系统内核提供的、与⽤户程序之间的接⼝,也就是操作系统提供给程序员的接⼝,⼀般位于操作系统核⼼的最⾼层。库函数:由系统提供,⽤于解决共性问题,为程序的开发和执⾏提供⽅便的程序,本⾝并不属于操作系统的内核部分。相同点:系统调⽤和库函数都是由程序代码构成,⼆者调⽤⽅式相同,都需要在调⽤时传送参数,实参的个数、出现的次序和实参的类型与原型说明中形参表的设计相同。区别:库函数调⽤依赖于所运⾏的⽤户环境,程序调⽤库函数时,它运⾏的⽬标代码是属于程序的,程序处于“⽤户态”执⾏;⽽系统调⽤的使⽤不依赖于它运⾏的⽤户环境,是操作系统内核提供的低层服务,系统调⽤时所执⾏的代码是属于内核的,程序处于“核⼼态”执⾏。库函数的调⽤最终还是要通过系统调⽤来实现,库函数⼀般执⾏⼀条指令,该指令(操作系统陷阱operating system trap)将进程执⾏⽅式变为核⼼态,然后使内核为系统调⽤执⾏代码。7.2 使⽤系统调⽤的⼀般⽅式是什么?答:1、标明相应的⽂件包含。不同的系统调⽤所需要的头⽂件(⼜称前导⽂件)是不同的。这些头⽂件包含了相应程序代码中⽤到的宏定义、类型定义、全称变量及函数说明等。2、在C语⾔程序中,系统调⽤的调⽤⽅式与调⽤库函数相同,即调⽤时,提供的实参的个数、出现的顺序和实参的类型应与原型说明中形参表的设计相同。7.3 编写⼀个程序,把⼀个⽂件的内容复制到另⼀个⽂件上,即实现简单的copy功能。要求:只⽤open( ),read( ),write( )和close( )系统调⽤,程序的第⼀个参数是源⽂件,第⼆个参数是⽬的⽂件。答:(上机题)该程序对应命令的使⽤格式是:命令名 源⽂件 ⽬的⽂件#include #include #include #include #include #include #include #define SIZE 512int main( int argc, char const *argv[] ){int fd1,fd2,N;char buf[SIZE];if(argc<3){ fprintf(stderr, "usage :%s origin destinationn",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 #include #include #include #include #include #include #include #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("",O_CREAT|O_RDWR,S_IRWXU); //辅助⽂件 if(fd<0||fdtmp<0){ fprintf(stderr, "Cannot open a file!n"); return 1;}

truncate("",0); //清空

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 #include #include #include #include #include #include #include #include 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:%sn",argv[0],strerror(errno)); exit(1);};if(pid==0){ //⼦进程printf("nnIn th child processn");printf("Current Process ID:%dn",getpid());printf("Parent Process ID:%dn",getppid());write(file,buf_child,strlen(buf_child));

}else if(pid>0){ //⽗进程wait(NULL); //等待⼦进程完成printf("nnIn the father processn");printf("Current Process ID:%dn",getpid());printf("Parent: Process ID %dn",getppid());write(file,buf_father,strlen(buf_father));}}

利⽤系统调⽤wait( )可以实现⽗⼦进程的同步,即:保证⼦进程输出在前,⽗进程输出在后。如果没有wait(),则输出结果的先后顺序会有随机性,那样,每次运⾏的结果都有可能不同。7.6 编写⼀个程序,尽可能多地输出有关当前进程的信息:PID、PPID、打开⽂件、当前⽬录、nice值等。请简要说明,如何确定哪些⽂件是打开的?如何确定多个⽂件描述符表⽰同⼀个⽂件?答:(上机题)该程序对应命令的使⽤⽅式是:命令名 ⽂件1 ⽂件2#include #include #include #include #include #include #include

#include #include 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 file2n",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:%dn",pid);printf("Parent Process:%dn",ppid);printf("Nice of current process:%dn",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 #include #include #include #include

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:%sn",argv[0],strerror(errno)); exit(1);};

if((leftpid=fork())<0){ //创建左侧⼦进程 fprintf(stderr,"%s:fork of left child failed:%sn",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:%sn",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 #include #include #include #include #include #define MSGKEY 1234int 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:%dn",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 #include #include #include #include #include #include

void handler(int signo){ printf("nnthis 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 exitn"); exit(0); } else{ //⽗进程 int status; int childpid; printf("this is parent process,pid=%d n",getpid()); printf("the child process is %dn",pid); printf("Sending SIGUSR1 to %dn",pid); printf("waiting for child process exitn"); kill(pid,SIGUSR1); //利⽤kill给⼦进程发信号SIGUSR1 childpid=wait(&status); //等待⼦进程完成,并返回status printf("nnprocess %d eixt,the return status is 0x%xn",childpid,status);

exit(EXIT_SUCCESS); }

return 0;}

7.10 编写⼀个程序,它能阅读任意长度的⾏,并确保它们填充正在使⽤的缓冲区,同时要处理续⾏——以反斜线结束的⾏继续到下⼀⾏。在缓冲区结构中,应记录缓冲区的开始、当前⾏的开始、下⼀⾏的开始、缓冲区分配的⼤⼩、⽂件描述符等信息。答:(上机题)#include #include #include #include #include #include #include #include #include #define BUFSIZE 1024struct 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 readingn",argv[1]); exit(EXIT_FAILURE); }; while(fgets(strtmp,512,file)!=NULL){ //从⽂件读取⼀⾏,⼀直到⽂件结束 e=lineno; int len=strlen(strtmp); lineno++; //printf("The last char is %cn",strtmp[len-2]); while(strtmp[len-2]==''){ //处理续⾏符号,将带有续⾏符的⽂本合并成⼀⾏ fgets(str2,512,file); lineno++; for(int n=0;n

思考题88.1 系统管理员的职责主要有哪些⽅⾯?答:⼀般说来,系统管理员的任务包括以下⼏个⽅⾯: ① 设置整个计算机系统,包括硬件和软件,如安装硬件设备、安装操作系统和软件包、为⽤户建⽴账户等。 ② 做适当的备份(系统中常规⽂件复制)和需要时的恢复。 ③ 处理由于计算机有限资源的使⽤(如磁盘空间、进程数⽬等)⽽遇到的问题。 ④ 排除由于连接问题⽽造成的系统通信(⽹络)阻塞。 ⑤ 进⾏操作系统的升级和维护。 ⑥ 为⽤户提供常规⽀持。8.2 为了修改⽂件的权限保护位,使⽂件属主拥有读、写和执⾏的权限,组成员和其他⽤户可以读和执⾏,应该怎么做?答:执⾏以下命令:chmod u=w,ugo=rx 或者chmod u=rwx,go=rx 或者chmod 0755 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。例如,系统中有⼀个⽤户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,等⽇志⽂件。/var/log/messages⽂件记录了命令的执⾏信息,包括⽇期、时间、产⽣这些消息的进程和进程的PID。messages⽂件中的有关记录可以提醒系统管理员,有⼈试图猜密码。8.13 使⽤hdparm⼯具优化系统硬盘的性能。答:(上机操作题)hdparm命令⽤于读取和设置IDE或SCSI硬盘参数。如:-m选项可查询并设置硬盘多重扇区存取的扇区数,以增进硬盘的存取效率。8.14 参照man,解释kill -SIGHUP所表⽰的意义。答:(上机题)执⾏命令:man kill,了解kill命令的功能、⽤法及信号SIGHUP的含义。该命令让Linux和缓的执⾏进程关闭,然后⽴即重启。在配置应⽤程序的时候,这个命令很⽅便,在对配置⽂件修改后需要重启进程时就可以执⾏此命令。思考题99.1 简述在图形⽅式下配置⽹卡的主要过程。答:①从系统主菜单中选择“程序”→“设置”→“系统设置”,双击“⽹络设置”图标,⾃动启动“连接编辑器”。②在连接编辑器对话框中,点击“添加”按钮,选择对应的⽹络类型,给出⽹络连接名称,在“常规配置”、“有线连接”、“802.1x安全”、“Ipv4”、“Ipv6”等标签页设置新连接的相关信息。③上述参数配置好后,单击“确定”按钮,可使⽹络参数设置⽣效。9.2 简述ping,telnet和ftp命令的功能。答:ping命令是⼀种最基本的测试命令,⽤它来测试本机系统是否能够到达⼀台远程主机,以及到达的速率。该命令常⽤来测试本机与远程主机的通信路径是否畅通。根据ping命令运⾏的结果,可以确定接下来是测试⽹络连通还是测试应⽤程序。telnet命令⽤于登录并管理远程主机。它采⽤明⽂传送报⽂,安全性不好,很多Linux服务器都不开放telnet服务,⽽改⽤更安全的⽅式了。它还可以确定远程服务的状态,如确定远程服务器的某个端⼝是否能访问等。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)技术。