Linux教程(第5版) 孟庆尝 牛欣源 张志华 -课后习题答案
文章目錄
- 前言
- Linux教程(第5版) 孟慶嘗 牛欣源 張志華
- 思考題1
- 思考題2
- 思考題3
- 思考題4
- 思考題5
- 思考題6
- 思考題7
- 思考題8
- dd if=/dev/hda of=/root/mbr_temp count=1 bs=512
- fsck -r /dev/hda1
- 思考題9
- 總結(jié)
前言
Linux教程(第5版) 孟慶嘗 牛欣源 張志華
思考題1
1.1 什么是軟件?軟件分為哪幾種?
答:軟件是相對(duì)硬件而言的,它是與數(shù)據(jù)處理系統(tǒng)操作有關(guān)的計(jì)算機(jī)程序和相關(guān)數(shù)據(jù)等的總稱。
軟件通常可分為三大類,即系統(tǒng)軟件、應(yīng)用軟件和支撐軟件。
1.2 根據(jù)你的理解,簡(jiǎn)述操作系統(tǒng)的定義。
答:(學(xué)生可根據(jù)自己的理解予以表述,要符合下面定義所包含的基本點(diǎn))
操作系統(tǒng)是控制和管理計(jì)算機(jī)系統(tǒng)內(nèi)各種硬件和軟件資源、有效地組織多道程序運(yùn)行的系統(tǒng)軟件(或程序集合),是用戶與計(jì)算機(jī)之間的接口。
1.3 操作系統(tǒng)的主要功能是什么?
答:操作系統(tǒng)的主要功能包括存儲(chǔ)管理、進(jìn)程和處理機(jī)管理、文件管理、設(shè)備管理和用戶接口服務(wù)。
1.4 獨(dú)立運(yùn)行的多用戶系統(tǒng)和單用戶機(jī)器組成的計(jì)算機(jī)網(wǎng)絡(luò)之間有哪些共同點(diǎn)和不同點(diǎn)?
答:共同點(diǎn):①都是多用戶系統(tǒng),多個(gè)用戶可以同時(shí)上機(jī)使用計(jì)算機(jī)系統(tǒng);②系統(tǒng)中某些資源可以共享;③系統(tǒng)中各用戶可以彼此獨(dú)立的操作,互不干擾;④系統(tǒng)中的用戶可以交換信息。
不同點(diǎn):①分布性:獨(dú)立運(yùn)行的多用戶系統(tǒng)是多個(gè)用戶同時(shí)在一臺(tái)主機(jī)上運(yùn)行多道程序,而單用戶機(jī)器組成的計(jì)算機(jī)網(wǎng)絡(luò)是通過(guò)通信線路將地理上分散的多臺(tái)計(jì)算機(jī)連接在一起;②自治性:前者中所有用戶共享同一CPU、內(nèi)存、盤空間等資源,有統(tǒng)一任務(wù)調(diào)度,而后者共享不同計(jì)算機(jī)上的資源,松散耦合,不具備整個(gè)系統(tǒng)統(tǒng)一任務(wù)調(diào)度;③體系結(jié)構(gòu):前者是單機(jī)系統(tǒng),后者是多機(jī)系統(tǒng);④通信方式:前者中進(jìn)程通過(guò)共享內(nèi)存、消息傳遞等進(jìn)行通信,后者通過(guò)網(wǎng)絡(luò)互聯(lián)協(xié)議實(shí)現(xiàn)數(shù)據(jù)通信和資源共享目的;⑤容錯(cuò)性:前者中某一部件出現(xiàn)故障將影響整個(gè)系統(tǒng),而后者不受影響,可靠性更高;⑥并行性:前者只能實(shí)現(xiàn)并發(fā)計(jì)算,而后者可以實(shí)現(xiàn)并行計(jì)算。
1.5 列出Linux系統(tǒng)的主要特點(diǎn)。
答:Linux系統(tǒng)具有一系列顯著特點(diǎn),包括:與UNIX系統(tǒng)兼容;自由軟件和源碼公開;性能高和安全性強(qiáng);便于定制和再開發(fā);互操作性強(qiáng);全面的多任務(wù)和真正的64位操作系統(tǒng)。
1.6 解釋核心版本和發(fā)行版本的含義。Linux 2.1.1版和2.2.1版中,哪一個(gè)版本是穩(wěn)定的?
答:核心版本主要是Linux的內(nèi)核,由Linus等人在不斷地開發(fā)和推出新的內(nèi)核。Linux內(nèi)核的官方版本由Linus Torvalds本人維護(hù)著。發(fā)行版本是各個(gè)公司推出的版本,它們與核心版本是各自獨(dú)立發(fā)展的。發(fā)行版本通常內(nèi)附有一個(gè)核心源碼,以及很多針對(duì)不同硬件設(shè)備的核心映像。所以發(fā)行版本是一些基于Linux核心的軟件包。
核心版本的序號(hào)由三部分?jǐn)?shù)字構(gòu)成:major.minor.patchlevel。Linux 2.1.1版的次版本號(hào)為奇數(shù),不一定很穩(wěn)定,相當(dāng)于測(cè)試版;而Linux 2.2.1版的次版本號(hào)為偶數(shù),是穩(wěn)定的版本。
1.7 某用戶的硬盤空間是10GB,內(nèi)存是256MB。他想安裝普華LinuxV4.0系統(tǒng),是否可以?
答:不行。因?yàn)樵撚?jì)算機(jī)的內(nèi)存空間和硬盤空間配置不滿足普華Linux桌面版V4.0的基本需求(最小內(nèi)存為1GB,最少15.4GB自由硬盤空間,建議20GB以上)。
1.8 安裝Linux系統(tǒng)之前,需要做哪幾方面的準(zhǔn)備工作?
答:比較重要的準(zhǔn)備工作有: 備份數(shù)據(jù)、硬件檢查、準(zhǔn)備硬盤分區(qū)等。
1.9 普華Linux的主要安裝過(guò)程是什么?
答:將安裝光盤放入光驅(qū)中,系統(tǒng)將被自動(dòng)引導(dǎo)。主要安裝過(guò)程是:語(yǔ)言選擇,許可協(xié)議,選擇安裝模式,磁盤分區(qū),檢查安裝選項(xiàng),安裝系統(tǒng),初始化設(shè)置。
1.10 什么是硬盤分區(qū)?一塊硬盤上可以有幾種類型的分區(qū)?各自可以有多少個(gè)?在它們上面能否安裝Linux系統(tǒng)?
答:硬盤分區(qū)是對(duì)硬盤的一種格式化,格式化后才能使用硬盤保存各種信息。在創(chuàng)建分區(qū)時(shí),就設(shè)置好硬盤的各項(xiàng)物理參數(shù),指定硬盤主引導(dǎo)記錄和引導(dǎo)記錄備份的存放位置。另外,分區(qū)時(shí)必須把硬盤的主分區(qū)設(shè)定為活動(dòng)分區(qū),這樣才能夠通過(guò)硬盤啟動(dòng)系統(tǒng)。
硬盤上的分區(qū)有三種類型: 主分區(qū)、擴(kuò)展分區(qū)和邏輯分區(qū)。
一個(gè)硬盤最多只能有4個(gè)主分區(qū);擴(kuò)展分區(qū)可以有1個(gè);擴(kuò)展分區(qū)中可以劃分出多個(gè)邏輯分區(qū)(事實(shí)上只能建立20多個(gè))。
Linux既可以安裝在主分區(qū)上,也可以安裝在邏輯分區(qū)上,但在擴(kuò)展分區(qū)上不能直接安裝。
1.11 多啟動(dòng)系統(tǒng)與虛擬機(jī)系統(tǒng)有何異同?利用VMWare安裝Linux的基本步驟是什么?
答:多啟動(dòng)系統(tǒng):一臺(tái)機(jī)器上同時(shí)存在多個(gè)操作系統(tǒng),每個(gè)操作系統(tǒng)單獨(dú)占用硬盤的一個(gè)分區(qū),每一時(shí)刻只能運(yùn)行一個(gè)系統(tǒng),在系統(tǒng)切換時(shí)需要重新啟動(dòng)機(jī)器。
虛擬機(jī)系統(tǒng):在一臺(tái)機(jī)器上安裝多個(gè)操作系統(tǒng),它們?cè)谥飨到y(tǒng)(如Windows)的平臺(tái)上同時(shí)運(yùn)行,就像標(biāo)準(zhǔn)Windows應(yīng)用程序那樣切換,而且每個(gè)操作系統(tǒng)都可以進(jìn)行虛擬分區(qū)、配置而不影響真實(shí)硬盤的數(shù)據(jù)。
利用VMWare安裝Linux的基本步驟:下載并安裝VMWare,創(chuàng)建虛擬機(jī);安裝Linux操作系統(tǒng);安裝VMWare Tools。
1.12 X Window的體系結(jié)構(gòu)包括哪兩部分?
答:X Window的體系結(jié)構(gòu)包括兩個(gè)部分: 客戶-服務(wù)器模型和X協(xié)議。
1.13 系統(tǒng)設(shè)置的主要功能是什么?訪問(wèn)它的方法是怎樣的?
答:系統(tǒng)設(shè)置是普華Linux V4.0提供的一個(gè)集成的圖形化配置環(huán)境。在系統(tǒng)設(shè)置中,幾乎能找到所有的系統(tǒng)配置和管理工具。它可以方便有效地進(jìn)行如下幾類操作:
查看系統(tǒng)信息,執(zhí)行系統(tǒng)管理任務(wù)。
配置系統(tǒng)中的基本硬件設(shè)備。
定制個(gè)性化的桌面環(huán)境。
管理鼠標(biāo)、鍵盤的定制。
訪問(wèn)系統(tǒng)設(shè)置,可在系統(tǒng)主菜單中選擇“程序”→“設(shè)置”→“系統(tǒng)設(shè)置”。
1.14 KDE桌面環(huán)境由哪幾部分組成?
答:KDE桌面環(huán)境由面板和桌面兩部分組成。
1) 面板。屏幕底部是面板,也稱K面板。可以從這里啟動(dòng)應(yīng)用程序和在桌面上切換。它比Windows 7任務(wù)欄的配置更靈活,功能更強(qiáng)。面板包括系統(tǒng)主菜單按鈕、經(jīng)常使用的應(yīng)用程序、桌面小程序圖標(biāo),以及顯示當(dāng)前運(yùn)行應(yīng)用程序的任務(wù)條。
2) 桌面。屏幕中間的部分是KDE桌面,上面放置了一些常用的應(yīng)用程序和文件的圖標(biāo),在上面雙擊鼠標(biāo)左鍵可運(yùn)行相應(yīng)程序或打開文件,也可以拖動(dòng)它們,改變其位置,或者添加/刪除桌面圖標(biāo)。
1.15 試配置所用的顯示器。
答:(上機(jī)題)配置所用的顯示器的基本步驟是:單擊屏幕左下角的“開始”按鈕,選擇“程序”→“設(shè)置”→“系統(tǒng)設(shè)置”,彈出“系統(tǒng)設(shè)置”窗口,雙擊“硬件”欄中的“顯示和監(jiān)控”。然后在打開的顯示配置界面上,在“分辨率”欄中用滑動(dòng)條設(shè)置屏幕分辨率,像素范圍從640×480到1920×1080。通常可選擇1024×768;“方向”選擇“普通”即可。在“刷新率”下拉列表中設(shè)定顯示器的刷新頻率,通常選擇“自動(dòng)”即可。配置完成后單擊“應(yīng)用”按鈕。思考題2
2.1 簡(jiǎn)述Linux命令的一般格式。
答:Linux命令的一般格式是: 命令名[選項(xiàng)][參數(shù)]…
2.2 請(qǐng)說(shuō)明下述命令的功能:date,cd,cp,pwd,rm,mkdir,echo,who,ls,cat,more,man。
答:date命令用于在屏幕上顯示或設(shè)置系統(tǒng)的日期和時(shí)間。
cd命令改變工作目錄。cp命令將源文件或目錄復(fù)制到目標(biāo)文件或目錄中。
pwd命令顯示出當(dāng)前目錄的路徑。
rm命令可以刪除文件或目錄。
mkdir命令用來(lái)創(chuàng)建目錄。
echo命令可以將命令行中的參數(shù)顯示到標(biāo)準(zhǔn)輸出(即屏幕)上。
who命令將列出所有正在使用系統(tǒng)的用戶、所用終端名和注冊(cè)到系統(tǒng)的時(shí)間。
ls命令列出指定目錄的內(nèi)容。
cat命令連接文件并打印到標(biāo)準(zhǔn)輸出設(shè)備上。cat經(jīng)常用來(lái)顯示文件的內(nèi)容。
more命令顯示文件內(nèi)容,每次顯示一屏。
man命令格式化并顯示某一命令的聯(lián)機(jī)幫助手冊(cè)頁(yè)。
2.3 公元2049年的元旦是星期幾?
答:運(yùn)行命令:cal 1 2049 或 cal Jan 2049
從顯示結(jié)果可知,2049年的元旦是星期五。
2.4 什么是文件?Linux下主要有哪些不同種類的文件?
答:文件(File)是被命名的相關(guān)信息的集合體。它通常存放在外存(如磁盤、光盤)上,可以作為一個(gè)獨(dú)立單位存放和實(shí)施相應(yīng)的操作(如打開、關(guān)閉、讀、寫等)。
Linux系統(tǒng)中主要有以下類型的文件: 普通文件、目錄文件、特別文件以及符號(hào)鏈接文件。
2.5 確定當(dāng)前工作目錄是什么?把工作目錄改到父目錄上,然后用長(zhǎng)格式列出其中所有的內(nèi)容。
答:(上機(jī)做)執(zhí)行命令:pwd 在屏幕上顯示出當(dāng)前工作目錄的絕對(duì)路徑名。
然后依次執(zhí)行命令:
cd …
ls -lai
2.6 在所用的Linux系統(tǒng)上,根目錄下含有哪些內(nèi)容?各自的功能是什么?
答:執(zhí)行命令:cd / 將當(dāng)前目錄改到根目錄
ls -l 列出它的清單上機(jī)操作并參照本教材8.3.3節(jié)相關(guān)內(nèi)容,闡述根目錄下各目錄的基本功能。
2.7 說(shuō)出下列每一項(xiàng)信息各對(duì)應(yīng)哪一類文件:
(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) 塊設(shè)備文件(5)塊設(shè)備(軟盤)文件 (6)目錄文件,其中包含用戶可共享的庫(kù)文件 (7) 普通文件(可執(zhí)行文件)
2.8 要想改變目錄列表中下面三部分的內(nèi)容,應(yīng)該分別用什么命令?
(1)-rwxr--r-- (2)N (3)…ABC答:(1)使用chmod命令改變相應(yīng)文件或目錄的存取權(quán)限。
(2)使用ln命令可以增加指定文件的鏈接數(shù),使用rm刪除文件,可以減少相應(yīng)文件的鏈接數(shù)。
(3)使用mv命令可以對(duì)指定文件或目錄重新命名。
2.9 請(qǐng)給出下列命令執(zhí)行的結(jié)果:
(1)cd (2)cd .. (3)cd .. / .. (4)cd /答:(1) cd 將當(dāng)前目錄改到用戶主目錄。
(2) cd .. 將當(dāng)前目錄向上移一級(jí)(即父目錄)。(3) cd … / … 將當(dāng)前目錄向上移動(dòng)兩級(jí)。
(4) cd / 將當(dāng)前目錄改到根目錄。
2.10 cp,copy和mv 命令有何異同?
答:cp命令復(fù)制一個(gè)文件,而原文件保持不變,這樣文件個(gè)數(shù)就增加了;mv命令將文件從一個(gè)目錄移到另一個(gè)目錄中,該文件就從原目錄中消失,文件個(gè)數(shù)不變。
不能直接用copy作為復(fù)制文件的命令。因?yàn)長(zhǎng)inux系統(tǒng)提供的眾多命令都是有一定規(guī)則和限制的,cp是copy的縮寫,是Linux默認(rèn)的復(fù)制文件的命令,而copy并不是Linux的合法命令。
2.11 用什么命令能把兩個(gè)文件合并成一個(gè)文件?
答:使用cat命令,例如:cat file1 file2 >file3 將文件file1和file2合并后放入file3中。
2.12 如何確定系統(tǒng)中是否有ps命令?如果有,它的功能是什么?
答:可以使用man ps 命令。如果系統(tǒng)中有ps命令,將顯示ps命令的聯(lián)機(jī)幫助手冊(cè)頁(yè),列出有關(guān)該命令的完整說(shuō)明;否則,將顯示出錯(cuò)信息。
ps命令的功能是查看當(dāng)前系統(tǒng)中運(yùn)行的進(jìn)程信息。
2.13 要確定在文件ABC中是否含有表示星期六或者星期日字符的行,應(yīng)使用什么命令?
答:grep ‘Saturday|Sunday’ ABC 或者 grep -i ‘saturday|sunday’ ABC
2.14 如何對(duì)文件ABC分別按字典順序、月份順序、算術(shù)值進(jìn)行排序?
答:按字典順序排序 sort -d ABC
按月份順序排序 sort --M ABC
按算術(shù)值排序 sort –n ABC
2.15 目錄ABC下有兩個(gè)子目錄a1,b2,以及5個(gè)普通文件。如果想刪除ABC目錄,應(yīng)使用什么命令?
答:(1)最簡(jiǎn)單,但是風(fēng)險(xiǎn)較大的方法:rm -r ABC
(2)如果5個(gè)普通文件分別在子目錄a1和b2之下,則可以使用以下命令:
cd ABC/a1
rm *
cd …/b2
rm *
cd …/…
rmdir -p ABC
(3)如果5個(gè)普通文件并未全在兩個(gè)子目錄之下,則可以使用以下命令:
cd ABC
rm -r *
cd …
rmdir ABC
2.16 如何用一個(gè)命令行統(tǒng)計(jì)給定目錄中有多少個(gè)子目錄?
答:設(shè)給定目錄名為DIR,則可以使用以下命令行:
ls -ld DIR|wc -l
2.17 類似于DOS下的dir,del,type命令的Linux命令各是什么?
答:分別是:ls ,rm和cat。
2.18 試說(shuō)明find,tee,gzip命令的功能。
答:分別使用以下命令:
man find 顯示該命令的功能是:查找Linux系統(tǒng)上的文件或目錄。
man tee 顯示該命令的功能是:從標(biāo)準(zhǔn)輸入設(shè)備讀取數(shù)據(jù),將其輸出到標(biāo)準(zhǔn)輸出設(shè)備,同時(shí)保存到指定的文件中。
man gzip 顯示該命令的功能是:對(duì)文件進(jìn)行壓縮和解壓縮。
思考題3
3.1 進(jìn)入和退出vi的方法有哪些?
答:進(jìn)入vi的方法:在系統(tǒng)提示符(設(shè)為$ )下輸入命令vi和想要編輯(建立)的文件名,便可進(jìn)入vi,如:$ vi filename
退出vi的方法:
(1) :wq 把編輯緩沖區(qū)的內(nèi)容寫到你編輯的文件中,退出編輯器,回到 shell下。
(其操作過(guò)程是,先輸入冒號(hào)“: ”,再輸入命令wq。以下命令操作相同。)
(2) :ZZ(大寫字母ZZ) 僅當(dāng)做過(guò)修改時(shí)才將緩沖區(qū)內(nèi)容寫到文件上。
(3) :x 與:ZZ相同。
(4) :q! 強(qiáng)行退出vi。感嘆號(hào)(!)告訴vi,無(wú)條件退出,丟棄緩沖區(qū)內(nèi)容。
3.2 vi編輯器的工作方式有哪些?相互間如何轉(zhuǎn)換?
答:vi編輯器有三種工作方式: 命令方式、插入方式和ex轉(zhuǎn)義方式。
●Shell命令→vi的命令方式:輸入命令vi進(jìn)入編輯器時(shí),就處于vi的命令方式。
●vi的命令方式→Shell命令:在vi的命令方式下使用退出命令,可以返回shell命令方式。
●vi命令方式→插入方式:通過(guò)輸入vi的插入命令(i)、附加命令(a)、打開命令(o)、替換命令(s)、修改命令?或取代命令?可以從命令方式進(jìn)入到插入方式。
●插入方式→vi命令方式:由插入方式回到命令方式的辦法是按Esc鍵(通常在鍵盤的左上角)。
●vi的命令方式→Ex轉(zhuǎn)義方式:在vi的命令方式下,輸入一個(gè)冒號(hào)(:),就進(jìn)入Ex轉(zhuǎn)義方式。
●Ex轉(zhuǎn)義方式→vi的命令方式:轉(zhuǎn)義命令執(zhí)行后,自動(dòng)回到vi命令方式。
3.3 建立一個(gè)文本文件,如會(huì)議通知。
(1)建立文件notes,并統(tǒng)計(jì)其大小。
(2)重新編輯文件notes,加上一個(gè)適當(dāng)?shù)臉?biāo)題。
(3)修改notes中開會(huì)的時(shí)間和地點(diǎn)。
(4)刪除文件中第3行,然后予以恢復(fù)。
答:上機(jī)題。體會(huì)vi編輯器的工作方式及相互轉(zhuǎn)換,熟悉基本命令的使用。可參照以下步驟做:
(1)進(jìn)入vi ,建立一個(gè)空文件notes;
(2)進(jìn)入插入方式,編輯一個(gè)會(huì)議通知;
(3)返回vi命令方式,保存編輯的內(nèi)容并退出vi;
(4)在shell命令方式下,執(zhí)行wc命令,統(tǒng)計(jì)文件notes的大小;
(5)利用vi,重新編輯文件notes,加上一個(gè)會(huì)議通知的標(biāo)題;
(6)保存編輯內(nèi)容并退出vi,利用cat命令查看該文件的內(nèi)容;
(7)重新編輯文件notes,修改其中開會(huì)的時(shí)間和地點(diǎn);
(8)保存內(nèi)容并退出vi,然后利用cat命令查看該文件的內(nèi)容,注意內(nèi)容的變化;
(9)重新編輯該文件,利用文本刪除命令刪除其中的第3行;接著分別利用復(fù)原命令u和U恢復(fù)刪除的內(nèi)容。注意各個(gè)命令執(zhí)行后屏幕顯示內(nèi)容的變化。從中體會(huì)各命令的功能。3.4 建立一個(gè)文本文件,將光標(biāo)移至第5行上。分別利用c,C和cc命令進(jìn)行修改。
答:上機(jī)題。體會(huì)在vi編輯方式下,光標(biāo)移動(dòng)的方式和不同修改命令的功能。注意各命令的使用方式和光標(biāo)位置的移動(dòng)。
3.5 在vi之下,上、下、左、右移動(dòng)光標(biāo)的方式有哪些?
答:參照本教材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 光標(biāo)移至第20行的開頭。
18 | 光標(biāo)移至當(dāng)前行的第18列上。dM 刪除從當(dāng)前行至屏幕中間行的所有行6H 將光標(biāo)移到距離屏幕頂部5行的行首d4B 從光標(biāo)位置反向刪除4個(gè)詞(包括光標(biāo)所在詞)。x 刪除光標(biāo)所在的字符。cw 將光標(biāo)所在字符至詞尾刪除,然后用新輸入的文本代替。
10cc 先刪除光標(biāo)所在行及其下面9行(共10行),然后以新輸入的文本代替。
3rk 表示從光標(biāo)位置開始向右共有3個(gè)字符被k替代。
5s 光標(biāo)所在字符及其后的4個(gè)字符(共5個(gè)字符)被新輸入的字符序列替代。
7S 當(dāng)前行及其下面6行(共7行)被新輸入的正文替換。
8M 將當(dāng)前行和屏幕中間行之間各行向右移動(dòng)8個(gè)字符
/this 從光標(biāo)所在行開始向前查找字符串“this”,找到后就做上標(biāo)記。
?abc?-5 從光標(biāo)所在行開始向后查找字符串“abc”,光標(biāo)停在首次找到行之前的倒數(shù)第5行的行首,即行號(hào)是(匹配行號(hào)-5)。
mg 在光標(biāo)所在位置做上標(biāo)記g,但屏幕上并不顯示 “ g ”。g/int/p 在屏幕上顯示當(dāng)前所編輯的文件中所有包含字符串“int”的行。3.7 如果希望進(jìn)入vi后光標(biāo)位于文件的第10行上,應(yīng)輸入什么命令?
答:設(shè)要編輯的文件名是abc,且該文件大于10行。在shell提示符后輸入以下命令:
vi +10 abc
3.8 不管文件中某一行被編輯了多少次,總能把它恢復(fù)成被編輯之前的樣子,應(yīng)使用什么命令?
答:使用U(大寫字母)命令就能把當(dāng)前行恢復(fù)成被編輯之前的樣子。
3.9 要將編輯文件中所有的字符串s1全部用字符串s2替換,包括在一行中多次出現(xiàn)的字符串,應(yīng)使用什么命令格式?
答:可以使用的命令格式是:g/s1/s//s2/g
思考題4
4.1 常用的shell有哪幾種?Linux系統(tǒng)中默認(rèn)的shell是什么?
答:常用的有: Bourne shell(簡(jiǎn)稱sh)、C shell(簡(jiǎn)稱csh)、Korn shell(簡(jiǎn)稱ksh)和Bourne Again shell(簡(jiǎn)稱bash)。
Linux系統(tǒng)中默認(rèn)的shell是bash。
4.2 簡(jiǎn)述shell的主要特點(diǎn)。bash有什么特點(diǎn)?
答:shell具有如下主要特點(diǎn):
(1)命令組合,構(gòu)成新的命令;
(2)提供了文件名擴(kuò)展字符(通配符,如* 、 ?、 [ ]);
(3) 可以直接使用shell的內(nèi)置命令,而不需創(chuàng)建新的進(jìn)程;
(4)允許靈活地使用數(shù)據(jù)流,提供通配符、輸入/輸出重定向、管道線等機(jī)制,方便了模式匹配、I/O處理和數(shù)據(jù)傳輸;
(5) 結(jié)構(gòu)化的程序模塊,提供了順序流程控制、條件控制、循環(huán)控制等;
(6)提供了在后臺(tái)(&)執(zhí)行命令的能力;
(7)提供了可配置的環(huán)境,允許創(chuàng)建和修改命令、命令提示符和其他的系統(tǒng)行為;
(8)提供了一個(gè)高級(jí)的命令語(yǔ)言,能創(chuàng)建從簡(jiǎn)單到復(fù)雜的程序。這些shell程序稱為shell腳本。
bash是Linux系統(tǒng)默認(rèn)的一個(gè)shell。bash不但與Bourne shell兼容,還繼承了C shell,Korn shell等下述優(yōu)點(diǎn):
① 命令行歷史。使用命令行歷史特性,可以恢復(fù)以前輸入的命令。
② 命令行編輯。可以利用編輯器(如vi)修改已經(jīng)輸入的命令。
③ 命令補(bǔ)全。能在輸入文件名的一部分之后,由系統(tǒng)自動(dòng)填入剩余的部分。
④ 別名擴(kuò)展。能建立代表某些命令的名字。
4.3 執(zhí)行shell腳本的方式主要是哪些?
答:執(zhí)行shell腳本的常用方式基本上有兩種:
(1) 以腳本名作為參數(shù)。其一般形式是: $ bash 腳本名 [參數(shù)]
(2) 將shell腳本的權(quán)限設(shè)置為可執(zhí)行,然后在提示符下直接執(zhí)行它。
例如,設(shè)abcd是shell腳本文件,執(zhí)行步驟如下:
$ chmod a+x abcd
$ PATH=$PATH:·
$ abcd 或者
$ · /abcd
4.4 將主提示符改為用戶的主目錄名,并予以輸出。
答:$ PS1="$HOME> "
echo $PS1$ export PS1
4.5 說(shuō)明三種引號(hào)的作用有什么區(qū)別。
答:在shell中引號(hào)分為三種: 雙引號(hào)、單引號(hào)和倒引號(hào)。
(1)由雙引號(hào)括起來(lái)的字符(除$、倒引號(hào)ˋ 和轉(zhuǎn)義字符\外)均作為普通字符對(duì)待,而那三個(gè)字符仍保留其特殊功能。
(2)由單引號(hào)括起來(lái)的所有字符都作為普通字符出現(xiàn)。
(3)用倒引號(hào)括起來(lái)的字符串被shell解釋為命令行,在執(zhí)行時(shí),shell會(huì)先執(zhí)行該命令行,并以執(zhí)行結(jié)果取代用倒引號(hào)括起的部分。另外,可以將一個(gè)命令的執(zhí)行結(jié)果賦給變量,即命令替換。
4.6 利用變量賦值方式,將字符串DOS file c : > $student*顯示出來(lái)。
答:$ string=’ DOS file c:>\$student\*’
$ echo $string4.7 顯示環(huán)境變量的設(shè)置情況,說(shuō)明各自的意義。
答:執(zhí)行env命令,在屏幕上將會(huì)顯示出當(dāng)前環(huán)境下的所有環(huán)境變量及其值。讀者可以依據(jù)所用機(jī)器上實(shí)際顯示的信息,進(jìn)行說(shuō)明。常用的環(huán)境變量有以下幾個(gè)。
(1) HOME: 用戶主目錄的全路徑名。
(2) LOGNAME: 即用戶注冊(cè)名,由Linux自動(dòng)設(shè)置。
(3) PWD: 當(dāng)前工作目錄的路徑。
(4) PATH: shell查找命令的路徑(目錄)列表,各個(gè)目錄用冒號(hào)(: )隔開。
(5) PS1: shell的主提示符。用戶可以設(shè)置PS1的值。
⑹ SHELL: 當(dāng)前使用的shell。通常,它的值是/bin/bash。
⑺TERM: 終端類型。
(8) MAIL: 系統(tǒng)信箱的路徑。
4.8 分析下列shell腳本的功能:
count=$#
cmd=echo
while [ $count -gt 0 ]
do
cmd= "$cmd \$$count "count= ` expr $count - 1 `done
eval $cmd
答:該腳本的功能是:逆向輸出用戶在命令行上提供的各個(gè)參數(shù)。例如,設(shè)該腳本名是ABC,執(zhí)行該腳本的命令行是:$ ABC apple big cat dog
則結(jié)果輸出是:dog cat big apple
4.9 編寫一個(gè)shell腳本,它把第二個(gè)位置參數(shù)及其以后的各個(gè)參數(shù)指定的文件復(fù)制到第一個(gè)位置參數(shù)指定的目錄中。
答:上機(jī)實(shí)踐題。參考腳本如下:
#!/bin/bashcount=$#
if [ -d "$1 " ]
thenn=2dir=$1while [ $n –le $count ]
doif [ -f $2 ]then cp $2 $dir
else echo "$2 is not an ordinary file. "
fi
shift
((n=n+1))doneelse echo "$1 is not a directory. "fi
4.10 編寫一個(gè)shell腳本,顯示當(dāng)天日期,查找給定的某用戶是否在系統(tǒng)中工作。如果在系統(tǒng)中,就發(fā)一個(gè)問(wèn)候給他。
答:上機(jī)實(shí)踐題。參考腳本如下:
#!/bin/bashdateecho "Input a user name for searching "read nameif who|grep "$name "thenecho "Lucky, there is $name in my system now. "echo "Hi,how are you! " > /var/spool/mail/$nameelse echo "Unlucky, there is not $name in my system. "fi4.11 打印給定目錄下的某些文件,由第一個(gè)參數(shù)指出文件所在的目錄,其余參數(shù)是要打印的文件名。
答:上機(jī)實(shí)踐題。參考腳本如下:
#!/bin/bashcount=$#if [ -d "$1 " ]
thencd $1n=2
while[ $n –le $count ]doif [ -f $2 ]then cat $2
else echo "Sorry, cannot display $2. "
fi
shift
((n=n+1))doneelse echo "$1 is not a directory. "fi
4.12 利用for循環(huán)將當(dāng)前目錄下的 .c文件移到指定的目錄下,并按文件大小排序,顯示移動(dòng)后指定目錄的內(nèi)容。
答:上機(jī)實(shí)踐題。參考腳本如下:
#!/bin/bashecho "Input the name of a directory. "read dirif [ -d $dir ]
thenfor name in *.c
domv $name dirdonels -S dir
ls direlse echo "Sorry!$dir is not a directory. "fi4.13 利用數(shù)組形式存放10個(gè)城市的名字,然后利用for循環(huán)把它們打印出來(lái)。
答:上機(jī)實(shí)踐題。參考腳本如下:
#!/bin/bash
city=( Beijing Shanghai Tianjin Guangzhou Chongqing Hangzhou Nanjing Shenyang Taiyuan Jinan)
for i in ${city[*]}
do
echo $i
done
4.14 編寫一個(gè)shell腳本,求費(fèi)波納奇數(shù)列的前10項(xiàng)及總和。
答:上機(jī)實(shí)踐題。參考腳本如下:
#!/bin/bashfib[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))donefor ((i=1;i<=10;i++))doecho ${fib[i]}doneecho $sum4.15 下述表達(dá)式的作用是什么?
${ name[] } ${ name[@] } ${ name #/ }
${ name %%.* } ${ #name[*] } ${ name:-Hello }
答:name[?]和{name[*]}和name[?]和{name[@]} 都表示數(shù)組name中所有非空元素的值,每個(gè)元素的值用空格分開。
${ name #/ } 如果name值的開頭包含模式/,那么該表達(dá)式的值就是name中去掉最少匹配*/部分后的結(jié)果;否則,就是name的值。
${ name %%.* } 如果name值的末尾包含.*,那么該表達(dá)式的值就是name中去掉最多匹配.*部分后的結(jié)果;否則,就是name的值。
${#nane[*]}的值是數(shù)組name中已經(jīng)設(shè)置的元素的個(gè)數(shù)。
${ name:-Hello } 如果name的值為空,則整個(gè)表達(dá)式的值等于給定的字符串Hello,name保持不變;否則,整個(gè)表達(dá)式的值等于name的值,name保持不變。
4.16 顯示前面所執(zhí)行的40個(gè)命令的清單,重新執(zhí)行倒數(shù)第5條命令。編輯其中一條命令,然后執(zhí)行。
答:上機(jī)實(shí)踐題。
$ history 40
$ !-5
然后,按↑鍵或↓鍵,找到你要編輯的命令;
進(jìn)行編輯;
按Enter鍵,執(zhí)行該命令。
4.17 定義一個(gè)別名命令,它等價(jià)的功能是:顯示當(dāng)前日期及工作目錄,并列出有多少用戶在系統(tǒng)上工作。
答:上機(jī)實(shí)踐題。
$ alias cmd=’date;pwd;who|wc –l’
$ cmd
4.18 設(shè)計(jì)一個(gè)程序cuts,它由標(biāo)準(zhǔn)輸入讀取數(shù)據(jù),獲取由第一個(gè)參數(shù)n和第二個(gè)參數(shù)m所限定范圍的數(shù)據(jù),n和m都是整數(shù),即從輸入的字符串中抽取第n個(gè)字符至第m個(gè)字符之間的所有字符(包括這兩個(gè)字符)。例如:
$ cuts 11 14
this is a test of cuts program (輸入)
test (顯示結(jié)果)
答:上機(jī)實(shí)踐題。參考腳本如下:
#!/bin/bash
read -p "Input a string: " str
echo $str | cut -c $1-$2
思考題5
5.1 說(shuō)明Linux系統(tǒng)的體系結(jié)構(gòu)分為哪幾層。
答:Linux系統(tǒng)的體系結(jié)構(gòu)大致可分為三層:
① 靠近硬件的底層是內(nèi)核,即Linux操作系統(tǒng)常駐內(nèi)存部分。
② 中間層是內(nèi)核之外的shell層,即操作系統(tǒng)的系統(tǒng)程序部分。
③ 最高層是應(yīng)用層,即用戶程序部分。
5.2 說(shuō)明Linux系統(tǒng)核心結(jié)構(gòu)的組成情況。
答:Linux是采用單體結(jié)構(gòu)的操作系統(tǒng),所有的內(nèi)核系統(tǒng)功能都包含在一個(gè)大型的內(nèi)核軟件之中。Linux內(nèi)核分為用戶層、核心層和硬件層3個(gè)層次,其內(nèi)核結(jié)構(gòu)框圖如下圖所示。
5.3 什么是進(jìn)程?什么是線程?Linux系統(tǒng)中的進(jìn)程有哪些狀態(tài)?如何獲取系統(tǒng)中各進(jìn)程的狀態(tài)?
答:簡(jiǎn)單地說(shuō),進(jìn)程就是程序的一次執(zhí)行過(guò)程。具體地說(shuō),進(jìn)程是具有獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位。
線程(Thread)是進(jìn)程中實(shí)施調(diào)度和分派的基本單位。
在Linux系統(tǒng)中,進(jìn)程有五種狀態(tài):①運(yùn)行態(tài)(TASK_RUNNING)。②可中斷等待態(tài)(TASK_INTERRUPTIBLE)。③不可中斷等待態(tài)(TASK_UNINTERRUPTIBLE)。④停止態(tài)(TASK_STOPPED)。⑤僵死態(tài)(TASK_ZOMBIE)。
利用命令ps aux可以獲取系統(tǒng)中各進(jìn)程的狀態(tài)。
5.4 Linux系統(tǒng)中進(jìn)程有哪兩種模式?各有何特點(diǎn)?
答:Linux系統(tǒng)中進(jìn)程的運(yùn)行模式劃分為用戶模式和內(nèi)核模式。
在內(nèi)核模式下運(yùn)行的進(jìn)程可以執(zhí)行機(jī)器的特權(quán)指令,該進(jìn)程的運(yùn)行不受用戶的干預(yù),即使是root用戶也不能干預(yù)內(nèi)核模式下進(jìn)程的運(yùn)行。
用戶模式中執(zhí)行的進(jìn)程,可以通過(guò)系統(tǒng)調(diào)用或在出現(xiàn)中斷、異常時(shí)進(jìn)入內(nèi)核模式。
5.5 Linux系統(tǒng)中進(jìn)程控制塊的作用是什么?它與進(jìn)程有何關(guān)系?
答:Linux系統(tǒng)中的每個(gè)進(jìn)程都有一個(gè)名為task_struct的數(shù)據(jù)結(jié)構(gòu),它相當(dāng)于“進(jìn)程控制塊”,包含了進(jìn)程的描述信息和控制信息,是進(jìn)程組成中最關(guān)鍵的部分。
每個(gè)進(jìn)程有唯一的進(jìn)程控制塊;操作系統(tǒng)根據(jù)它對(duì)進(jìn)程實(shí)施控制和管理,是進(jìn)程存在的唯一標(biāo)志。
5.6 Linux系統(tǒng)如何執(zhí)行進(jìn)程調(diào)度?
答:Linux系統(tǒng)的進(jìn)程調(diào)度涉及調(diào)度方式、調(diào)度策略和調(diào)度時(shí)機(jī)三個(gè)方面。
Linux內(nèi)核的調(diào)度方式基本上采用“搶占式優(yōu)先級(jí)”方式。
Linux系統(tǒng)針對(duì)不同類別的進(jìn)程提供了三種不同的調(diào)度策略,即: SCHED_FIFO(適合于實(shí)時(shí)進(jìn)程)、SCHED_RR(對(duì)應(yīng)“時(shí)間片輪轉(zhuǎn)法”)以及SCHED_OTHER(適合于交互式的分時(shí)進(jìn)程)。
核心進(jìn)行進(jìn)程調(diào)度的時(shí)機(jī)有以下幾種情況: (1)當(dāng)前進(jìn)程調(diào)用系統(tǒng)調(diào)用nanosleep()或者pause(),使自己進(jìn)入睡眠狀態(tài),主動(dòng)讓出一段時(shí)間的CPU使用權(quán); (2)進(jìn)程終止,永久地放棄對(duì)CPU的使用; (3)在時(shí)鐘中斷處理程序執(zhí)行過(guò)程中,發(fā)現(xiàn)當(dāng)前進(jìn)程連續(xù)運(yùn)行的時(shí)間過(guò)長(zhǎng); (4)當(dāng)喚醒一個(gè)睡眠進(jìn)程時(shí),發(fā)現(xiàn)被喚醒的進(jìn)程比當(dāng)前進(jìn)程更有資格運(yùn)行; (5)一個(gè)進(jìn)程通過(guò)執(zhí)行系統(tǒng)調(diào)用來(lái)改變調(diào)度策略或者降低自身的優(yōu)先權(quán),從而引起立即調(diào)度。
5.7 shell的基本工作過(guò)程是怎樣的?
答:shell命令解釋程序不屬于內(nèi)核部分,而是在核心之外,以用戶態(tài)方式運(yùn)行。其基本工作流程是:
① 讀取用戶由鍵盤輸入的命令行。
② 判斷命令是否正確,且將命令行的其他參數(shù)改造為系統(tǒng)調(diào)用exec ( )內(nèi)部處理所要求的形式。
③ 終端進(jìn)程調(diào)用fork( )建立一個(gè)子進(jìn)程。
④ 終端進(jìn)程本身用系統(tǒng)調(diào)用wait4( )來(lái)等待子進(jìn)程完成(如果是后臺(tái)命令,則不等待)。
⑤ 當(dāng)調(diào)度子進(jìn)程運(yùn)行時(shí),它調(diào)用exec( )—— 根據(jù)文件名(即命令名)到目錄中查找有關(guān)文件(可執(zhí)行文件),調(diào)入內(nèi)存,更換自己的映像,然后執(zhí)行這個(gè)程序(即執(zhí)行這條命令)。
⑥ 如果命令行末尾有&(后臺(tái)命令符號(hào)),則終端進(jìn)程不執(zhí)行系統(tǒng)調(diào)用wait4( ),而是立即發(fā)提示符KaTeX parse error: Expected 'EOF', got '&' at position 24: …個(gè)命令,轉(zhuǎn)①;如果命令末尾沒(méi)有&?,則終端進(jìn)程要一直等待。當(dāng)子進(jìn)…,讓用戶輸入新的命令,重復(fù)上述處理過(guò)程。
5.8 Linux系統(tǒng)一般采用哪種文件系統(tǒng)?其構(gòu)造形式如何?
答:目前,Linux主要使用的文件系統(tǒng)是ext2、ext3和ext4。ext3是ext2的升級(jí)版本,加入了記錄數(shù)據(jù)的日志功能。ext4是ext3文件系統(tǒng)的后繼版本,是擴(kuò)展日志式文件系統(tǒng)。
ext2文件系統(tǒng)中的文件信息都保存在數(shù)據(jù)塊中。ext2文件系統(tǒng)將邏輯塊劃分成塊組,每個(gè)塊組重復(fù)保存著一些有關(guān)整個(gè)文件系統(tǒng)的關(guān)鍵信息以及實(shí)際的文件和目錄的數(shù)據(jù)塊。Ext2文件系統(tǒng)的物理構(gòu)造形式如下圖所示
5.9 什么是塊組?什么是超級(jí)塊?超級(jí)塊的功能是什么?
答: Linux主要使用的文件系統(tǒng)是ext2和ext3,各自劃分成若干塊組。每個(gè)塊組重復(fù)保存著一些有關(guān)整個(gè)文件系統(tǒng)的關(guān)鍵信息,以及真正的文件和目錄的數(shù)據(jù)塊,其中包含超級(jí)塊、塊組描述結(jié)構(gòu)、塊位示圖、索引節(jié)點(diǎn)位示圖、索引節(jié)點(diǎn)表和數(shù)據(jù)塊。
超級(jí)塊位于每個(gè)塊組的最前面,其中包含有關(guān)該文件系統(tǒng)的全部關(guān)鍵參數(shù)。當(dāng)計(jì)算機(jī)加電進(jìn)行引導(dǎo)或第1次遇到該文件系統(tǒng)時(shí),就把超級(jí)塊中的信息讀入內(nèi)存。超級(jí)塊中包含標(biāo)識(shí)文件系統(tǒng)類型的幻數(shù)、文件系統(tǒng)中的盤塊數(shù)量、修改標(biāo)記及其他關(guān)鍵管理信息。
超級(jí)塊中包含有文件系統(tǒng)本身的大小和形式的基本信息,文件系統(tǒng)管理員可以利用這些信息來(lái)使用和維護(hù)文件系統(tǒng)。
5.10 什么是索引節(jié)點(diǎn)?索引節(jié)點(diǎn)主要有哪些內(nèi)容?它與文件有何關(guān)系?
答:索引節(jié)點(diǎn)又被稱為I節(jié)點(diǎn),是一個(gè)結(jié)構(gòu)數(shù)組,其中包含有關(guān)該文件的全部管理信息。
索引節(jié)點(diǎn)主要包括以下內(nèi)容: 文件模式,文件屬主信息,文件大小,時(shí)間戳,文件鏈接計(jì)數(shù),數(shù)據(jù)塊索引表等。
ext2文件系統(tǒng)的索引節(jié)點(diǎn)起著文件控制塊的作用,利用這種數(shù)據(jù)結(jié)構(gòu)可對(duì)文件進(jìn)行控制和管理。每個(gè)文件都只有一個(gè)索引節(jié)點(diǎn)。
5.11 為什么要設(shè)立虛擬文件系統(tǒng)(VFS)?它與實(shí)際文件系統(tǒng)的關(guān)系是怎樣的?
答:Linux系統(tǒng)可以支持多種文件系統(tǒng),為此,必須使用一種統(tǒng)一的接口,這就是虛擬文件系統(tǒng)(VFS)。通過(guò)VFS將不同文件系統(tǒng)的實(shí)現(xiàn)細(xì)節(jié)隱藏起來(lái),從外部看上去所有的文件系統(tǒng)都是一樣的。
VFS是建立在具體文件系統(tǒng)之上的,VFS必須管理所有的文件系統(tǒng)。用戶程序(進(jìn)程)通過(guò)有關(guān)文件系統(tǒng)操作的系統(tǒng)調(diào)用進(jìn)入系統(tǒng)空間,然后經(jīng)由VFS才可使用Linux系統(tǒng)中具體的文件系統(tǒng)。
5.12 Linux系統(tǒng)通常為什么要把硬盤劃分為多個(gè)文件系統(tǒng)?簡(jiǎn)述文件系統(tǒng)安裝的基本過(guò)程。
答:一個(gè)硬盤上可以同時(shí)存在多個(gè)文件系統(tǒng),每個(gè)文件系統(tǒng)占據(jù)硬盤的一個(gè)獨(dú)立分區(qū)。Linux文件系統(tǒng)可以根據(jù)需要隨時(shí)裝卸,從而實(shí)現(xiàn)文件存儲(chǔ)空間的動(dòng)態(tài)擴(kuò)充和信息安全。在系統(tǒng)初啟時(shí),只有根文件系統(tǒng),其他的文件系統(tǒng)可以根據(jù)需要作為子系統(tǒng)動(dòng)態(tài)地安裝到主系統(tǒng)中,已安裝的子文件系統(tǒng)也可從整個(gè)文件系統(tǒng)上卸下來(lái),恢復(fù)安裝前的獨(dú)立狀態(tài)。
文件系統(tǒng)安裝的基本過(guò)程是:超級(jí)用戶可以使用命令mount將新文件系統(tǒng)安裝到主文件系統(tǒng)中。該命令帶有3個(gè)主要參數(shù):要安裝的文件系統(tǒng)類型、該文件系統(tǒng)所在分區(qū)名和安裝新文件系統(tǒng)的路徑名(即安裝點(diǎn))。執(zhí)行該命令時(shí),Linux系統(tǒng)內(nèi)核必須首先檢查有關(guān)參數(shù)的有效性。VFS首先應(yīng)找到要安裝的文件系統(tǒng),通過(guò)查找由file_systems指針指向的鏈表中的每一個(gè)file_system_type數(shù)據(jù)結(jié)構(gòu)來(lái)搜索已知的文件系統(tǒng)(該結(jié)構(gòu)包含文件系統(tǒng)的名字和指向VFS超級(jí)塊讀取程序地址的指針),當(dāng)找到一個(gè)匹配的名字時(shí),就可以得到讀取文件系統(tǒng)超級(jí)塊的程序的地址。接著要查找作為新文件系統(tǒng)安裝點(diǎn)的VFS索引節(jié)點(diǎn),并且在同一目錄下不能安裝多個(gè)文件系統(tǒng)。VFS安裝程序必須分配一個(gè)VFS超級(jí)塊(super_block),并且向它傳遞一些有關(guān)文件系統(tǒng)安裝的信息。申請(qǐng)一個(gè)vfsmount數(shù)據(jù)結(jié)構(gòu)(其中包括存儲(chǔ)文件系統(tǒng)的塊設(shè)備的設(shè)備號(hào)、文件系統(tǒng)安裝的目錄和一個(gè)指向文件系統(tǒng)的VFS超級(jí)塊的指針),并使它的指針指向所分配的VFS超級(jí)塊。當(dāng)文件系統(tǒng)安裝以后,該文件系統(tǒng)的根索引節(jié)點(diǎn)就一直保存在VFS索引節(jié)點(diǎn)緩存中。
5.13 Linux系統(tǒng)采用哪兩種內(nèi)存管理技術(shù)?各自的基本實(shí)現(xiàn)思想是什么?
答:Linux系統(tǒng)采用交換和請(qǐng)求分頁(yè)兩種內(nèi)存管理技術(shù)。
請(qǐng)求分頁(yè)存儲(chǔ)管理技術(shù)是在簡(jiǎn)單分頁(yè)存儲(chǔ)技術(shù)基礎(chǔ)上發(fā)展起來(lái)的,它的基本思想是:當(dāng)進(jìn)程運(yùn)行時(shí),不必把整個(gè)進(jìn)程映像都放在內(nèi)存中,只需在內(nèi)存保留當(dāng)前用到的那一部分頁(yè)面。當(dāng)進(jìn)程訪問(wèn)到某些尚未在內(nèi)存的頁(yè)面時(shí),就由核心把這些頁(yè)面裝入內(nèi)存。這種策略使進(jìn)程的虛擬地址空間映射到機(jī)器的物理空間時(shí)具有更大的靈活性,通常允許進(jìn)程的大小可大于可用內(nèi)存的總量,并允許更多進(jìn)程同時(shí)在內(nèi)存中執(zhí)行。
內(nèi)存交換的基本思想是:當(dāng)系統(tǒng)中出現(xiàn)內(nèi)存不足時(shí),Linux內(nèi)存管理子系統(tǒng)就釋放一些內(nèi)存頁(yè),從而增加系統(tǒng)中空閑內(nèi)存頁(yè)的數(shù)量,此任務(wù)是由內(nèi)核的交換守護(hù)進(jìn)程kswapd完成的。
5.14 何謂虛擬存儲(chǔ)器?Linux系統(tǒng)如何支持虛存?
答:所謂虛擬存儲(chǔ)器是用戶能作為可編址內(nèi)存對(duì)待的虛擬存儲(chǔ)空間,它使用戶邏輯存儲(chǔ)器與物理存儲(chǔ)器分離,是操作系統(tǒng)給用戶提供的一個(gè)比真實(shí)內(nèi)存空間大得多的地址空間。
Linux存儲(chǔ)管理采用請(qǐng)求分頁(yè)技術(shù),請(qǐng)求分頁(yè)提供虛擬存儲(chǔ)器。它的基本思想是: 當(dāng)我們要執(zhí)行一個(gè)程序時(shí)才把它換入內(nèi)存; 但并不把全部程序都換入內(nèi)存,而是用到哪一頁(yè)時(shí)才換入它。這樣,就減少了對(duì)換時(shí)間和所需內(nèi)存數(shù)量,允許增加程序的道數(shù)。
5.15 Linux系統(tǒng)中交換空間為何采用連續(xù)空間?
答:因?yàn)檫M(jìn)程使用交換空間是臨時(shí)性的,速度是關(guān)鍵性問(wèn)題,系統(tǒng)一次進(jìn)行多個(gè)盤塊I/O傳輸比每次一塊、多次傳輸?shù)乃俣纫?#xff0c;所以核心在交換設(shè)備上是分配一片連續(xù)空間,而不管碎片的問(wèn)題。
5.16 Linux為什么要采用三級(jí)頁(yè)表?該機(jī)制如何工作?
答:現(xiàn)在地址碼通常采用32位,這樣,每個(gè)進(jìn)程的虛擬存儲(chǔ)空間可達(dá)4 GB。而Linux系統(tǒng)中頁(yè)面的大小為4KB,因此進(jìn)程虛擬存儲(chǔ)空間要?jiǎng)澐譃?20(1M)個(gè)頁(yè)面。如果直接用頁(yè)表描述這種映射關(guān)系,那么每個(gè)進(jìn)程的頁(yè)表就要有220(1M)個(gè)表項(xiàng)。很顯然,用大量的內(nèi)存資源來(lái)存放頁(yè)表是不可取的。為此,Linux系統(tǒng)采用三級(jí)頁(yè)表的方式。Linux系統(tǒng)三級(jí)頁(yè)表地址映射如下圖所示。
圖中PGD表示頁(yè)面目錄,PMD表示中間目錄,PT表示頁(yè)表。一個(gè)線性虛擬地址在邏輯上劃分成4個(gè)位段,從高位到低位分別用做檢索頁(yè)面目錄PGD的下標(biāo)、中間目錄PMD的下標(biāo)、頁(yè)表PT的下標(biāo)和物理頁(yè)面(即內(nèi)存塊)內(nèi)的位移。把一個(gè)線性地址映射成物理地址分為以下4步:
① 以線性地址中最高位段作為下標(biāo),在PGD中找到相應(yīng)的表項(xiàng),該表項(xiàng)指向相應(yīng)的PMD。
② 以線性地址中第2個(gè)位段作為下標(biāo),在PMD中找到相應(yīng)的表項(xiàng),該表項(xiàng)指向相應(yīng)的PT。
③ 以線性地址中第3個(gè)位段作為下標(biāo),在PT中找到相應(yīng)的表項(xiàng),該表項(xiàng)指向相應(yīng)的物理頁(yè)面(即該物理頁(yè)面的起始地址)。
④ 線性地址中的最低位段是物理頁(yè)面內(nèi)的相對(duì)位移量,此位移量與該物理頁(yè)面的起始地址相加就得到相應(yīng)的物理地址。
5.17 Linux信號(hào)機(jī)制是如何實(shí)現(xiàn)進(jìn)程通信的?
答:信號(hào)機(jī)制是在軟件層次上對(duì)中斷機(jī)制的一種模擬。異步進(jìn)程可以通過(guò)彼此發(fā)送信號(hào)來(lái)實(shí)現(xiàn)簡(jiǎn)單通信。系統(tǒng)預(yù)先規(guī)定若干個(gè)不同類型的信號(hào),各表示發(fā)生了不同的事件,每個(gè)信號(hào)對(duì)應(yīng)一個(gè)編號(hào)。運(yùn)行進(jìn)程當(dāng)遇到相應(yīng)事件或者出現(xiàn)特定要求時(shí),就把一個(gè)信號(hào)寫到相應(yīng)進(jìn)程task_struct結(jié)構(gòu)的signal位圖中。接收信號(hào)的進(jìn)程在運(yùn)行過(guò)程中要檢測(cè)自身是否收到了信號(hào),如果已收到信號(hào),則轉(zhuǎn)去執(zhí)行預(yù)先規(guī)定好的信號(hào)處理程序。處理之后,再返回原先正在執(zhí)行的程序。
5.18 管道文件如何實(shí)現(xiàn)兩個(gè)進(jìn)程間的通信?
答:管道文件是連接兩個(gè)命令的一個(gè)打開文件。一個(gè)命令向該文件中寫入數(shù)據(jù),稱作寫者;另一個(gè)命令從該文件中讀出數(shù)據(jù),稱作讀者。系統(tǒng)自動(dòng)處理二者之間的同步、調(diào)度和緩沖。利用管道文件可以實(shí)現(xiàn)兩個(gè)或多個(gè)進(jìn)程間的直接通信。
5.19 Linux系統(tǒng)中設(shè)備驅(qū)動(dòng)分層結(jié)構(gòu)是怎樣的?如何實(shí)現(xiàn)與設(shè)備的無(wú)關(guān)性?
答:設(shè)備驅(qū)動(dòng)的分層結(jié)構(gòu)自頂向下依次為:應(yīng)用層、文件系統(tǒng)層、設(shè)備驅(qū)動(dòng)層、物理設(shè)備層。
Linux系統(tǒng)采用設(shè)備文件統(tǒng)一管理硬件設(shè)備,從而將硬件設(shè)備的特性及管理細(xì)節(jié)對(duì)用戶隱藏起來(lái),實(shí)現(xiàn)用戶程序與設(shè)備無(wú)關(guān)性。
5.20 Linux系統(tǒng)中可安裝模塊的思想是什么?
答:可安裝模塊是可以在系統(tǒng)運(yùn)行時(shí)動(dòng)態(tài)地安裝和拆卸的內(nèi)核模塊。利用這個(gè)機(jī)制,可以根據(jù)需要在不必對(duì)內(nèi)核重新編譯連接的條件下,將可安裝模塊動(dòng)態(tài)插入運(yùn)行中的內(nèi)核,成為其中一個(gè)有機(jī)組成部分; 或者從內(nèi)核卸載已安裝的模塊。設(shè)備驅(qū)動(dòng)程序或者與設(shè)備驅(qū)動(dòng)緊密相關(guān)的部分(如文件系統(tǒng)) 都是利用可安裝模塊實(shí)現(xiàn)的。
5.21 什么是中斷?中斷的一般處理過(guò)程是什么?
答:所謂中斷是指CPU對(duì)系統(tǒng)發(fā)生的某個(gè)事件作出的一種反應(yīng)——CPU暫停正在執(zhí)行的程序,保留現(xiàn)場(chǎng)后自動(dòng)地執(zhí)行相應(yīng)的處理程序,處理完該事件后,如被中斷進(jìn)程的優(yōu)先級(jí)最高,則返回?cái)帱c(diǎn)繼續(xù)執(zhí)行被“打斷”的程序。
中斷的一般處理過(guò)程:保存被中斷程序的現(xiàn)場(chǎng),分析中斷原因,轉(zhuǎn)入相應(yīng)處理程序進(jìn)行處理,恢復(fù)被中斷程序現(xiàn)場(chǎng)(即中斷返回)。
5.22 Linux系統(tǒng)怎樣處理系統(tǒng)調(diào)用?
答:Linux的系統(tǒng)調(diào)用是通過(guò)中斷指令I(lǐng)NT 0x80實(shí)現(xiàn)的。當(dāng)CPU執(zhí)行到中斷指令I(lǐng)NT 0x80時(shí),硬件就作出一系列響應(yīng),其動(dòng)作與中斷響應(yīng)相同。CPU穿過(guò)陷阱門,從用戶空間進(jìn)入系統(tǒng)空間。相應(yīng)地,進(jìn)程的上下文從用戶堆棧切換到系統(tǒng)堆棧。接著運(yùn)行內(nèi)核函數(shù)system_call()。首先,進(jìn)一步保存各寄存器的內(nèi)容;接著調(diào)用syscall_trace(),以系統(tǒng)調(diào)用號(hào)為下標(biāo)檢索系統(tǒng)調(diào)用入口表sys_call_table,從中找到相應(yīng)的函數(shù); 然后,轉(zhuǎn)去執(zhí)行該函數(shù),完成具體的服務(wù)。執(zhí)行完服務(wù)程序,核心檢查是否發(fā)生錯(cuò)誤,并作相應(yīng)處理。如果本進(jìn)程收到信號(hào),則對(duì)信號(hào)作相應(yīng)處理。最后進(jìn)程從系統(tǒng)空間返回到用戶空間。
思考題6
6.1 gcc編譯過(guò)程一般分為哪幾個(gè)階段?各階段的主要工作是什么?
答:gcc編譯過(guò)程可以分為4個(gè)階段,包括預(yù)處理(Preprocessing)、編譯(Compiling)、匯編(Assembling)和連接(Linking)。
●預(yù)處理程序讀取C語(yǔ)言源文件,對(duì)其中以“#”開頭的指令(偽指令)和特殊符號(hào)進(jìn)行處理。
●編譯程序?qū)︻A(yù)處理之后的輸出文件進(jìn)行詞法分析和語(yǔ)法分析,試圖找出所有不符合語(yǔ)法規(guī)則的部分,并根據(jù)問(wèn)題的大小做出不同處理。在確定各成分都符合語(yǔ)法規(guī)則后,將其“翻譯”為功能等價(jià)的中間代碼表示或者匯編代碼。
●匯編程序把匯編語(yǔ)言代碼翻譯成目標(biāo)機(jī)器代碼。
●連接程序要解決外部符號(hào)訪問(wèn)地址問(wèn)題,也就是將一個(gè)文件中引用的符號(hào)(如變量或函數(shù)調(diào)用)與該符號(hào)在另外一個(gè)文件中的定義連接起來(lái),從而使有關(guān)的目標(biāo)文件連成一個(gè)整體,最終成為可被操作系統(tǒng)執(zhí)行的可執(zhí)行文件。
6.2 對(duì)C語(yǔ)言程序進(jìn)行編譯時(shí),針對(duì)以下情況應(yīng)使用的編譯命令行是什么?
(1)只生成目標(biāo)文件,不進(jìn)行連接。
(2)在預(yù)處理后的輸出中保留源文件中的注釋。
(3)將輸出寫到file指定的文件中。
(4)指示編譯程序在目標(biāo)代碼中加入供調(diào)試程序gdb使用的附加信息。
(5)連接時(shí)搜索由library命名的庫(kù)。
答:(1) 只生成目標(biāo)文件,不進(jìn)行連接:gcc -c 源文件名
(2) 在預(yù)處理后的輸出中保留源文件中的注釋: gcc -C 源文件名
(3) 將輸出寫到file指定的文件中: gcc -o file源文件名
(4) 指示編譯程序在目標(biāo)代碼中加入供調(diào)試程序gdb使用的附加信息:
gcc -g 源文件名
(5) 連接時(shí)搜索由library命名的庫(kù):gcc -llibrary源文件名
6.3 通常,程序中的錯(cuò)誤按性質(zhì)分為哪三種?
答:程序中的錯(cuò)誤按其性質(zhì)可分為以下三種:(1) 編譯錯(cuò)誤,即語(yǔ)法錯(cuò)誤。(2) 運(yùn)行錯(cuò)誤。(3) 邏輯錯(cuò)誤。
6.4 gdb主要幫助用戶在調(diào)試程序時(shí)完成哪些工作?
答:gdb主要幫助用戶在調(diào)試程序時(shí)完成四方面的工作:
(1) 啟動(dòng)程序,可以按用戶要求影響程序的運(yùn)行行為。
(2) 使運(yùn)行程序在指定條件處停止。
(3) 當(dāng)程序停止時(shí),檢查它出現(xiàn)了什么問(wèn)題。
(4) 動(dòng)態(tài)改變程序的執(zhí)行環(huán)境,這樣就可以糾正一個(gè)錯(cuò)誤的影響,然后再糾正其他錯(cuò)誤。
6.5 調(diào)試下面的程序:
/badprog.c錯(cuò)誤地訪問(wèn)內(nèi)存/
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
char *p;
}
答:這是上機(jī)操作題。先利用gcc -g badprog.c -o badprog對(duì)源文件進(jìn)行編譯;通過(guò)編譯后,運(yùn)行badprog文件,看看出現(xiàn)什么問(wèn)題;然后利用gdb工具調(diào)試該程序。參考書中6.2.6節(jié)的示例,依據(jù)調(diào)試時(shí)實(shí)際顯示的即時(shí)信息,分析可能的原因(注意數(shù)組大小!),使用相應(yīng)的命令一步步調(diào)試,直至找出問(wèn)題根源;然后予以改正,再重新編譯、運(yùn)行。
6.6 調(diào)試下面的程序:
/callstk.c有3個(gè)函數(shù)調(diào)用深度的調(diào)用鏈/
#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();
}
int make_key(void)
{
int ret=get_key_num();
}
int get_key_num(void)
{
int ret=number();
}
int number(void)
{
return 10;
}
答:這是上機(jī)操作題。體會(huì)函數(shù)調(diào)用的層次關(guān)系。
6.7 GNU make的工作過(guò)程是怎樣的?
答:GNU make的工作過(guò)程是:
① 依次讀入各makefile文件;
② 初始化文件中的變量;
③ 推導(dǎo)隱式規(guī)則,并分析所有規(guī)則;
④ 為所有的目標(biāo)文件創(chuàng)建依賴關(guān)系鏈;
⑤ 根據(jù)依賴關(guān)系和時(shí)間數(shù)據(jù),確定哪些目標(biāo)文件要重新生成;
⑥ 執(zhí)行相應(yīng)的生成命令。
6.8 makefile的作用是什么?其書寫規(guī)則是怎樣的?
答: makefile文件是make命令必備的一個(gè)文本形式的數(shù)據(jù)庫(kù)文件,它定義了一系列規(guī)則,記錄了文件之間的依賴關(guān)系及在此依賴關(guān)系基礎(chǔ)上所應(yīng)執(zhí)行的命令序列,即定義了一系列規(guī)則來(lái)指定哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯等。此外,還可以有變量定義、注釋等。
makefile的通用形式如下所示:
目標(biāo)文件:[相依文件…]
命令1[#注釋]
…
命令n[#注釋]
其書寫規(guī)則是:依賴行從一行的開頭開始書寫。各命令行單獨(dú)占一行,每個(gè)命令行的第一個(gè)字符必須是制表符,而不能使用8個(gè)空格;#號(hào)后的內(nèi)容為注釋。它可以位于一行的開頭;在依賴行上,目標(biāo)文件和相依文件之間要用一個(gè)或兩個(gè)冒號(hào)分開。一個(gè)目標(biāo)文件可以出現(xiàn)在多個(gè)依賴行上,此時(shí)所有的依賴行的類型必須一致(一個(gè)冒號(hào)或兩個(gè)冒號(hào))。
6.9 設(shè)某個(gè)正在開發(fā)的程序由以下內(nèi)容組成:
① 4個(gè)C語(yǔ)言源文件:a.c,b.c,c.c和d.c。設(shè)b.c和d.c都使用了defs.h中的聲明。
② 匯編語(yǔ)言源文件assmb.s被某個(gè)C語(yǔ)言源文件調(diào)用。
③ 使用了在/home/user/lib/libm.so中的一組例程。
設(shè)最后生成的可執(zhí)行文件名為prog。試編寫相應(yīng)的makefile文件。
答:先根據(jù)題意,畫出依賴關(guān)系圖,再編寫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 a.cb.o:b.c defs.h
gcc -c b.cc.o:c.c
gcc -c c.cd.o:d.c defs.h
gcc -c d.cassmb.o:assmb.s
as -o assmb.o assmb.sclean:
rm prog *.o思考題7
7.1 什么是系統(tǒng)調(diào)用?什么是庫(kù)函數(shù)?二者有何異同?
答:系統(tǒng)調(diào)用是操作系統(tǒng)內(nèi)核提供的、與用戶程序之間的接口,也就是操作系統(tǒng)提供給程序員的接口,一般位于操作系統(tǒng)核心的最高層。
庫(kù)函數(shù):由系統(tǒng)提供,用于解決共性問(wèn)題,為程序的開發(fā)和執(zhí)行提供方便的程序,本身并不屬于操作系統(tǒng)的內(nèi)核部分。
相同點(diǎn):系統(tǒng)調(diào)用和庫(kù)函數(shù)都是由程序代碼構(gòu)成,二者調(diào)用方式相同,都需要在調(diào)用時(shí)傳送參數(shù),實(shí)參的個(gè)數(shù)、出現(xiàn)的次序和實(shí)參的類型與原型說(shuō)明中形參表的設(shè)計(jì)相同。
區(qū)別:庫(kù)函數(shù)調(diào)用依賴于所運(yùn)行的用戶環(huán)境,程序調(diào)用庫(kù)函數(shù)時(shí),它運(yùn)行的目標(biāo)代碼是屬于程序的,程序處于“用戶態(tài)”執(zhí)行;而系統(tǒng)調(diào)用的使用不依賴于它運(yùn)行的用戶環(huán)境,是操作系統(tǒng)內(nèi)核提供的低層服務(wù),系統(tǒng)調(diào)用時(shí)所執(zhí)行的代碼是屬于內(nèi)核的,程序處于“核心態(tài)”執(zhí)行。庫(kù)函數(shù)的調(diào)用最終還是要通過(guò)系統(tǒng)調(diào)用來(lái)實(shí)現(xiàn),庫(kù)函數(shù)一般執(zhí)行一條指令,該指令(操作系統(tǒng)陷阱operating system trap)將進(jìn)程執(zhí)行方式變?yōu)楹诵膽B(tài),然后使內(nèi)核為系統(tǒng)調(diào)用執(zhí)行代碼。
7.2 使用系統(tǒng)調(diào)用的一般方式是什么?
答:1、標(biāo)明相應(yīng)的文件包含。不同的系統(tǒng)調(diào)用所需要的頭文件(又稱前導(dǎo)文件)是不同的。這些頭文件包含了相應(yīng)程序代碼中用到的宏定義、類型定義、全稱變量及函數(shù)說(shuō)明等。
2、在C語(yǔ)言程序中,系統(tǒng)調(diào)用的調(diào)用方式與調(diào)用庫(kù)函數(shù)相同,即調(diào)用時(shí),提供的實(shí)參的個(gè)數(shù)、出現(xiàn)的順序和實(shí)參的類型應(yīng)與原型說(shuō)明中形參表的設(shè)計(jì)相同。
7.3 編寫一個(gè)程序,把一個(gè)文件的內(nèi)容復(fù)制到另一個(gè)文件上,即實(shí)現(xiàn)簡(jiǎn)單的copy功能。要求:只用open( ),read( ),write( )和close( )系統(tǒng)調(diào)用,程序的第一個(gè)參數(shù)是源文件,第二個(gè)參數(shù)是目的文件。
答:(上機(jī)題)該程序?qū)?yīng)命令的使用格式是:命令名 源文件 目的文件
#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); //打開目的文件,不存在則創(chuàng)建
if(fd1<0||fd2<0){
fprintf(stderr, “Cannot open a file!\n”);
}
while((N=read(fd1,buf, SIZE))>0)
write(fd2,buf,N); //從源文件讀,寫入目的文件,實(shí)現(xiàn)copy功能
close(fd1);
close(fd2);
return 0;
}
7.4 編寫一個(gè)程序,它把給定的正文插入到文件的任意指定位置,并輸出最后結(jié)果。
答:(上機(jī)題)該程序?qū)?yīng)命令的使用格式是:命令名 待插入文件名
#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”);
}
truncate(“tmp.txt”,0); //清空tmp.txt
printf(“original file is:\n”); //輸出插入前的文件內(nèi)容
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) //把插入位置后的文件內(nèi)容先暫存到輔助文件
write(fdtmp,buf,n);truncate(argv[1],POS); //清除插入位置后的文件內(nèi)容
lseek(fd,POS,SEEK_SET); //將輸入的文本寫到文件指定位置
write(fd,str,strlen(str));
lseek(fdtmp,0,SEEK_SET); //將輔助文件的內(nèi)容寫回,實(shí)現(xiàn)插入功能
while((n=read(fdtmp,buf, SIZE))>0){
write(fd,buf,n);
}
printf(“After Insert:\n”); //輸出插入后的文件內(nèi)容
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 編寫一個(gè)程序,它首先打開一個(gè)文件,然后利用fork( )創(chuàng)建一個(gè)子進(jìn)程;隨后,當(dāng)父進(jìn)程運(yùn)行時(shí)先執(zhí)行wait( );父子進(jìn)程都打印自己和其父進(jìn)程的ID號(hào);并且,二者都向該文件寫入(利用write)一條信息,表明是在哪個(gè)進(jìn)程中。試問(wèn):如果沒(méi)有wait調(diào)用,會(huì)出現(xiàn)什么情況?
答:(上機(jī)題)該程序?qū)?yīng)命令的使用格式是:命令名 文件名
#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));
};
if(pid==0){ //子進(jìn)程
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){ //父進(jìn)程
wait(NULL); //等待子進(jìn)程完成
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));
}
}
利用系統(tǒng)調(diào)用wait( )可以實(shí)現(xiàn)父子進(jìn)程的同步,即:保證子進(jìn)程輸出在前,父進(jìn)程輸出在后。如果沒(méi)有wait(),則輸出結(jié)果的先后順序會(huì)有隨機(jī)性,那樣,每次運(yùn)行的結(jié)果都有可能不同。
7.6 編寫一個(gè)程序,盡可能多地輸出有關(guān)當(dāng)前進(jìn)程的信息:PID、PPID、打開文件、當(dāng)前目錄、nice值等。請(qǐng)簡(jiǎn)要說(shuō)明,如何確定哪些文件是打開的?如何確定多個(gè)文件描述符表示同一個(gè)文件?
答:(上機(jī)題)該程序?qū)?yīng)命令的使用方式是:命令名 文件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]);
}
if((file1=open(argv[1],O_CREAT|O_RDWR,S_IRWXU))<0){
perror("open argv[1] ");
}
if((file2=open(argv[2],O_CREAT|O_RDWR,S_IRWXU))<0){
perror("open argv[2] ");
}
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轉(zhuǎn)換為字符串,保存在str中
strcat(dir,str);
strcat(dir,subdir); //拼接字符串,形成如下形式的/proc/3724/fd,設(shè)3724為getpid( )返回值
chdir(dir);
printf(“The number of files to be opened :\n”);
system(“l(fā)s | wc -l”); //統(tǒng)計(jì)打開的文件數(shù)量
return 0;
}
利用getpid()獲取當(dāng)前進(jìn)程的id,假設(shè)為3724。然后進(jìn)入目錄 /proc/3724/fd ,利用命令 ls -l可以看出該進(jìn)程打開了哪些文件。系統(tǒng)為每個(gè)進(jìn)程自動(dòng)打開三個(gè)標(biāo)準(zhǔn)文件(即標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和錯(cuò)誤輸出),其文件描述符分別為0,1和2,本題給出的參考代碼中,打開了兩個(gè)文件,這樣可以更加清楚的看到進(jìn)程打開的所有文件。
如果文件描述符后面->所指向的文件名稱一致,則代表這些文件描述符對(duì)應(yīng)同一個(gè)文件。運(yùn)行本代碼時(shí),可以讓文件1和文件2這兩個(gè)參數(shù)相同,即同一個(gè)文件打開兩次,能夠看到不同的文件描述符對(duì)應(yīng)了同一個(gè)文件的情況。
另外,root用戶還可以使用lsof命令查看某進(jìn)程所打開的文件信息:# lsof –p 進(jìn)程號(hào)
7.7 編寫一個(gè)管道程序,它所創(chuàng)建的管道等價(jià)于下面的shell管道:
$ echo good morning|sed s/good/hi/g
該程序的實(shí)現(xiàn)過(guò)程是:調(diào)用pipe( )建立一個(gè)管道,利用fork( )創(chuàng)建兩個(gè)子進(jìn)程:一個(gè)是左側(cè)進(jìn)程,另一個(gè)是右側(cè)進(jìn)程。
左側(cè)進(jìn)程使用close(pipefd[0])關(guān)閉管道讀取端,使用close(1)關(guān)閉最初的標(biāo)準(zhǔn)輸出,使用dup(pipefd[1])將管道的寫入端改為文件描述符1,使用close(pipefd[1])關(guān)閉打開文件描述符的一個(gè)副本,調(diào)用execvp( )啟動(dòng)運(yùn)行的程序。
右側(cè)進(jìn)程的工作與此相似,使用close(pipefd[1])關(guān)閉管道寫入端,使用close(0)關(guān)閉最初的標(biāo)準(zhǔn)輸入,使用dup(pipefd[0])將管道的讀取端改為文件描述符0,使用close(pipefd[0])關(guān)閉打開文件描述符的一個(gè)副本,調(diào)用execvp( )啟動(dòng)運(yùn)行的程序。
在父進(jìn)程中,關(guān)閉管道的兩端:close(pipefd[0])和close(pipefd[1])。最后,在父進(jìn)程中使用wait( )等待兩個(gè)子進(jìn)程結(jié)束。
答:(上機(jī)題)
#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)){ //創(chuàng)建管道
fprintf(stderr,"%s:pipe failed:%s\n",argv[0],strerror(errno));
exit(1);
};
if((leftpid=fork())<0){ //創(chuàng)建左側(cè)子進(jìn)程
fprintf(stderr,"%s:fork of left child failed:%s\n",argv[0],strerror(errno));
exit(1);
};
if(leftpid==0){ //子進(jìn)程
close(pipefd[0]);
close(1);
dup(pipefd[1]);
close(pipefd[1]);
execvp(“echo”,arg1 ); //執(zhí)行echo good morning,結(jié)果寫入管道
}
if((rightpid=fork())<0){ //創(chuàng)建右側(cè)子進(jìn)程
fprintf(stderr,"%s:fork of right child failed:%s\n",argv[0],strerror(errno));
exit(1);
};
if(rightpid==0){ //右側(cè)子進(jìn)程
close(pipefd[1]);close(0);dup(pipefd[0]);close(pipefd[0]);execvp("sed",arg2 ); //執(zhí)行sed,完成替換}
else{
close(pipefd[0]);
}
}
7.8 調(diào)用msgget( )創(chuàng)建一個(gè)消息隊(duì)列,輸出其隊(duì)列ID。然后再次調(diào)用msgget( )打開已有的隊(duì)列。如果兩次得到的ID相同,則顯示打開隊(duì)列的ID。
答:(上機(jī)題)
#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;
}
7.9 編寫一個(gè)程序,它創(chuàng)建一個(gè)子進(jìn)程。父進(jìn)程向子進(jìn)程發(fā)送一個(gè)信號(hào),然后等待子進(jìn)程終止;子進(jìn)程接收信號(hào),輸出自己的狀態(tài)信息,最后終止自己。
答:(上機(jī)題)
#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;
else if(pid==0) {
signal(SIGUSR1,handler); //子進(jìn)程捕捉信號(hào)SIGUSR1,用handler處理pause();printf("child process exit\n");exit(0);}else{ //父進(jìn)程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給子進(jìn)程發(fā)信號(hào)SIGUSR1childpid=wait(&status); //等待子進(jìn)程完成,并返回statusprintf("\n\nprocess %d eixt,the return status is 0x%x\n",childpid,status); exit(EXIT_SUCCESS);} return 0;}
7.10 編寫一個(gè)程序,它能閱讀任意長(zhǎng)度的行,并確保它們填充正在使用的緩沖區(qū),同時(shí)要處理續(xù)行——以反斜線結(jié)束的行繼續(xù)到下一行。在緩沖區(qū)結(jié)構(gòu)中,應(yīng)記錄緩沖區(qū)的開始、當(dāng)前行的開始、下一行的開始、緩沖區(qū)分配的大小、文件描述符等信息。
答:(上機(jī)題)
#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; //緩沖區(qū)的開始
int curline; //當(dāng)前行在文件中的行號(hào)
size_t size; //緩沖區(qū)的大小
int len; //當(dāng)前行的長(zhǎng)度
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){ //從文件讀取一行,一直到文件結(jié)束
mybuf.curline=lineno;
int len=strlen(strtmp);
lineno++;
//printf(“The last char is %c\n”,strtmp[len-2]);
while(strtmp[len-2]==’\’){ //處理續(xù)行符號(hào),將帶有續(xù)行符的文本合并成一行
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(lensizeof(char)))){ //分配內(nèi)存空間
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(“l(fā)ine 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 系統(tǒng)管理員的職責(zé)主要有哪些方面?
答:一般說(shuō)來(lái),系統(tǒng)管理員的任務(wù)包括以下幾個(gè)方面:
① 設(shè)置整個(gè)計(jì)算機(jī)系統(tǒng),包括硬件和軟件,如安裝硬件設(shè)備、安裝操作系統(tǒng)和軟件包、為用戶建立賬戶等。② 做適當(dāng)?shù)膫浞?#xff08;系統(tǒng)中常規(guī)文件復(fù)制)和需要時(shí)的恢復(fù)。③ 處理由于計(jì)算機(jī)有限資源的使用(如磁盤空間、進(jìn)程數(shù)目等)而遇到的問(wèn)題。④ 排除由于連接問(wèn)題而造成的系統(tǒng)通信(網(wǎng)絡(luò))阻塞。⑤ 進(jìn)行操作系統(tǒng)的升級(jí)和維護(hù)。⑥ 為用戶提供常規(guī)支持。8.2 為了修改文件test.txt的權(quán)限保護(hù)位,使文件屬主擁有讀、寫和執(zhí)行的權(quán)限,組成員和其他用戶可以讀和執(zhí)行,應(yīng)該怎么做?
答:執(zhí)行以下命令:
chmod u=w,ugo=rx test.txt 或者
chmod u=rwx,go=rx test.txt 或者
chmod 0755 test.txt
8.3 試在系統(tǒng)中為新用戶建立賬號(hào)、密碼等。采用不同方式設(shè)置用戶密碼。
答:(上機(jī)操作)
1.使用KDE桌面系統(tǒng)為新用戶建立賬戶和密碼的步驟如下:
①點(diǎn)擊“開始”菜單,選擇“設(shè)置”→“系統(tǒng)設(shè)置”,彈出系統(tǒng)設(shè)置窗口,在“個(gè)性化”選項(xiàng)下面選擇“賬戶細(xì)節(jié)”,可打開賬戶細(xì)節(jié)管理工具。
② 在“賬戶細(xì)節(jié)”窗口中,點(diǎn)擊“密碼和用戶信息”項(xiàng)。然后,單擊“密碼和用戶信息”窗口中的“+”號(hào)按鈕,彈出“增加用戶”對(duì)話框,按要求輸入新用戶的賬號(hào)名稱、顯示名稱、密碼、確認(rèn)密碼。所有信息設(shè)置完成后點(diǎn)擊“添加”按鈕。
③由于該操作需要root權(quán)限,會(huì)彈出 “需要認(rèn)證”窗口,輸入root密碼,點(diǎn)擊“確定”按鈕,完成添加新用戶操作,新用戶將加入到用戶列表中。
8.4 如何查封一個(gè)用戶賬號(hào)?要使一個(gè)用戶賬號(hào)失效,應(yīng)該怎么做?請(qǐng)至少列舉三種方法。
答:▲當(dāng)需要查封某個(gè)賬號(hào)時(shí),可以:
①將用戶記錄從/etc/passwd文件中去掉,但是保留該用戶的主目錄和其他文件;
②在/etc/passwd(或/etc/shadow)文件中,在相關(guān)用戶記錄的passwd字段的首字符前加上符號(hào)“*”。
③管理員還可以將用戶賬號(hào)的shell設(shè)置成一個(gè)特定的只打印出一條信息的程序。
▲要使一個(gè)用戶賬號(hào)永久失效,即刪除該用戶賬號(hào)。
●在圖形界面下刪除一個(gè)用戶賬戶的步驟如下:
①點(diǎn)擊“開始”菜單,選擇“設(shè)置”→“系統(tǒng)設(shè)置”,彈出系統(tǒng)設(shè)置窗口,在“個(gè)性化”選項(xiàng)下面選擇“賬戶細(xì)節(jié)”,打開賬戶細(xì)節(jié)管理工具
② 在“密碼和用戶信息”標(biāo)簽頁(yè)中所列出的用戶清單里,選取你要?jiǎng)h除的一個(gè)用戶,該欄目被高亮度化。 ③點(diǎn)擊“ ”按鈕,彈出確認(rèn)刪除用戶界面,選擇是否同時(shí)刪除賬號(hào)及賬號(hào)所屬的文件,點(diǎn)擊“確認(rèn)”按鈕刪除用戶。
●還可以使用userdel命令刪除已經(jīng)存在的用戶賬戶。必須從/etc/passwd文件中刪除此用戶的記錄項(xiàng)、從/etc/group文件中刪除提及的此用戶,并且刪除用戶的主目錄及其他由該用戶創(chuàng)建或?qū)儆诖擞脩舻奈募serdel命令的一般使用格式是:
userdel [-r] 用戶名
如果使用選項(xiàng)-r,將把用戶主目錄及其下面的所有內(nèi)容都刪除。
8.5 如何統(tǒng)計(jì)系統(tǒng)中磁盤空間的使用情況和空閑情況?
答:可以使用du命令統(tǒng)計(jì)當(dāng)前目錄下子目錄的磁盤使用情況。
使用df命令可以統(tǒng)計(jì)文件系統(tǒng)中空閑的磁盤空間,默認(rèn)情況下顯示所有安裝文件系統(tǒng)的磁盤使用信息,即可以用來(lái)查看磁盤已被使用多少空間和還剩余多少空間。
8.6 在系統(tǒng)初啟過(guò)程中,如何讓系統(tǒng)自動(dòng)啟動(dòng)某些程序,以及設(shè)置環(huán)境變量?請(qǐng)至少列舉三種方法。
答:這涉及到用戶登錄環(huán)境的設(shè)置。可以采用的方法是:
1.編輯/etc/bashrc文件,它是腳本文件,包含系統(tǒng)定義的命令別名和bash的環(huán)境變量定義;
2.編輯/etc/profile文件,它是腳本文件,對(duì)系統(tǒng)中所有用戶都起作用;
3.編輯$HOME/bash_profile,它是腳本文件,僅對(duì)當(dāng)前用戶起作用。
8.7 讓一個(gè)用戶擁有對(duì)某個(gè)組的資源的訪問(wèn)權(quán)限,應(yīng)該怎么做?請(qǐng)至少列舉兩種方法。
答:讓一個(gè)用戶擁有對(duì)某個(gè)組的資源的訪問(wèn)權(quán)限,就要將該用戶加到該組中。可以采用的方法有:
①由超級(jí)用戶root使用useradd(或adduser)命令來(lái)完成添加用戶的工作。利用選項(xiàng)
-G group,[…] 指定新用戶的附加組。
②編輯/etc/group文件,將用戶名加到相應(yīng)組的用戶列表中。
8.8 如何手工設(shè)置磁盤限額?
答:Linux系統(tǒng)是通過(guò)quota(磁盤限額)機(jī)制來(lái)實(shí)現(xiàn)對(duì)用戶使用硬盤資源的控制。如果是首次安裝quota,則應(yīng)按下面步驟執(zhí)行;如果已經(jīng)配置好,則可以直接執(zhí)行⑥。
① 首先在配置核心時(shí),應(yīng)該將以下核心開關(guān)選項(xiàng):quota support(CONFIG_QUOTA)
設(shè)置為“Y”,使核心提供對(duì)quota機(jī)制的支持。
② 安裝與quota相關(guān)的軟件包。
③ 修改用戶的系統(tǒng)初啟腳本文件,使之能夠檢查quota,并在系統(tǒng)初啟時(shí)開啟quota功能。
④ 修改啟動(dòng)文件系統(tǒng)支持。為了在每次啟動(dòng)系統(tǒng)的時(shí)候,使文件系統(tǒng)上的quota有效,需要對(duì)/etc/fstab文件進(jìn)行相應(yīng)的修改。
⑤ 建立quota.user和quota.group文件。
⑥為特定用戶指定quota。例如,系統(tǒng)中有一個(gè)用戶user01。輸入edquota user01命令后,進(jìn)入vi(或是系統(tǒng)默認(rèn)的編輯器)編輯狀態(tài),管理員可以為用戶user01編輯各個(gè)啟用quota的分區(qū)限額。
8.9 如何使用dd命令獲得硬盤的MBR信息?
答:MBR是整個(gè)硬盤的主引導(dǎo)記錄(Main Boot Record),它存放在硬盤的第一個(gè)扇區(qū)(對(duì)應(yīng)于0號(hào)磁頭的0柱面0扇區(qū))。通常,扇區(qū)的大小為512字節(jié)。
備份磁盤開頭的MBR信息到一個(gè)指定的文件,如/root/mbr_temp:
dd if=/dev/hda of=/root/mbr_temp count=1 bs=512
然后,使用文件操作命令(如cat,wc等)查看、統(tǒng)計(jì)文件/root/mbr_temp的信息。
8.10 當(dāng)Linux系統(tǒng)的超級(jí)塊受到破壞時(shí),應(yīng)該如何修復(fù)?
答:使用fsck命令檢查并修復(fù)相應(yīng)的文件系統(tǒng)(如/dev/hda1分區(qū)上的文件系統(tǒng)):
fsck -r /dev/hda1
在修復(fù)該文件系統(tǒng)上的超級(jí)塊之前,要求管理員確認(rèn)。
8.11 請(qǐng)參照f(shuō)disk命令輸出的結(jié)果來(lái)計(jì)算所指定的硬盤容量:
Disk /dev/hda: 255 heads, 63 sectors, 2480 cylindersUnits = cylinders of 16065 * 512 bytes答:該硬盤的單位柱面容量Units=25563512=16065*512≈8225(KB)
整個(gè)硬盤有2480柱面,所以,整個(gè)硬盤容量=8225*2480≈20398(MB)≈20(GB)
8.12 分析/var/log目錄中的日志信息,根據(jù)本章的介紹,改善自己系統(tǒng)的安全狀況。
答:(上機(jī)操作題)在/var/log目錄中存放系統(tǒng)運(yùn)行時(shí)的使用情況、安全性、系統(tǒng)負(fù)載等方面的日志記錄。如:
●/var/log/wtmp文件保存所有的登錄、退出信息,以及系統(tǒng)的啟動(dòng)、停止記錄。可以利用它查看用戶的登錄記錄, last和ac等命令可使用wtmp文件的數(shù)據(jù)產(chǎn)生報(bào)告。
●/var/log/lastlog文件可以記錄系統(tǒng)中每個(gè)用戶的最后一次登錄時(shí)間。當(dāng)用戶登錄時(shí),屏幕上顯示的時(shí)間就是從lastlog文件中獲得的。而且,finger命令報(bào)告的登錄時(shí)間也是從這個(gè)文件中取得的。系統(tǒng)管理員應(yīng)該告訴每個(gè)用戶仔細(xì)檢查上次登錄的時(shí)間,并報(bào)告非正常的登錄時(shí)間。因?yàn)槿藗兺ǔ6紩?huì)記得他上次登錄的時(shí)間,所以,通過(guò)這種方法很容易發(fā)現(xiàn)賬號(hào)是否被破解。
●可以在/var/log目錄下找到messages,mail.log等日志文件。/var/log/messages文件記錄了命令的執(zhí)行信息,包括日期、時(shí)間、產(chǎn)生這些消息的進(jìn)程和進(jìn)程的PID。messages文件中的有關(guān)記錄可以提醒系統(tǒng)管理員,有人試圖猜密碼。
8.13 使用hdparm工具優(yōu)化系統(tǒng)硬盤的性能。
答:(上機(jī)操作題)hdparm命令用于讀取和設(shè)置IDE或SCSI硬盤參數(shù)。如:-m選項(xiàng)可查詢并設(shè)置硬盤多重扇區(qū)存取的扇區(qū)數(shù),以增進(jìn)硬盤的存取效率。
8.14 參照man,解釋kill -SIGHUP所表示的意義。
答:(上機(jī)題)執(zhí)行命令:man kill,了解kill命令的功能、用法及信號(hào)SIGHUP的含義。該命令讓Linux和緩的執(zhí)行進(jìn)程關(guān)閉,然后立即重啟。在配置應(yīng)用程序的時(shí)候,這個(gè)命令很方便,在對(duì)配置文件修改后需要重啟進(jìn)程時(shí)就可以執(zhí)行此命令。
思考題9
9.1 簡(jiǎn)述在圖形方式下配置網(wǎng)卡的主要過(guò)程。
答:①?gòu)南到y(tǒng)主菜單中選擇“程序”→“設(shè)置”→“系統(tǒng)設(shè)置”,雙擊“網(wǎng)絡(luò)設(shè)置”圖標(biāo),自動(dòng)啟動(dòng)“連接編輯器”。
②在連接編輯器對(duì)話框中,點(diǎn)擊“添加”按鈕,選擇對(duì)應(yīng)的網(wǎng)絡(luò)類型,給出網(wǎng)絡(luò)連接名稱,在“常規(guī)配置”、“有線連接”、“802.1x安全”、“Ipv4”、“Ipv6”等標(biāo)簽頁(yè)設(shè)置新連接的相關(guān)信息。
③上述參數(shù)配置好后,單擊“確定”按鈕,可使網(wǎng)絡(luò)參數(shù)設(shè)置生效。
9.2 簡(jiǎn)述ping,telnet和ftp命令的功能。
答:ping命令是一種最基本的測(cè)試命令,用它來(lái)測(cè)試本機(jī)系統(tǒng)是否能夠到達(dá)一臺(tái)遠(yuǎn)程主機(jī),以及到達(dá)的速率。該命令常用來(lái)測(cè)試本機(jī)與遠(yuǎn)程主機(jī)的通信路徑是否暢通。根據(jù)ping命令運(yùn)行的結(jié)果,可以確定接下來(lái)是測(cè)試網(wǎng)絡(luò)連通還是測(cè)試應(yīng)用程序。
telnet命令用于登錄并管理遠(yuǎn)程主機(jī)。它采用明文傳送報(bào)文,安全性不好,很多Linux服務(wù)器都不開放telnet服務(wù),而改用更安全的ssh方式了。它還可以確定遠(yuǎn)程服務(wù)的狀態(tài),如確定遠(yuǎn)程服務(wù)器的某個(gè)端口是否能訪問(wèn)等。
Linux ftp命令的功能是用命令的方式來(lái)控制在本地機(jī)和遠(yuǎn)程機(jī)之間傳送文件。使用ftp提供的很多相關(guān)命令,可以從遠(yuǎn)程機(jī)器上下載文件,或者將文件傳輸?shù)竭h(yuǎn)程機(jī)器上,等等。
9.3 電子郵件系統(tǒng)由哪幾部分組成?它們的功能是什么?
答:電子郵件系統(tǒng)由郵件用戶代理MUA和郵件傳送代理MTA兩部分組成。
MUA是一個(gè)在本地運(yùn)行的程序,它使用戶能通過(guò)一個(gè)友好界面來(lái)發(fā)送和接收郵件。允許用戶書寫、編輯、閱讀、保存、刪除、打印、回復(fù)和轉(zhuǎn)發(fā)郵件,同時(shí)還提供創(chuàng)建、維護(hù)和使用通訊錄,提取對(duì)方地址,信件自動(dòng)回復(fù),以及建立目錄對(duì)來(lái)信進(jìn)行分類保存等功能。
MTA在后臺(tái)運(yùn)行,它將郵件通過(guò)網(wǎng)絡(luò)發(fā)送給對(duì)方主機(jī),并從網(wǎng)絡(luò)接收郵件,它有兩個(gè)功能:
① 發(fā)送和接收用戶的郵件。
② 向發(fā)信人報(bào)告郵件傳送的情況(已交付、被拒絕、丟失等)。
9.4 什么是POP3協(xié)議?
答:TCP/IP專門設(shè)計(jì)了一個(gè)對(duì)電子郵件信箱進(jìn)行遠(yuǎn)程存取的協(xié)議,它允許用戶的郵箱安置在某個(gè)郵件服務(wù)器上,并允許用戶從他的個(gè)人計(jì)算機(jī)中對(duì)郵箱內(nèi)容進(jìn)行存取。這個(gè)協(xié)議就是POP(Post Office Protocol,郵局協(xié)議)。POP最初公布于1984年。現(xiàn)在普遍采用的是它的第三個(gè)版本,即POP3,它在1993年成為Internet標(biāo)準(zhǔn)。
9.5 簡(jiǎn)述NFS的基本工作原理。
答:NFS是一種基于TCP/IP的,專門負(fù)責(zé)文件操作的應(yīng)用層軟件,它建立在XDR和RPC機(jī)制上。通過(guò)這些機(jī)制,NFS就可以屏蔽主機(jī)和網(wǎng)絡(luò)特性,為用戶提供完全透明的文件訪問(wèn)功能。NFS采取客戶-服務(wù)器結(jié)構(gòu),客戶是訪問(wèn)遠(yuǎn)程文件系統(tǒng)的主機(jī),此時(shí)遠(yuǎn)程文件系統(tǒng)就像本地文件系統(tǒng)的一部分;服務(wù)器是提供本地資源(目錄或文件)能夠被遠(yuǎn)程主機(jī)安裝并訪問(wèn)的主機(jī)。客戶與服務(wù)器之間通過(guò)RPC機(jī)制進(jìn)行通信。
NFS是通過(guò)將NFS服務(wù)器的文件系統(tǒng)安裝到客戶機(jī)的文件系統(tǒng)上而得以實(shí)現(xiàn)的。NFS協(xié)議只負(fù)責(zé)文件的傳送工作,而不負(fù)責(zé)連接文件系統(tǒng)。NFS服務(wù)器可以導(dǎo)出一個(gè)或多個(gè)文件系統(tǒng),供客戶安裝。被導(dǎo)出的文件系統(tǒng)可以是整個(gè)磁盤分區(qū),或是一個(gè)子樹。可以通過(guò)配置NFS服務(wù)器來(lái)指定允許訪問(wèn)導(dǎo)出文件系統(tǒng)的客戶及訪問(wèn)權(quán)限。NFS允許客戶把一個(gè)遠(yuǎn)程文件系統(tǒng)安裝在自己文件系統(tǒng)的多個(gè)位置上。
9.6 如何配置NFS服務(wù)器?
答:①手動(dòng)方式:用文本編輯器(如vi)修改配置文件/etc/exports。/etc/exports文件的格式如下:
directory_to_export NFS_client(permissions) [NFS_client(permissions)…]
其中,directory_to_export是要導(dǎo)出的文件系統(tǒng)或目錄的絕對(duì)路徑名;NFS_client是允許訪問(wèn)該文件系統(tǒng)或目錄的客戶機(jī)名稱;permissions是該客戶機(jī)對(duì)此目錄的訪問(wèn)權(quán)限,可選值為ro(只讀)和rw(讀、寫)。
然后,在命令提示符“# ”下執(zhí)行exportfs命令,使上述配置文件生效:
exportfs -a
②圖形界面:可以使用圖形界面下的netconf配置工具,在“服務(wù)器端任務(wù)”頁(yè)面中選擇“網(wǎng)絡(luò)文件系統(tǒng)(NFS)”進(jìn)行配置。
9.7 網(wǎng)絡(luò)管理系統(tǒng)主要有哪些功能?
答:網(wǎng)絡(luò)管理系統(tǒng)應(yīng)具備下述主要功能:
① 配置管理。定義、識(shí)別、初始化、監(jiān)控網(wǎng)絡(luò)中的被管對(duì)象,改變被管對(duì)象的操作特性,報(bào)告被管對(duì)象的狀態(tài)。
② 故障管理。指與故障設(shè)備的監(jiān)測(cè)、恢復(fù)或故障排除等措施有關(guān)的網(wǎng)絡(luò)管理功能,其目的是保證網(wǎng)絡(luò)能夠提供可靠的服務(wù)。
③ 性能管理。以提高網(wǎng)絡(luò)性能為原則,保證在使用最少網(wǎng)絡(luò)資源和具有最小延時(shí)的前提下,網(wǎng)絡(luò)能提供可行、連續(xù)的通信能力。
④ 安全管理。保證網(wǎng)絡(luò)不被非法使用。
⑤ 計(jì)費(fèi)管理。記錄用戶使用網(wǎng)絡(luò)資源的情況,并收取相應(yīng)的費(fèi)用,同時(shí)統(tǒng)計(jì)網(wǎng)絡(luò)利用率。一般來(lái)說(shuō),前兩個(gè)功能是必須的。
9.8 網(wǎng)絡(luò)安全威脅主要來(lái)自哪些方面?ISO安全模型包括哪些安全機(jī)制?
答:網(wǎng)絡(luò)安全威脅主要來(lái)自下述方面:① 仿冒用戶身份。② 信息流監(jiān)視。③ 篡改網(wǎng)絡(luò)信息。④ 否認(rèn)發(fā)出的信息。⑤ 授權(quán)威脅。⑥ 活動(dòng)天窗(Trapdoor)。⑦ 拒絕服務(wù)。⑧ 非法使用。⑨ 信息泄露。⑩ 物理入侵。 完整性侵犯。 特洛伊木馬。 重發(fā)信息。此外,一個(gè)實(shí)際的網(wǎng)絡(luò)中往往存在一些安全缺陷,如路由器配置錯(cuò)誤、存在匿名FTP、Telnet開放、密碼文件/etc/password缺乏安全保護(hù)等。
ISO安全模型包括的安全機(jī)制有:身份鑒別,訪問(wèn)控制,數(shù)據(jù)加密,數(shù)據(jù)完整性,數(shù)字簽名,防重發(fā)和審計(jì)機(jī)制等。
9.9 Linux系統(tǒng)的安全設(shè)定包括哪些方面?
答:對(duì)Linux系統(tǒng)的安全設(shè)定包括取消不必要的服務(wù)、限制遠(yuǎn)程存取、隱藏重要資料、修補(bǔ)安全漏洞、采用安全工具及經(jīng)常性的安全檢查等。
9.10 什么是計(jì)算機(jī)病毒?它有何特征?對(duì)付病毒的常用方法有哪些?
答:計(jì)算機(jī)病毒是人為非法制造的帶破壞性的一個(gè)程序片段,它能攻擊合法的程序,使之受到感染。它可以隱藏在可執(zhí)行程序或數(shù)據(jù)文件中。當(dāng)帶毒程序運(yùn)行時(shí),它們通過(guò)非授權(quán)方式入侵計(jì)算機(jī)系統(tǒng),依靠自身的強(qiáng)再生機(jī)制不斷進(jìn)行病毒體的擴(kuò)散。
計(jì)算機(jī)病毒主要有五個(gè)特征:① 病毒程序是人為編制的軟件,具有短小精悍的突出特點(diǎn)。② 病毒可以隱藏在可執(zhí)行程序或數(shù)據(jù)文件中。③ 可傳播性,具有強(qiáng)再生機(jī)制。④ 可潛伏性,具有依附于其他媒體寄生的能力。⑤ 病毒可在一定條件下被激活,從而對(duì)系統(tǒng)造成危害。
對(duì)付病毒的六條措施:① 購(gòu)買、安裝正版軟件。② 不要隨意打開未知用戶發(fā)來(lái)的郵件。③ 安裝殺毒軟件,定期或不定期地運(yùn)行殺毒工具,并及時(shí)升級(jí)殺毒軟件版本。④ 及時(shí)下載操作系統(tǒng)的補(bǔ)丁軟件包。⑤ 系統(tǒng)重新安裝之前,最好將整個(gè)硬盤重新格式化,包括重新格式化引導(dǎo)區(qū)。⑥ 為文件和目錄設(shè)置最低權(quán)限。9.11 什么是防火墻?它如何發(fā)揮作用?主要類型是什么?
答:防火墻是一類安全防范措施的統(tǒng)稱,是計(jì)算機(jī)網(wǎng)絡(luò)系統(tǒng)總體安全策略的重要組成部分。防火墻通過(guò)特定的硬件和軟件系統(tǒng)在兩個(gè)網(wǎng)絡(luò)之間實(shí)現(xiàn)訪問(wèn)控制策略,用來(lái)保護(hù)內(nèi)部的網(wǎng)絡(luò)不易受到來(lái)自Internet的侵害。
防火墻系統(tǒng)決定了哪些內(nèi)部服務(wù)可以被外界訪問(wèn),哪些外界人員可以訪問(wèn)內(nèi)部的哪些服務(wù),以及哪些外部服務(wù)可以被內(nèi)部人員訪問(wèn)。這樣,所有來(lái)往Internet的信息都必須經(jīng)過(guò)防火墻,并且接受它的檢查。由于Internet來(lái)客要訪問(wèn)內(nèi)部網(wǎng)路,必須先透過(guò)防火墻,從而對(duì)來(lái)自Internet的攻擊有較好的免疫作用。
目前,防火墻有多種類型,但大致可以分為兩類: 一類基于包過(guò)濾(Packet filter)技術(shù),另一類基于代理服務(wù)(Proxy Service)技術(shù)。
————————————————
版權(quán)聲明:本文為CSDN博主「tony_bfx」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_42023723/article/details/106757165
總結(jié)
總結(jié)
以上是生活随笔為你收集整理的Linux教程(第5版) 孟庆尝 牛欣源 张志华 -课后习题答案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: c语言单片机随机数,C语言随机数
- 下一篇: dlib linux 编译使用,ubun