Linux教程(第5版)孟庆昌版 课后答案
最近在復(fù)習(xí)Linux,用的教材是《Linux教程(第5版)孟慶昌版》,但每章的課后復(fù)習(xí)題答案沒給,不太方便,我整理了一下
?
思考題1
1.1? 什么是軟件?軟件分為哪幾種?
答:軟件是相對硬件而言的,它是與數(shù)據(jù)處理系統(tǒng)操作有關(guān)的計(jì)算機(jī)程序和相關(guān)數(shù)據(jù)等的總稱。
軟件通??煞譃槿箢?#xff0c;即系統(tǒng)軟件、應(yīng)用軟件和支撐軟件。
1.2? 根據(jù)你的理解,簡述操作系統(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)的主要功能包括存儲管理、進(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),多個用戶可以同時上機(jī)使用計(jì)算機(jī)系統(tǒng);②系統(tǒng)中某些資源可以共享;③系統(tǒng)中各用戶可以彼此獨(dú)立的操作,互不干擾;④系統(tǒng)中的用戶可以交換信息。
不同點(diǎn):①分布性:獨(dú)立運(yùn)行的多用戶系統(tǒng)是多個用戶同時在一臺主機(jī)上運(yùn)行多道程序,而單用戶機(jī)器組成的計(jì)算機(jī)網(wǎng)絡(luò)是通過通信線路將地理上分散的多臺計(jì)算機(jī)連接在一起;②自治性:前者中所有用戶共享同一CPU、內(nèi)存、盤空間等資源,有統(tǒng)一任務(wù)調(diào)度,而后者共享不同計(jì)算機(jī)上的資源,松散耦合,不具備整個系統(tǒng)統(tǒng)一任務(wù)調(diào)度;③體系結(jié)構(gòu):前者是單機(jī)系統(tǒng),后者是多機(jī)系統(tǒng);④通信方式:前者中進(jìn)程通過共享內(nèi)存、消息傳遞等進(jìn)行通信,后者通過網(wǎng)絡(luò)互聯(lián)協(xié)議實(shí)現(xiàn)數(shù)據(jù)通信和資源共享目的;⑤容錯性:前者中某一部件出現(xiàn)故障將影響整個系統(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版中,哪一個版本是穩(wěn)定的?
答:核心版本主要是Linux的內(nèi)核,由Linus等人在不斷地開發(fā)和推出新的內(nèi)核。Linux內(nèi)核的官方版本由Linus Torvalds本人維護(hù)著。發(fā)行版本是各個公司推出的版本,它們與核心版本是各自獨(dú)立發(fā)展的。發(fā)行版本通常內(nèi)附有一個核心源碼,以及很多針對不同硬件設(shè)備的核心映像。所以發(fā)行版本是一些基于Linux核心的軟件包。
核心版本的序號由三部分?jǐn)?shù)字構(gòu)成:major.minor.patchlevel。Linux 2.1.1版的次版本號為奇數(shù),不一定很穩(wěn)定,相當(dāng)于測試版;而Linux 2.2.1版的次版本號為偶數(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的主要安裝過程是什么?
答:將安裝光盤放入光驅(qū)中,系統(tǒng)將被自動引導(dǎo)。主要安裝過程是:語言選擇,許可協(xié)議,選擇安裝模式,磁盤分區(qū),檢查安裝選項(xiàng),安裝系統(tǒng),初始化設(shè)置。
1.10? 什么是硬盤分區(qū)?一塊硬盤上可以有幾種類型的分區(qū)?各自可以有多少個?在它們上面能否安裝Linux系統(tǒng)?
答:硬盤分區(qū)是對硬盤的一種格式化,格式化后才能使用硬盤保存各種信息。在創(chuàng)建分區(qū)時,就設(shè)置好硬盤的各項(xiàng)物理參數(shù),指定硬盤主引導(dǎo)記錄和引導(dǎo)記錄備份的存放位置。另外,分區(qū)時必須把硬盤的主分區(qū)設(shè)定為活動分區(qū),這樣才能夠通過硬盤啟動系統(tǒng)。?
硬盤上的分區(qū)有三種類型: 主分區(qū)、擴(kuò)展分區(qū)和邏輯分區(qū)。
一個硬盤最多只能有4個主分區(qū);擴(kuò)展分區(qū)可以有1個;擴(kuò)展分區(qū)中可以劃分出多個邏輯分區(qū)(事實(shí)上只能建立20多個)。
Linux既可以安裝在主分區(qū)上,也可以安裝在邏輯分區(qū)上,但在擴(kuò)展分區(qū)上不能直接安裝。
1.11? 多啟動系統(tǒng)與虛擬機(jī)系統(tǒng)有何異同?利用VMWare安裝Linux的基本步驟是什么?
答:多啟動系統(tǒng):一臺機(jī)器上同時存在多個操作系統(tǒng),每個操作系統(tǒng)單獨(dú)占用硬盤的一個分區(qū),每一時刻只能運(yùn)行一個系統(tǒng),在系統(tǒng)切換時需要重新啟動機(jī)器。
虛擬機(jī)系統(tǒng):在一臺機(jī)器上安裝多個操作系統(tǒng),它們在主系統(tǒng)(如Windows)的平臺上同時運(yùn)行,就像標(biāo)準(zhǔn)Windows應(yīng)用程序那樣切換,而且每個操作系統(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)包括兩個部分: 客戶-服務(wù)器模型和X協(xié)議。
1.13? 系統(tǒng)設(shè)置的主要功能是什么?訪問它的方法是怎樣的?
答:系統(tǒng)設(shè)置是普華Linux V4.0提供的一個集成的圖形化配置環(huán)境。在系統(tǒng)設(shè)置中,幾乎能找到所有的系統(tǒng)配置和管理工具。它可以方便有效地進(jìn)行如下幾類操作:
訪問系統(tǒng)設(shè)置,可在系統(tǒng)主菜單中選擇“程序”→“設(shè)置”→“系統(tǒng)設(shè)置”。
1.14? KDE桌面環(huán)境由哪幾部分組成?
答:KDE桌面環(huán)境由面板和桌面兩部分組成。
1) 面板。屏幕底部是面板,也稱K面板。可以從這里啟動應(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)程序或打開文件,也可以拖動它們,改變其位置,或者添加/刪除桌面圖標(biāo)。
1.15? 試配置所用的顯示器。
???????? 答:(上機(jī)題)配置所用的顯示器的基本步驟是:單擊屏幕左下角的“開始”按鈕,選擇“程序”→“設(shè)置”→“系統(tǒng)設(shè)置”,彈出“系統(tǒng)設(shè)置”窗口,雙擊“硬件”欄中的“顯示和監(jiān)控”。然后在打開的顯示配置界面上,在“分辨率”欄中用滑動條設(shè)置屏幕分辨率,像素范圍從640×480到1920×1080。通??蛇x擇1024×768;“方向”選擇“普通”即可。在“刷新率”下拉列表中設(shè)定顯示器的刷新頻率,通常選擇“自動”即可。配置完成后單擊“應(yīng)用”按鈕。
思考題2
2.1? 簡述Linux命令的一般格式。
答:Linux命令的一般格式是: 命令名[選項(xiàng)][參數(shù)]…
2.2? 請說明下述命令的功能:date,cd,cp,pwd,rm,mkdir,echo,who,ls,cat,more,man。
答:date命令用于在屏幕上顯示或設(shè)置系統(tǒng)的日期和時間。
?????? cd命令改變工作目錄。
cp命令將源文件或目錄復(fù)制到目標(biāo)文件或目錄中。
pwd命令顯示出當(dāng)前目錄的路徑。
rm命令可以刪除文件或目錄。
mkdir命令用來創(chuàng)建目錄。
echo命令可以將命令行中的參數(shù)顯示到標(biāo)準(zhǔn)輸出(即屏幕)上。
who命令將列出所有正在使用系統(tǒng)的用戶、所用終端名和注冊到系統(tǒng)的時間。
ls命令列出指定目錄的內(nèi)容。
cat命令連接文件并打印到標(biāo)準(zhǔn)輸出設(shè)備上。cat經(jīng)常用來顯示文件的內(nèi)容。
more命令顯示文件內(nèi)容,每次顯示一屏。
man命令格式化并顯示某一命令的聯(lián)機(jī)幫助手冊頁。
2.3? 公元2049年的元旦是星期幾?
答:運(yùn)行命令:cal? 1? 2049? 或? cal? Jan? 2049??
從顯示結(jié)果可知,2049年的元旦是星期五。
2.4? 什么是文件?Linux下主要有哪些不同種類的文件?
答:文件(File)是被命名的相關(guān)信息的集合體。它通常存放在外存(如磁盤、光盤)上,可以作為一個獨(dú)立單位存放和實(shí)施相應(yīng)的操作(如打開、關(guān)閉、讀、寫等)。
Linux系統(tǒng)中主要有以下類型的文件: 普通文件、目錄文件、特別文件以及符號鏈接文件。
2.5? 確定當(dāng)前工作目錄是什么?把工作目錄改到父目錄上,然后用長格式列出其中所有的內(nèi)容。
答:(上機(jī)做)執(zhí)行命令:pwd? 在屏幕上顯示出當(dāng)前工作目錄的絕對路徑名。
然后依次執(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? 說出下列每一項(xiàng)信息各對應(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)目錄文件,其中包含用戶可共享的庫文件? (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命令可以對指定文件或目錄重新命名。
2.9? 請給出下列命令執(zhí)行的結(jié)果:
??? (1)cd? ??????????????????? (2)cd? ..? ??? (3)cd? .. / ..?? ????? (4)cd? /
答:(1) cd????? 將當(dāng)前目錄改到用戶主目錄。
? ??(2) cd? ..??? 將當(dāng)前目錄向上移一級(即父目錄)。
(3) cd? .. / ..??? 將當(dāng)前目錄向上移動兩級。
(4) cd? /?????? 將當(dāng)前目錄改到根目錄。
2.10? cp,copy和mv 命令有何異同?
答:cp命令復(fù)制一個文件,而原文件保持不變,這樣文件個數(shù)就增加了;mv命令將文件從一個目錄移到另一個目錄中,該文件就從原目錄中消失,文件個數(shù)不變。
不能直接用copy作為復(fù)制文件的命令。因?yàn)長inux系統(tǒng)提供的眾多命令都是有一定規(guī)則和限制的,cp是copy的縮寫,是Linux默認(rèn)的復(fù)制文件的命令,而copy并不是Linux的合法命令。
2.11? 用什么命令能把兩個文件合并成一個文件?
答:使用cat命令,例如:cat?? file1? file2 >file3??? 將文件file1和file2合并后放入file3中。
2.12? 如何確定系統(tǒng)中是否有ps命令?如果有,它的功能是什么?
答:可以使用man? ps? 命令。如果系統(tǒng)中有ps命令,將顯示ps命令的聯(lián)機(jī)幫助手冊頁,列出有關(guān)該命令的完整說明;否則,將顯示出錯信息。
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? 如何對文件ABC分別按字典順序、月份順序、算術(shù)值進(jìn)行排序?
答:按字典順序排序 sort? -d? ABC
按月份順序排序 sort? --M? ABC
按算術(shù)值排序 sort? –n? ABC
2.15? 目錄ABC下有兩個子目錄a1,b2,以及5個普通文件。如果想刪除ABC目錄,應(yīng)使用什么命令?
答:(1)最簡單,但是風(fēng)險(xiǎn)較大的方法:rm? -r? ABC
(2)如果5個普通文件分別在子目錄a1和b2之下,則可以使用以下命令:
?cd? ABC/a1
?? rm?? *
?? cd? ../b2
?? rm? *
?? cd? ../..
?? rmdir? -p? ABC
(3)如果5個普通文件并未全在兩個子目錄之下,則可以使用以下命令:
?? cd?? ABC
?? rm? -r? *
?? cd? ..
?? rmdir? ABC
2.16? 如何用一個命令行統(tǒng)計(jì)給定目錄中有多少個子目錄?
答:設(shè)給定目錄名為DIR,則可以使用以下命令行:
ls? -ld? DIR|wc -l
2.17? 類似于DOS下的dir,del,type命令的Linux命令各是什么?
答:分別是:ls ,rm和cat。
2.18? 試說明find,tee,gzip命令的功能。
答:分別使用以下命令:
? ?man ?find? 顯示該命令的功能是:查找Linux系統(tǒng)上的文件或目錄。
?? man? tee?? 顯示該命令的功能是:從標(biāo)準(zhǔn)輸入設(shè)備讀取數(shù)據(jù),將其輸出到標(biāo)準(zhǔn)輸出設(shè)備,同時保存到指定的文件中。
?? man? gzip? 顯示該命令的功能是:對文件進(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下。
(其操作過程是,先輸入冒號“: ”,再輸入命令wq。以下命令操作相同。)
(2) :ZZ(大寫字母ZZ)????? 僅當(dāng)做過修改時才將緩沖區(qū)內(nèi)容寫到文件上。
(3) :x???????? 與:ZZ相同。
(4) :q!??????? 強(qiáng)行退出vi。感嘆號(!)告訴vi,無條件退出,丟棄緩沖區(qū)內(nèi)容。
3.2? vi編輯器的工作方式有哪些?相互間如何轉(zhuǎn)換?
答:vi編輯器有三種工作方式: 命令方式、插入方式和ex轉(zhuǎn)義方式。
●Shell命令→vi的命令方式:輸入命令vi進(jìn)入編輯器時,就處于vi的命令方式。
●vi的命令方式→Shell命令:在vi的命令方式下使用退出命令,可以返回shell命令方式。
●vi命令方式→插入方式:通過輸入vi的插入命令(i)、附加命令(a)、打開命令(o)、替換命令(s)、修改命令(c)或取代命令(r)可以從命令方式進(jìn)入到插入方式。
●插入方式→vi命令方式:由插入方式回到命令方式的辦法是按Esc鍵(通常在鍵盤的左上角)。
●vi的命令方式→Ex轉(zhuǎn)義方式:在vi的命令方式下,輸入一個冒號(:),就進(jìn)入Ex轉(zhuǎn)義方式。
●Ex轉(zhuǎn)義方式→vi的命令方式:轉(zhuǎn)義命令執(zhí)行后,自動回到vi命令方式。
3.3? 建立一個文本文件,如會議通知。
(1)建立文件notes,并統(tǒng)計(jì)其大小。
(2)重新編輯文件notes,加上一個適當(dāng)?shù)臉?biāo)題。
(3)修改notes中開會的時間和地點(diǎn)。
(4)刪除文件中第3行,然后予以恢復(fù)。
答:上機(jī)題。體會vi編輯器的工作方式及相互轉(zhuǎn)換,熟悉基本命令的使用??蓞⒄找韵虏襟E做:
(1)進(jìn)入vi ,建立一個空文件notes;
(2)進(jìn)入插入方式,編輯一個會議通知;
(3)返回vi命令方式,保存編輯的內(nèi)容并退出vi;
(4)在shell命令方式下,執(zhí)行wc命令,統(tǒng)計(jì)文件notes的大小;
(5)利用vi,重新編輯文件notes,加上一個會議通知的標(biāo)題;
(6)保存編輯內(nèi)容并退出vi,利用cat命令查看該文件的內(nèi)容;
(7)重新編輯文件notes,修改其中開會的時間和地點(diǎn);
(8)保存內(nèi)容并退出vi,然后利用cat命令查看該文件的內(nèi)容,注意內(nèi)容的變化;
(9)重新編輯該文件,利用文本刪除命令刪除其中的第3行;接著分別利用復(fù)原命令u和U恢復(fù)刪除的內(nèi)容。注意各個命令執(zhí)行后屏幕顯示內(nèi)容的變化。從中體會各命令的功能。3.4? 建立一個文本文件,將光標(biāo)移至第5行上。分別利用c,C和cc命令進(jìn)行修改。
答:上機(jī)題。體會在vi編輯方式下,光標(biāo)移動的方式和不同修改命令的功能。注意各命令的使用方式和光標(biāo)位置的移動。
3.5? 在vi之下,上、下、左、右移動光標(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個詞(包括光標(biāo)所在詞)。
?????? x???? ?? 刪除光標(biāo)所在的字符。
cw???? 將光標(biāo)所在字符至詞尾刪除,然后用新輸入的文本代替。
10cc ?? 先刪除光標(biāo)所在行及其下面9行(共10行),然后以新輸入的文本代替。
3rk? ?? 表示從光標(biāo)位置開始向右共有3個字符被k替代。
5s??? ?? 光標(biāo)所在字符及其后的4個字符(共5個字符)被新輸入的字符序列替代。
7S?? ?? 當(dāng)前行及其下面6行(共7行)被新輸入的正文替換。
>8M?? 將當(dāng)前行和屏幕中間行之間各行向右移動8個字符
/this ?? 從光標(biāo)所在行開始向前查找字符串“this”,找到后就做上標(biāo)記。
?abc?-5?? 從光標(biāo)所在行開始向后查找字符串“abc”,光標(biāo)停在首次找到行之前的倒數(shù)第5行的行首,即行號是(匹配行號-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(簡稱sh)、C shell(簡稱csh)、Korn? shell(簡稱ksh)和Bourne Again shell(簡稱bash)。
Linux系統(tǒng)中默認(rèn)的shell是bash。
4.2? 簡述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)提供了在后臺(&)執(zhí)行命令的能力;
(7)提供了可配置的環(huán)境,允許創(chuàng)建和修改命令、命令提示符和其他的系統(tǒng)行為;
(8)提供了一個高級的命令語言,能創(chuàng)建從簡單到復(fù)雜的程序。這些shell程序稱為shell腳本。
bash是Linux系統(tǒng)默認(rèn)的一個shell。bash不但與Bourne shell兼容,還繼承了C shell,Korn shell等下述優(yōu)點(diǎn):
① 命令行歷史。使用命令行歷史特性,可以恢復(fù)以前輸入的命令。
② 命令行編輯??梢岳镁庉嬈?#xff08;如vi)修改已經(jīng)輸入的命令。
③ 命令補(bǔ)全。能在輸入文件名的一部分之后,由系統(tǒ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? 說明三種引號的作用有什么區(qū)別。
答:在shell中引號分為三種: 雙引號、單引號和倒引號。
(1)由雙引號括起來的字符(除$、倒引號ˋ 和轉(zhuǎn)義字符\外)均作為普通字符對待,而那三個字符仍保留其特殊功能。
(2)由單引號括起來的所有字符都作為普通字符出現(xiàn)。
(3)用倒引號括起來的字符串被shell解釋為命令行,在執(zhí)行時,shell會先執(zhí)行該命令行,并以執(zhí)行結(jié)果取代用倒引號括起的部分。另外,可以將一個命令的執(zhí)行結(jié)果賦給變量,即命令替換。
4.6? 利用變量賦值方式,將字符串DOS? file? c : > \$student\*顯示出來。
答:$? string=’ DOS ?file? c:>\$student\*’
????? $? echo? $string
4.7? 顯示環(huán)境變量的設(shè)置情況,說明各自的意義。
答:執(zhí)行env命令,在屏幕上將會顯示出當(dāng)前環(huán)境下的所有環(huán)境變量及其值。讀者可以依據(jù)所用機(jī)器上實(shí)際顯示的信息,進(jìn)行說明。常用的環(huán)境變量有以下幾個。
(1) HOME: 用戶主目錄的全路徑名。
(2) LOGNAME: 即用戶注冊名,由Linux自動設(shè)置。
(3) PWD: 當(dāng)前工作目錄的路徑。
(4) PATH: shell查找命令的路徑(目錄)列表,各個目錄用冒號(: )隔開。
(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
答:該腳本的功能是:逆向輸出用戶在命令行上提供的各個參數(shù)。例如,設(shè)該腳本名是ABC,執(zhí)行該腳本的命令行是:$ ABC? apple? big? cat? dog?
則結(jié)果輸出是:dog? cat? big? apple
4.9? 編寫一個shell腳本,它把第二個位置參數(shù)及其以后的各個參數(shù)指定的文件復(fù)制到第一個位置參數(shù)指定的目錄中。
答:上機(jī)實(shí)踐題。參考腳本如下:
?????? #!/bin/bash
??????
count=$#
if [? -d?? "$1 "? ]
?????? then
????????????? n=2
??????? dir=$1
while [? $n? –le? $count? ]
?????? ??? do
???????????????????? if [? -f? $2? ]
then? cp? $2? $dir
else? echo?? "$2? is? not an ordinary? file. "
fi
shift
???????????????????? ((n=n+1))
????????????? done
?????? else? echo?? "$1? is? not? a? directory. "
fi
?
4.10? 編寫一個shell腳本,顯示當(dāng)天日期,查找給定的某用戶是否在系統(tǒng)中工作。如果在系統(tǒng)中,就發(fā)一個問候給他。
答:上機(jī)實(shí)踐題。參考腳本如下:
?????? #!/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? 打印給定目錄下的某些文件,由第一個參數(shù)指出文件所在的目錄,其余參數(shù)是要打印的文件名。
答:上機(jī)實(shí)踐題。參考腳本如下:
?????? #!/bin/bash
??????
?????? count=$#
?if [? -d?? "$1 "? ]
?????? ?then
????????????? cd? $1
n=2
?????? ??? while[? $n? –le? $count? ]
?????? ??? do
???????????????????? if [? -f? $2? ]
then? cat? $2
else? echo?? "Sorry, cannot? display? $2. "
fi
shift
???????????????????? ((n=n+1))
????????????? done
?????? else? echo?? "$1? is? not? a? directory. "
fi
?
4.12? 利用for循環(huán)將當(dāng)前目錄下的 .c文件移到指定的目錄下,并按文件大小排序,顯示移動后指定目錄的內(nèi)容。
答:上機(jī)實(shí)踐題。參考腳本如下:
?????? #!/bin/bash
?
?????? echo?? "Input? the? name? of? a? directory. "
?????? read? dir
if [? -d? $dir? ]
?????? then
for? name? in? *.c
????????????? do
???????????????????? mv? $name? dir
????????????? done
ls? -S? dir
????????????? ls? dir
?????? else? echo? "Sorry!$dir? is? not? a? directory. "
?????? fi
?
4.13? 利用數(shù)組形式存放10個城市的名字,然后利用for循環(huán)把它們打印出來。
答:上機(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? 編寫一個shell腳本,求費(fèi)波納奇數(shù)列的前10項(xiàng)及總和。
答:上機(jī)實(shí)踐題。參考腳本如下:
?????? #!/bin/bash
?????? fib[1]=1
fib[2]=1
?????? n=3
?????? ((sum= fib[1]+fib[2]))
?????? while [? $n? –lt? 10? ]
?????? do
????????????? ((fib[n]=fib[n-1]+fib[n-2]))
????????????? ((fib[n+1]=fib[n-1]+fib[n]))
????????????? ((sum=sum+fib[n]+fib[n+1]))
????????????? ((n=n+2))
?????? done
?????? for ((i=1;i<=10;i++))
?????? do
????????????? echo? ${fib[i]}
?????? done
?????? echo? $sum
?
4.15? 下述表達(dá)式的作用是什么?
${ name[*] }???????????? ???? ?${ name[@] }?????????? ${ name #*/ }
${ name %%.* }??????????????? ${ #name[*] }?? ????? ${ name:-Hello }
答:${name[*]}和${name[@]}? 都表示數(shù)組name中所有非空元素的值,每個元素的值用空格分開。
${ name #*/ }? 如果name值的開頭包含模式*/,那么該表達(dá)式的值就是name中去掉最少匹配*/部分后的結(jié)果;否則,就是name的值。
${ name %%.* } 如果name值的末尾包含.*,那么該表達(dá)式的值就是name中去掉最多匹配.*部分后的結(jié)果;否則,就是name的值。
${#nane[*]}的值是數(shù)組name中已經(jīng)設(shè)置的元素的個數(shù)。
${ name:-Hello }? 如果name的值為空,則整個表達(dá)式的值等于給定的字符串Hello,name保持不變;否則,整個表達(dá)式的值等于name的值,name保持不變。
4.16? 顯示前面所執(zhí)行的40個命令的清單,重新執(zhí)行倒數(shù)第5條命令。編輯其中一條命令,然后執(zhí)行。
答:上機(jī)實(shí)踐題。
$ history 40
$ !-5
然后,按↑鍵或↓鍵,找到你要編輯的命令;
進(jìn)行編輯;
按Enter鍵,執(zhí)行該命令。
?
4.17? 定義一個別名命令,它等價的功能是:顯示當(dāng)前日期及工作目錄,并列出有多少用戶在系統(tǒng)上工作。
答:上機(jī)實(shí)踐題。
$ alias? cmd=’date;pwd;who|wc –l’
$ cmd
4.18? 設(shè)計(jì)一個程序cuts,它由標(biāo)準(zhǔn)輸入讀取數(shù)據(jù),獲取由第一個參數(shù)n和第二個參數(shù)m所限定范圍的數(shù)據(jù),n和m都是整數(shù),即從輸入的字符串中抽取第n個字符至第m個字符之間的所有字符(包括這兩個字符)。例如:
$ 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? 說明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? 說明Linux系統(tǒng)核心結(jié)構(gòu)的組成情況。
答:Linux是采用單體結(jié)構(gòu)的操作系統(tǒng),所有的內(nèi)核系統(tǒng)功能都包含在一個大型的內(nèi)核軟件之中。Linux內(nèi)核分為用戶層、核心層和硬件層3個層次,其內(nèi)核結(jié)構(gòu)框圖如下圖所示。
??
5.3? 什么是進(jìn)程?什么是線程?Linux系統(tǒng)中的進(jìn)程有哪些狀態(tài)?如何獲取系統(tǒng)中各進(jìn)程的狀態(tài)?
答:簡單地說,進(jìn)程就是程序的一次執(zhí)行過程。具體地說,進(jìn)程是具有獨(dú)立功能的程序關(guān)于某個數(shù)據(jù)集合上的一次運(yùn)行活動,是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個獨(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)程,可以通過系統(tǒng)調(diào)用或在出現(xiàn)中斷、異常時進(jìn)入內(nèi)核模式。
5.5? Linux系統(tǒng)中進(jìn)程控制塊的作用是什么?它與進(jìn)程有何關(guān)系?
答:Linux系統(tǒng)中的每個進(jìn)程都有一個名為task_struct的數(shù)據(jù)結(jié)構(gòu),它相當(dāng)于“進(jìn)程控制塊”,包含了進(jìn)程的描述信息和控制信息,是進(jìn)程組成中最關(guān)鍵的部分。
每個進(jìn)程有唯一的進(jìn)程控制塊;操作系統(tǒng)根據(jù)它對進(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)度時機(jī)三個方面。
Linux內(nèi)核的調(diào)度方式基本上采用“搶占式優(yōu)先級”方式。
Linux系統(tǒng)針對不同類別的進(jìn)程提供了三種不同的調(diào)度策略,即: SCHED_FIFO(適合于實(shí)時進(jìn)程)、SCHED_RR(對應(yīng)“時間片輪轉(zhuǎn)法”)以及SCHED_OTHER(適合于交互式的分時進(jìn)程)。
核心進(jìn)行進(jìn)程調(diào)度的時機(jī)有以下幾種情況: (1)當(dāng)前進(jìn)程調(diào)用系統(tǒng)調(diào)用nanosleep()或者pause(),使自己進(jìn)入睡眠狀態(tài),主動讓出一段時間的CPU使用權(quán); (2)進(jìn)程終止,永久地放棄對CPU的使用; (3)在時鐘中斷處理程序執(zhí)行過程中,發(fā)現(xiàn)當(dāng)前進(jìn)程連續(xù)運(yùn)行的時間過長; (4)當(dāng)喚醒一個睡眠進(jìn)程時,發(fā)現(xiàn)被喚醒的進(jìn)程比當(dāng)前進(jìn)程更有資格運(yùn)行; (5)一個進(jìn)程通過執(zhí)行系統(tǒng)調(diào)用來改變調(diào)度策略或者降低自身的優(yōu)先權(quán),從而引起立即調(diào)度。
5.7? shell的基本工作過程是怎樣的?
答:shell命令解釋程序不屬于內(nèi)核部分,而是在核心之外,以用戶態(tài)方式運(yùn)行。其基本工作流程是:
① 讀取用戶由鍵盤輸入的命令行。
② 判斷命令是否正確,且將命令行的其他參數(shù)改造為系統(tǒng)調(diào)用exec ( )內(nèi)部處理所要求的形式。
③ 終端進(jìn)程調(diào)用fork( )建立一個子進(jìn)程。
④ 終端進(jìn)程本身用系統(tǒng)調(diào)用wait4( )來等待子進(jìn)程完成(如果是后臺命令,則不等待)。
⑤ 當(dāng)調(diào)度子進(jìn)程運(yùn)行時,它調(diào)用exec( )—— 根據(jù)文件名(即命令名)到目錄中查找有關(guān)文件(可執(zhí)行文件),調(diào)入內(nèi)存,更換自己的映像,然后執(zhí)行這個程序(即執(zhí)行這條命令)。
⑥ 如果命令行末尾有&(后臺命令符號),則終端進(jìn)程不執(zhí)行系統(tǒng)調(diào)用wait4( ),而是立即發(fā)提示符$,讓用戶輸入下一個命令,轉(zhuǎn)①;如果命令末尾沒有&,則終端進(jìn)程要一直等待。當(dāng)子進(jìn)程(即執(zhí)行該命令程序的進(jìn)程)完成處理后終止,向父進(jìn)程(終端進(jìn)程)報(bào)告。此時,終端進(jìn)程被喚醒,在做必要的判別等工作后,終端進(jìn)程發(fā)提示符$,讓用戶輸入新的命令,重復(fù)上述處理過程。
5.8? Linux系統(tǒng)一般采用哪種文件系統(tǒng)?其構(gòu)造形式如何?
答:目前,Linux主要使用的文件系統(tǒng)是ext2、ext3和ext4。ext3是ext2的升級版本,加入了記錄數(shù)據(jù)的日志功能。ext4是ext3文件系統(tǒng)的后繼版本,是擴(kuò)展日志式文件系統(tǒng)。
ext2文件系統(tǒng)中的文件信息都保存在數(shù)據(jù)塊中。ext2文件系統(tǒng)將邏輯塊劃分成塊組,每個塊組重復(fù)保存著一些有關(guān)整個文件系統(tǒng)的關(guān)鍵信息以及實(shí)際的文件和目錄的數(shù)據(jù)塊。Ext2文件系統(tǒng)的物理構(gòu)造形式如下圖所示?
5.9? 什么是塊組?什么是超級塊?超級塊的功能是什么?
答: Linux主要使用的文件系統(tǒng)是ext2和ext3,各自劃分成若干塊組。每個塊組重復(fù)保存著一些有關(guān)整個文件系統(tǒng)的關(guān)鍵信息,以及真正的文件和目錄的數(shù)據(jù)塊,其中包含超級塊、塊組描述結(jié)構(gòu)、塊位示圖、索引節(jié)點(diǎn)位示圖、索引節(jié)點(diǎn)表和數(shù)據(jù)塊。
超級塊位于每個塊組的最前面,其中包含有關(guān)該文件系統(tǒng)的全部關(guān)鍵參數(shù)。當(dāng)計(jì)算機(jī)加電進(jìn)行引導(dǎo)或第1次遇到該文件系統(tǒng)時,就把超級塊中的信息讀入內(nèi)存。超級塊中包含標(biāo)識文件系統(tǒng)類型的幻數(shù)、文件系統(tǒng)中的盤塊數(shù)量、修改標(biāo)記及其他關(guān)鍵管理信息。
超級塊中包含有文件系統(tǒng)本身的大小和形式的基本信息,文件系統(tǒng)管理員可以利用這些信息來使用和維護(hù)文件系統(tǒng)。
5.10? 什么是索引節(jié)點(diǎn)?索引節(jié)點(diǎn)主要有哪些內(nèi)容?它與文件有何關(guān)系?
答:索引節(jié)點(diǎn)又被稱為I節(jié)點(diǎn),是一個結(jié)構(gòu)數(shù)組,其中包含有關(guān)該文件的全部管理信息。
索引節(jié)點(diǎn)主要包括以下內(nèi)容: 文件模式,文件屬主信息,文件大小,時間戳,文件鏈接計(jì)數(shù),數(shù)據(jù)塊索引表等。
ext2文件系統(tǒng)的索引節(jié)點(diǎn)起著文件控制塊的作用,利用這種數(shù)據(jù)結(jié)構(gòu)可對文件進(jìn)行控制和管理。每個文件都只有一個索引節(jié)點(diǎn)。
5.11? 為什么要設(shè)立虛擬文件系統(tǒng)(VFS)?它與實(shí)際文件系統(tǒng)的關(guān)系是怎樣的?
答:Linux系統(tǒng)可以支持多種文件系統(tǒng),為此,必須使用一種統(tǒng)一的接口,這就是虛擬文件系統(tǒng)(VFS)。通過VFS將不同文件系統(tǒng)的實(shí)現(xiàn)細(xì)節(jié)隱藏起來,從外部看上去所有的文件系統(tǒng)都是一樣的。
VFS是建立在具體文件系統(tǒng)之上的,VFS必須管理所有的文件系統(tǒng)。用戶程序(進(jìn)程)通過有關(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)通常為什么要把硬盤劃分為多個文件系統(tǒng)?簡述文件系統(tǒng)安裝的基本過程。
答:一個硬盤上可以同時存在多個文件系統(tǒng),每個文件系統(tǒng)占據(jù)硬盤的一個獨(dú)立分區(qū)。Linux文件系統(tǒng)可以根據(jù)需要隨時裝卸,從而實(shí)現(xiàn)文件存儲空間的動態(tài)擴(kuò)充和信息安全。在系統(tǒng)初啟時,只有根文件系統(tǒng),其他的文件系統(tǒng)可以根據(jù)需要作為子系統(tǒng)動態(tài)地安裝到主系統(tǒng)中,已安裝的子文件系統(tǒng)也可從整個文件系統(tǒng)上卸下來,恢復(fù)安裝前的獨(dú)立狀態(tài)。
文件系統(tǒng)安裝的基本過程是:超級用戶可以使用命令mount將新文件系統(tǒng)安裝到主文件系統(tǒng)中。該命令帶有3個主要參數(shù):要安裝的文件系統(tǒng)類型、該文件系統(tǒng)所在分區(qū)名和安裝新文件系統(tǒng)的路徑名(即安裝點(diǎn))。執(zhí)行該命令時,Linux系統(tǒng)內(nèi)核必須首先檢查有關(guān)參數(shù)的有效性。VFS首先應(yīng)找到要安裝的文件系統(tǒng),通過查找由file_systems指針指向的鏈表中的每一個file_system_type數(shù)據(jù)結(jié)構(gòu)來搜索已知的文件系統(tǒng)(該結(jié)構(gòu)包含文件系統(tǒng)的名字和指向VFS超級塊讀取程序地址的指針),當(dāng)找到一個匹配的名字時,就可以得到讀取文件系統(tǒng)超級塊的程序的地址。接著要查找作為新文件系統(tǒng)安裝點(diǎn)的VFS索引節(jié)點(diǎn),并且在同一目錄下不能安裝多個文件系統(tǒng)。VFS安裝程序必須分配一個VFS超級塊(super_block),并且向它傳遞一些有關(guān)文件系統(tǒng)安裝的信息。申請一個vfsmount數(shù)據(jù)結(jié)構(gòu)(其中包括存儲文件系統(tǒng)的塊設(shè)備的設(shè)備號、文件系統(tǒng)安裝的目錄和一個指向文件系統(tǒng)的VFS超級塊的指針),并使它的指針指向所分配的VFS超級塊。當(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)采用交換和請求分頁兩種內(nèi)存管理技術(shù)。
請求分頁存儲管理技術(shù)是在簡單分頁存儲技術(shù)基礎(chǔ)上發(fā)展起來的,它的基本思想是:當(dāng)進(jìn)程運(yùn)行時,不必把整個進(jìn)程映像都放在內(nèi)存中,只需在內(nèi)存保留當(dāng)前用到的那一部分頁面。當(dāng)進(jìn)程訪問到某些尚未在內(nèi)存的頁面時,就由核心把這些頁面裝入內(nèi)存。這種策略使進(jìn)程的虛擬地址空間映射到機(jī)器的物理空間時具有更大的靈活性,通常允許進(jìn)程的大小可大于可用內(nèi)存的總量,并允許更多進(jìn)程同時在內(nèi)存中執(zhí)行。
內(nèi)存交換的基本思想是:當(dāng)系統(tǒng)中出現(xiàn)內(nèi)存不足時,Linux內(nèi)存管理子系統(tǒng)就釋放一些內(nèi)存頁,從而增加系統(tǒng)中空閑內(nèi)存頁的數(shù)量,此任務(wù)是由內(nèi)核的交換守護(hù)進(jìn)程kswapd完成的。
5.14? 何謂虛擬存儲器?Linux系統(tǒng)如何支持虛存?
答:所謂虛擬存儲器是用戶能作為可編址內(nèi)存對待的虛擬存儲空間,它使用戶邏輯存儲器與物理存儲器分離,是操作系統(tǒng)給用戶提供的一個比真實(shí)內(nèi)存空間大得多的地址空間。
Linux存儲管理采用請求分頁技術(shù),請求分頁提供虛擬存儲器。它的基本思想是: 當(dāng)我們要執(zhí)行一個程序時才把它換入內(nèi)存; 但并不把全部程序都換入內(nèi)存,而是用到哪一頁時才換入它。這樣,就減少了對換時間和所需內(nèi)存數(shù)量,允許增加程序的道數(shù)。
5.15? Linux系統(tǒng)中交換空間為何采用連續(xù)空間?
答:因?yàn)檫M(jìn)程使用交換空間是臨時性的,速度是關(guān)鍵性問題,系統(tǒng)一次進(jìn)行多個盤塊I/O傳輸比每次一塊、多次傳輸?shù)乃俣纫?#xff0c;所以核心在交換設(shè)備上是分配一片連續(xù)空間,而不管碎片的問題。
5.16? Linux為什么要采用三級頁表?該機(jī)制如何工作?
答:現(xiàn)在地址碼通常采用32位,這樣,每個進(jìn)程的虛擬存儲空間可達(dá)4 GB。而Linux系統(tǒng)中頁面的大小為4KB,因此進(jìn)程虛擬存儲空間要劃分為220(1M)個頁面。如果直接用頁表描述這種映射關(guān)系,那么每個進(jìn)程的頁表就要有220(1M)個表項(xiàng)。很顯然,用大量的內(nèi)存資源來存放頁表是不可取的。為此,Linux系統(tǒng)采用三級頁表的方式。Linux系統(tǒng)三級頁表地址映射如下圖所示。
圖中PGD表示頁面目錄,PMD表示中間目錄,PT表示頁表。一個線性虛擬地址在邏輯上劃分成4個位段,從高位到低位分別用做檢索頁面目錄PGD的下標(biāo)、中間目錄PMD的下標(biāo)、頁表PT的下標(biāo)和物理頁面(即內(nèi)存塊)內(nèi)的位移。把一個線性地址映射成物理地址分為以下4步:
① 以線性地址中最高位段作為下標(biāo),在PGD中找到相應(yīng)的表項(xiàng),該表項(xiàng)指向相應(yīng)的PMD。
② 以線性地址中第2個位段作為下標(biāo),在PMD中找到相應(yīng)的表項(xiàng),該表項(xiàng)指向相應(yīng)的PT。
③ 以線性地址中第3個位段作為下標(biāo),在PT中找到相應(yīng)的表項(xiàng),該表項(xiàng)指向相應(yīng)的物理頁面(即該物理頁面的起始地址)。
④ 線性地址中的最低位段是物理頁面內(nèi)的相對位移量,此位移量與該物理頁面的起始地址相加就得到相應(yīng)的物理地址。
5.17? Linux信號機(jī)制是如何實(shí)現(xiàn)進(jìn)程通信的?
答:信號機(jī)制是在軟件層次上對中斷機(jī)制的一種模擬。異步進(jìn)程可以通過彼此發(fā)送信號來實(shí)現(xiàn)簡單通信。系統(tǒng)預(yù)先規(guī)定若干個不同類型的信號,各表示發(fā)生了不同的事件,每個信號對應(yīng)一個編號。運(yùn)行進(jìn)程當(dāng)遇到相應(yīng)事件或者出現(xiàn)特定要求時,就把一個信號寫到相應(yīng)進(jìn)程task_struct結(jié)構(gòu)的signal位圖中。接收信號的進(jìn)程在運(yùn)行過程中要檢測自身是否收到了信號,如果已收到信號,則轉(zhuǎn)去執(zhí)行預(yù)先規(guī)定好的信號處理程序。處理之后,再返回原先正在執(zhí)行的程序。
5.18? 管道文件如何實(shí)現(xiàn)兩個進(jìn)程間的通信?
答:管道文件是連接兩個命令的一個打開文件。一個命令向該文件中寫入數(shù)據(jù),稱作寫者;另一個命令從該文件中讀出數(shù)據(jù),稱作讀者。系統(tǒng)自動處理二者之間的同步、調(diào)度和緩沖。利用管道文件可以實(shí)現(xiàn)兩個或多個進(jìn)程間的直接通信。
5.19? Linux系統(tǒng)中設(shè)備驅(qū)動分層結(jié)構(gòu)是怎樣的?如何實(shí)現(xiàn)與設(shè)備的無關(guān)性?
答:設(shè)備驅(qū)動的分層結(jié)構(gòu)自頂向下依次為:應(yīng)用層、文件系統(tǒng)層、設(shè)備驅(qū)動層、物理設(shè)備層。
Linux系統(tǒng)采用設(shè)備文件統(tǒng)一管理硬件設(shè)備,從而將硬件設(shè)備的特性及管理細(xì)節(jié)對用戶隱藏起來,實(shí)現(xiàn)用戶程序與設(shè)備無關(guān)性。
5.20? Linux系統(tǒng)中可安裝模塊的思想是什么?
答:可安裝模塊是可以在系統(tǒng)運(yùn)行時動態(tài)地安裝和拆卸的內(nèi)核模塊。利用這個機(jī)制,可以根據(jù)需要在不必對內(nèi)核重新編譯連接的條件下,將可安裝模塊動態(tài)插入運(yùn)行中的內(nèi)核,成為其中一個有機(jī)組成部分; 或者從內(nèi)核卸載已安裝的模塊。設(shè)備驅(qū)動程序或者與設(shè)備驅(qū)動緊密相關(guān)的部分(如文件系統(tǒng)) 都是利用可安裝模塊實(shí)現(xiàn)的。
5.21? 什么是中斷?中斷的一般處理過程是什么?
答:所謂中斷是指CPU對系統(tǒng)發(fā)生的某個事件作出的一種反應(yīng)——CPU暫停正在執(zhí)行的程序,保留現(xiàn)場后自動地執(zhí)行相應(yīng)的處理程序,處理完該事件后,如被中斷進(jìn)程的優(yōu)先級最高,則返回?cái)帱c(diǎn)繼續(xù)執(zhí)行被“打斷”的程序。
中斷的一般處理過程:保存被中斷程序的現(xiàn)場,分析中斷原因,轉(zhuǎn)入相應(yīng)處理程序進(jìn)行處理,恢復(fù)被中斷程序現(xiàn)場(即中斷返回)。
5.22? Linux系統(tǒng)怎樣處理系統(tǒng)調(diào)用?
答:Linux的系統(tǒng)調(diào)用是通過中斷指令I(lǐng)NT 0x80實(shí)現(xiàn)的。當(dāng)CPU執(zhí)行到中斷指令I(lǐng)NT 0x80時,硬件就作出一系列響應(yīng),其動作與中斷響應(yīng)相同。CPU穿過陷阱門,從用戶空間進(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)用號為下標(biāo)檢索系統(tǒng)調(diào)用入口表sys_call_table,從中找到相應(yīng)的函數(shù); 然后,轉(zhuǎn)去執(zhí)行該函數(shù),完成具體的服務(wù)。執(zhí)行完服務(wù)程序,核心檢查是否發(fā)生錯誤,并作相應(yīng)處理。如果本進(jìn)程收到信號,則對信號作相應(yīng)處理。最后進(jìn)程從系統(tǒng)空間返回到用戶空間。
?
思考題6
6.1? gcc編譯過程一般分為哪幾個階段?各階段的主要工作是什么?
答:gcc編譯過程可以分為4個階段,包括預(yù)處理(Preprocessing)、編譯(Compiling)、匯編(Assembling)和連接(Linking)。
●預(yù)處理程序讀取C語言源文件,對其中以“#”開頭的指令(偽指令)和特殊符號進(jìn)行處理。
●編譯程序?qū)︻A(yù)處理之后的輸出文件進(jìn)行詞法分析和語法分析,試圖找出所有不符合語法規(guī)則的部分,并根據(jù)問題的大小做出不同處理。在確定各成分都符合語法規(guī)則后,將其“翻譯”為功能等價的中間代碼表示或者匯編代碼。
●匯編程序把匯編語言代碼翻譯成目標(biāo)機(jī)器代碼。
●連接程序要解決外部符號訪問地址問題,也就是將一個文件中引用的符號(如變量或函數(shù)調(diào)用)與該符號在另外一個文件中的定義連接起來,從而使有關(guān)的目標(biāo)文件連成一個整體,最終成為可被操作系統(tǒng)執(zhí)行的可執(zhí)行文件。
6.2? 對C語言程序進(jìn)行編譯時,針對以下情況應(yīng)使用的編譯命令行是什么?
(1)只生成目標(biāo)文件,不進(jìn)行連接。
(2)在預(yù)處理后的輸出中保留源文件中的注釋。
(3)將輸出寫到file指定的文件中。
(4)指示編譯程序在目標(biāo)代碼中加入供調(diào)試程序gdb使用的附加信息。
(5)連接時搜索由library命名的庫。
答:(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) 連接時搜索由library命名的庫:gcc? -llibrary源文件名
6.3? 通常,程序中的錯誤按性質(zhì)分為哪三種?
答:程序中的錯誤按其性質(zhì)可分為以下三種:(1) 編譯錯誤,即語法錯誤。(2)? 運(yùn)行錯誤。(3) 邏輯錯誤。
6.4? gdb主要幫助用戶在調(diào)試程序時完成哪些工作?
答:gdb主要幫助用戶在調(diào)試程序時完成四方面的工作:
(1) 啟動程序,可以按用戶要求影響程序的運(yùn)行行為。
(2) 使運(yùn)行程序在指定條件處停止。
(3) 當(dāng)程序停止時,檢查它出現(xiàn)了什么問題。
(4) 動態(tài)改變程序的執(zhí)行環(huán)境,這樣就可以糾正一個錯誤的影響,然后再糾正其他錯誤。
6.5? 調(diào)試下面的程序:
/*badprog.c錯誤地訪問內(nèi)存*/
#include ?<stdio.h>
#include <stdlib.h>
?
int main(int argc, char **argv)
{
??? char *p;
??? int i;
??? p=malloc(30);
??? strcpy(p,"not 30 bytes");
??? printf("p=<%s>\n",p);
??? if(argc==2){
??????? if(strcmp(argv[1], "-b")==0)
??????????? p[50]='a';
??????? else if(strcmp(argv[1], "-f ")==0){
??????????? free(p);
??????????? p[0]='b';
??????? }
??? }
??? /*free(p);*/
??? return 0;
}
答:這是上機(jī)操作題。先利用gcc? -g? badprog.c?? -o? badprog對源文件進(jìn)行編譯;通過編譯后,運(yùn)行badprog文件,看看出現(xiàn)什么問題;然后利用gdb工具調(diào)試該程序。參考書中6.2.6節(jié)的示例,依據(jù)調(diào)試時實(shí)際顯示的即時信息,分析可能的原因(注意數(shù)組大小!),使用相應(yīng)的命令一步步調(diào)試,直至找出問題根源;然后予以改正,再重新編譯、運(yùn)行。
6.6? 調(diào)試下面的程序:
/*callstk.c有3個函數(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();
??? printf("make_key returns %d\n",ret);
??? exit(EXIT_SUCCESS);
}
?
int make_key(void)
{
??? int ret=get_key_num();
??? return ret;
}
int get_key_num(void)
{
??? int ret=number();
??? return ret;
}
int number(void)
{
??? return 10;
}
答:這是上機(jī)操作題。體會函數(shù)調(diào)用的層次關(guān)系。
6.7? GNU make的工作過程是怎樣的?
答:GNU make的工作過程是:
① 依次讀入各makefile文件;
② 初始化文件中的變量;
③ 推導(dǎo)隱式規(guī)則,并分析所有規(guī)則;
④ 為所有的目標(biāo)文件創(chuàng)建依賴關(guān)系鏈;
⑤ 根據(jù)依賴關(guān)系和時間數(shù)據(jù),確定哪些目標(biāo)文件要重新生成;
⑥ 執(zhí)行相應(yīng)的生成命令。
6.8? makefile的作用是什么?其書寫規(guī)則是怎樣的?
答: makefile文件是make命令必備的一個文本形式的數(shù)據(jù)庫文件,它定義了一系列規(guī)則,記錄了文件之間的依賴關(guān)系及在此依賴關(guān)系基礎(chǔ)上所應(yīng)執(zhí)行的命令序列,即定義了一系列規(guī)則來指定哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯等。此外,還可以有變量定義、注釋等。
makefile的通用形式如下所示:
目標(biāo)文件:[相依文件…]
<tab>命令1[#注釋]
…
<tab>命令n[#注釋]
其書寫規(guī)則是:依賴行從一行的開頭開始書寫。各命令行單獨(dú)占一行,每個命令行的第一個字符必須是制表符<tab>,而不能使用8個空格;#號后的內(nèi)容為注釋。它可以位于一行的開頭;在依賴行上,目標(biāo)文件和相依文件之間要用一個或兩個冒號分開。一個目標(biāo)文件可以出現(xiàn)在多個依賴行上,此時所有的依賴行的類型必須一致(一個冒號或兩個冒號)。
6.9? 設(shè)某個正在開發(fā)的程序由以下內(nèi)容組成:
① 4個C語言源文件:a.c,b.c,c.c和d.c。設(shè)b.c和d.c都使用了defs.h中的聲明。
② 匯編語言源文件assmb.s被某個C語言源文件調(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? prog
a.o:a.c?
?????? gcc? –c? a.c
b.o:b.c? defs.h
???????? gcc? -c? b.c
c.o:c.c
?????? gcc? -c? c.c
d.o:d.c? defs.h
?????? gcc? -c? d.c
assmb.o:assmb.s
?????? as? -o? assmb.o? assmb.s
clean:
?????? rm? prog? *.o
?
?
思考題7
7.1? 什么是系統(tǒng)調(diào)用?什么是庫函數(shù)?二者有何異同?
答:系統(tǒng)調(diào)用是操作系統(tǒng)內(nèi)核提供的、與用戶程序之間的接口,也就是操作系統(tǒng)提供給程序員的接口,一般位于操作系統(tǒng)核心的最高層。
庫函數(shù):由系統(tǒng)提供,用于解決共性問題,為程序的開發(fā)和執(zhí)行提供方便的程序,本身并不屬于操作系統(tǒng)的內(nèi)核部分。
相同點(diǎn):系統(tǒng)調(diào)用和庫函數(shù)都是由程序代碼構(gòu)成,二者調(diào)用方式相同,都需要在調(diào)用時傳送參數(shù),實(shí)參的個數(shù)、出現(xiàn)的次序和實(shí)參的類型與原型說明中形參表的設(shè)計(jì)相同。
區(qū)別:庫函數(shù)調(diào)用依賴于所運(yùn)行的用戶環(huán)境,程序調(diào)用庫函數(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)用時所執(zhí)行的代碼是屬于內(nèi)核的,程序處于“核心態(tài)”執(zhí)行。庫函數(shù)的調(diào)用最終還是要通過系統(tǒng)調(diào)用來實(shí)現(xiàn),庫函數(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ù)說明等。
2、在C語言程序中,系統(tǒng)調(diào)用的調(diào)用方式與調(diào)用庫函數(shù)相同,即調(diào)用時,提供的實(shí)參的個數(shù)、出現(xiàn)的順序和實(shí)參的類型應(yīng)與原型說明中形參表的設(shè)計(jì)相同。
7.3? 編寫一個程序,把一個文件的內(nèi)容復(fù)制到另一個文件上,即實(shí)現(xiàn)簡單的copy功能。要求:只用open( ),read( ),write( )和close( )系統(tǒng)調(diào)用,程序的第一個參數(shù)是源文件,第二個參數(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");
?? ? return 1;
}
while((N=read(fd1,buf, SIZE))>0)
write(fd2,buf,N);???? //從源文件讀,寫入目的文件,實(shí)現(xiàn)copy功能
close(fd1);
close(fd2);
return 0;
}
7.4? 編寫一個程序,它把給定的正文插入到文件的任意指定位置,并輸出最后結(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");
?? ???? return 1;
}
?
? 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? 編寫一個程序,它首先打開一個文件,然后利用fork( )創(chuàng)建一個子進(jìn)程;隨后,當(dāng)父進(jìn)程運(yùn)行時先執(zhí)行wait( );父子進(jìn)程都打印自己和其父進(jìn)程的ID號;并且,二者都向該文件寫入(利用write)一條信息,表明是在哪個進(jìn)程中。試問:如果沒有wait調(diào)用,會出現(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));
???????? exit(1);
};
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)程輸出在后。如果沒有wait(),則輸出結(jié)果的先后順序會有隨機(jī)性,那樣,每次運(yùn)行的結(jié)果都有可能不同。
7.6? 編寫一個程序,盡可能多地輸出有關(guān)當(dāng)前進(jìn)程的信息:PID、PPID、打開文件、當(dāng)前目錄、nice值等。請簡要說明,如何確定哪些文件是打開的?如何確定多個文件描述符表示同一個文件?
答:(上機(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]);
?? ????? return 1;
}
if((file1=open(argv[1],O_CREAT|O_RDWR,S_IRWXU))<0){
perror("open ?argv[1] ");
???????? exit(EXIT_FAILURE);
}
if((file2=open(argv[2],O_CREAT|O_RDWR,S_IRWXU))<0){
perror("open ?argv[2] ");
???????? exit(EXIT_FAILURE);
}
pid=getpid();
ppid=getppid();
printf("Current Process:%d\n",pid);
printf("Parent Process:%d\n",ppid);
printf("Nice of current process:%d\n",getpriority(PRIO_PROCESS,pid));
system("echo current directory is `pwd`??? ");
sprintf(str,"%d",pid);? //將pid轉(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("ls | 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)為每個進(jìn)程自動打開三個標(biāo)準(zhǔn)文件(即標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和錯誤輸出),其文件描述符分別為0,1和2,本題給出的參考代碼中,打開了兩個文件,這樣可以更加清楚的看到進(jìn)程打開的所有文件。
如果文件描述符后面->所指向的文件名稱一致,則代表這些文件描述符對應(yīng)同一個文件。運(yùn)行本代碼時,可以讓文件1和文件2這兩個參數(shù)相同,即同一個文件打開兩次,能夠看到不同的文件描述符對應(yīng)了同一個文件的情況。
另外,root用戶還可以使用lsof命令查看某進(jìn)程所打開的文件信息:# lsof –p 進(jìn)程號
7.7? 編寫一個管道程序,它所創(chuàng)建的管道等價于下面的shell管道:
$ echo good morning|sed s/good/hi/g
該程序的實(shí)現(xiàn)過程是:調(diào)用pipe( )建立一個管道,利用fork( )創(chuàng)建兩個子進(jìn)程:一個是左側(cè)進(jìn)程,另一個是右側(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)閉打開文件描述符的一個副本,調(diào)用execvp( )啟動運(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)閉打開文件描述符的一個副本,調(diào)用execvp( )啟動運(yùn)行的程序。
在父進(jìn)程中,關(guān)閉管道的兩端:close(pipefd[0])和close(pipefd[1])。最后,在父進(jìn)程中使用wait( )等待兩個子進(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]);
??? close(pipefd[1]);
??? wait(NULL);
??? wait(NULL);?
}
?}
?
7.8? 調(diào)用msgget( )創(chuàng)建一個消息隊(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; ?
?
??? if((qid=msgget(MSGKEY,IPC_CREAT|0x0666))<0){? //創(chuàng)建消息隊(duì)列
??????? perror("msgget:create");
??????? exit(EXIT_FAILURE);
??? }
??? printf("Create? a message queue,its ID is:%d\n",qid);
??? qid2=msgget(MSGKEY,IPC_EXCL);?? //IPC_EXCL檢查消息隊(duì)列是否存在
?
??? if(qid2==qid){
??????? printf("Open a message queue,its ID is :%d \n",qid2);
???????? }
??? msgctl(qid,IPC_RMID,0);? //刪除創(chuàng)建的消息隊(duì)列
??? return 0;
}
7.9? 編寫一個程序,它創(chuàng)建一個子進(jìn)程。父進(jìn)程向子進(jìn)程發(fā)送一個信號,然后等待子進(jìn)程終止;子進(jìn)程接收信號,輸出自己的狀態(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;??
??? if((pid=fork())<0) {
??? ??perror("fork of child failed");
???????? ? exit(EXIT_FAILURE);
??? }
else if(pid==0) {?
???? ??????? signal(SIGUSR1,handler);? //子進(jìn)程捕捉信號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ā)信號SIGUSR1
??????? childpid=wait(&status);????? //等待子進(jìn)程完成,并返回status
??????? printf("\n\nprocess %d eixt,the return status is 0x%x\n",childpid,status);??????
??????? exit(EXIT_SUCCESS);
??? }?????
??? return 0;
}
?
7.10? 編寫一個程序,它能閱讀任意長度的行,并確保它們填充正在使用的緩沖區(qū),同時要處理續(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)前行在文件中的行號
?size_t size;??? //緩沖區(qū)的大小
?int len;?????? //當(dā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ù)行符號,將帶有續(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(len*sizeof(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("line number in the file is %d\n", mybuf.curline);
?printf("content of current line is %s",mybuf.buf_start);
?printf("Length of curline is %d\n",mybuf.len);
?printf("File:%s\n\n", mybuf.file);
?}
?return 0;
}
?
思考題8
8.1? 系統(tǒng)管理員的職責(zé)主要有哪些方面?
答:一般說來,系統(tǒng)管理員的任務(wù)包括以下幾個方面:
??? ① 設(shè)置整個計(jì)算機(jī)系統(tǒng),包括硬件和軟件,如安裝硬件設(shè)備、安裝操作系統(tǒng)和軟件包、為用戶建立賬戶等。
??? ② 做適當(dāng)?shù)膫浞?#xff08;系統(tǒng)中常規(guī)文件復(fù)制)和需要時的恢復(fù)。
??? ③ 處理由于計(jì)算機(jī)有限資源的使用(如磁盤空間、進(jìn)程數(shù)目等)而遇到的問題。
??? ④ 排除由于連接問題而造成的系統(tǒng)通信(網(wǎng)絡(luò))阻塞。
??? ⑤? 進(jìn)行操作系統(tǒng)的升級和維護(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)中為新用戶建立賬號、密碼等。采用不同方式設(shè)置用戶密碼。
答:(上機(jī)操作)
1.使用KDE桌面系統(tǒng)為新用戶建立賬戶和密碼的步驟如下:
①點(diǎn)擊“開始”菜單,選擇“設(shè)置”→“系統(tǒng)設(shè)置”,彈出系統(tǒng)設(shè)置窗口,在“個性化”選項(xiàng)下面選擇“賬戶細(xì)節(jié)”,可打開賬戶細(xì)節(jié)管理工具。
② 在“賬戶細(xì)節(jié)”窗口中,點(diǎn)擊“密碼和用戶信息”項(xiàng)。然后,單擊“密碼和用戶信息”窗口中的“+”號按鈕,彈出“增加用戶”對話框,按要求輸入新用戶的賬號名稱、顯示名稱、密碼、確認(rèn)密碼。所有信息設(shè)置完成后點(diǎn)擊“添加”按鈕。
③由于該操作需要root權(quán)限,會彈出 “需要認(rèn)證”窗口,輸入root密碼,點(diǎn)擊“確定”按鈕,完成添加新用戶操作,新用戶將加入到用戶列表中。
2. 普通用戶可以在登錄系統(tǒng)后使用passwd命令來更改自己的密碼。
8.4? 如何查封一個用戶賬號?要使一個用戶賬號失效,應(yīng)該怎么做?請至少列舉三種方法。
答:▲當(dāng)需要查封某個賬號時,可以:
①將用戶記錄從/etc/passwd文件中去掉,但是保留該用戶的主目錄和其他文件;
②在/etc/passwd(或/etc/shadow)文件中,在相關(guān)用戶記錄的passwd字段的首字符前加上符號“*”。
③管理員還可以將用戶賬號的shell設(shè)置成一個特定的只打印出一條信息的程序。
▲要使一個用戶賬號永久失效,即刪除該用戶賬號。
●在圖形界面下刪除一個用戶賬戶的步驟如下:
①點(diǎn)擊“開始”菜單,選擇“設(shè)置”→“系統(tǒng)設(shè)置”,彈出系統(tǒng)設(shè)置窗口,在“個性化”選項(xiàng)下面選擇“賬戶細(xì)節(jié)”,打開賬戶細(xì)節(jié)管理工具
② 在“密碼和用戶信息”標(biāo)簽頁中所列出的用戶清單里,選取你要刪除的一個用戶,該欄目被高亮度化。 ③點(diǎn)擊“ ?”按鈕,彈出確認(rèn)刪除用戶界面,選擇是否同時刪除賬號及賬號所屬的文件,點(diǎn)擊“確認(rèn)”按鈕刪除用戶。
●還可以使用userdel命令刪除已經(jīng)存在的用戶賬戶。必須從/etc/passwd文件中刪除此用戶的記錄項(xiàng)、從/etc/group文件中刪除提及的此用戶,并且刪除用戶的主目錄及其他由該用戶創(chuàng)建或?qū)儆诖擞脩舻奈募?。userdel命令的一般使用格式是:
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)的磁盤使用信息,即可以用來查看磁盤已被使用多少空間和還剩余多少空間。
8.6? 在系統(tǒng)初啟過程中,如何讓系統(tǒng)自動啟動某些程序,以及設(shè)置環(huán)境變量?請至少列舉三種方法。
答:這涉及到用戶登錄環(huán)境的設(shè)置??梢圆捎玫姆椒ㄊ?#xff1a;
1.編輯/etc/bashrc文件,它是腳本文件,包含系統(tǒng)定義的命令別名和bash的環(huán)境變量定義;
2.編輯/etc/profile文件,它是腳本文件,對系統(tǒng)中所有用戶都起作用;
3.編輯$HOME/bash_profile,它是腳本文件,僅對當(dāng)前用戶起作用。
8.7? 讓一個用戶擁有對某個組的資源的訪問權(quán)限,應(yīng)該怎么做?請至少列舉兩種方法。
答:讓一個用戶擁有對某個組的資源的訪問權(quán)限,就要將該用戶加到該組中。可以采用的方法有:
①由超級用戶root使用useradd(或adduser)命令來完成添加用戶的工作。利用選項(xiàng)
-G group,[…]? 指定新用戶的附加組。
②編輯/etc/group文件,將用戶名加到相應(yīng)組的用戶列表中。
8.8? 如何手工設(shè)置磁盤限額?
答:Linux系統(tǒng)是通過quota(磁盤限額)機(jī)制來實(shí)現(xiàn)對用戶使用硬盤資源的控制。如果是首次安裝quota,則應(yīng)按下面步驟執(zhí)行;如果已經(jīng)配置好,則可以直接執(zhí)行⑥。
① 首先在配置核心時,應(yīng)該將以下核心開關(guān)選項(xiàng):quota support(CONFIG_QUOTA)
設(shè)置為“Y”,使核心提供對quota機(jī)制的支持。
② 安裝與quota相關(guān)的軟件包。
③ 修改用戶的系統(tǒng)初啟腳本文件,使之能夠檢查quota,并在系統(tǒng)初啟時開啟quota功能。
④ 修改啟動文件系統(tǒng)支持。為了在每次啟動系統(tǒng)的時候,使文件系統(tǒng)上的quota有效,需要對/etc/fstab文件進(jìn)行相應(yīng)的修改。
⑤ 建立quota.user和quota.group文件。
⑥為特定用戶指定quota。例如,系統(tǒng)中有一個用戶user01。輸入edquota user01命令后,進(jìn)入vi(或是系統(tǒng)默認(rèn)的編輯器)編輯狀態(tài),管理員可以為用戶user01編輯各個啟用quota的分區(qū)限額。
8.9? 如何使用dd命令獲得硬盤的MBR信息?
答:MBR是整個硬盤的主引導(dǎo)記錄(Main Boot Record),它存放在硬盤的第一個扇區(qū)(對應(yīng)于0號磁頭的0柱面0扇區(qū))。通常,扇區(qū)的大小為512字節(jié)。
備份磁盤開頭的MBR信息到一個指定的文件,如/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)的超級塊受到破壞時,應(yīng)該如何修復(fù)?
答:使用fsck命令檢查并修復(fù)相應(yīng)的文件系統(tǒng)(如/dev/hda1分區(qū)上的文件系統(tǒng)):
# fsck ?-r? /dev/hda1
在修復(fù)該文件系統(tǒng)上的超級塊之前,要求管理員確認(rèn)。
8.11? 請參照fdisk命令輸出的結(jié)果來計(jì)算所指定的硬盤容量:
???? ?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目錄中的日志信息,根據(jù)本章的介紹,改善自己系統(tǒng)的安全狀況。
答:(上機(jī)操作題)在/var/log目錄中存放系統(tǒng)運(yùn)行時的使用情況、安全性、系統(tǒng)負(fù)載等方面的日志記錄。如:
●/var/log/wtmp文件保存所有的登錄、退出信息,以及系統(tǒng)的啟動、停止記錄。可以利用它查看用戶的登錄記錄, last和ac等命令可使用wtmp文件的數(shù)據(jù)產(chǎn)生報(bào)告。
●/var/log/lastlog文件可以記錄系統(tǒng)中每個用戶的最后一次登錄時間。當(dāng)用戶登錄時,屏幕上顯示的時間就是從lastlog文件中獲得的。而且,finger命令報(bào)告的登錄時間也是從這個文件中取得的。系統(tǒng)管理員應(yīng)該告訴每個用戶仔細(xì)檢查上次登錄的時間,并報(bào)告非正常的登錄時間。因?yàn)槿藗兺ǔ6紩浀盟洗蔚卿浀臅r間,所以,通過這種方法很容易發(fā)現(xiàn)賬號是否被破解。
●可以在/var/log目錄下找到messages,mail.log等日志文件。/var/log/messages文件記錄了命令的執(zhí)行信息,包括日期、時間、產(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命令的功能、用法及信號SIGHUP的含義。該命令讓Linux和緩的執(zhí)行進(jìn)程關(guān)閉,然后立即重啟。在配置應(yīng)用程序的時候,這個命令很方便,在對配置文件修改后需要重啟進(jìn)程時就可以執(zhí)行此命令。
思考題9
9.1? 簡述在圖形方式下配置網(wǎng)卡的主要過程。
答:①從系統(tǒng)主菜單中選擇“程序”→“設(shè)置”→“系統(tǒng)設(shè)置”,雙擊“網(wǎng)絡(luò)設(shè)置”圖標(biāo),自動啟動“連接編輯器”。
②在連接編輯器對話框中,點(diǎn)擊“添加”按鈕,選擇對應(yīng)的網(wǎng)絡(luò)類型,給出網(wǎng)絡(luò)連接名稱,在“常規(guī)配置”、“有線連接”、“802.1x安全”、“Ipv4”、“Ipv6”等標(biāo)簽頁設(shè)置新連接的相關(guān)信息。
③上述參數(shù)配置好后,單擊“確定”按鈕,可使網(wǎng)絡(luò)參數(shù)設(shè)置生效。
9.2? 簡述ping,telnet和ftp命令的功能。
答:ping命令是一種最基本的測試命令,用它來測試本機(jī)系統(tǒng)是否能夠到達(dá)一臺遠(yuǎn)程主機(jī),以及到達(dá)的速率。該命令常用來測試本機(jī)與遠(yuǎn)程主機(jī)的通信路徑是否暢通。根據(jù)ping命令運(yùn)行的結(jié)果,可以確定接下來是測試網(wǎng)絡(luò)連通還是測試應(yīng)用程序。
telnet命令用于登錄并管理遠(yuǎn)程主機(jī)。它采用明文傳送報(bào)文,安全性不好,很多Linux服務(wù)器都不開放telnet服務(wù),而改用更安全的ssh方式了。它還可以確定遠(yuǎn)程服務(wù)的狀態(tài),如確定遠(yuǎn)程服務(wù)器的某個端口是否能訪問等。
Linux ftp命令的功能是用命令的方式來控制在本地機(jī)和遠(yuǎn)程機(jī)之間傳送文件。使用ftp提供的很多相關(guān)命令,可以從遠(yuǎn)程機(jī)器上下載文件,或者將文件傳輸?shù)竭h(yuǎn)程機(jī)器上,等等。
9.3? 電子郵件系統(tǒng)由哪幾部分組成?它們的功能是什么?
答:電子郵件系統(tǒng)由郵件用戶代理MUA和郵件傳送代理MTA兩部分組成。
MUA是一個在本地運(yùn)行的程序,它使用戶能通過一個友好界面來發(fā)送和接收郵件。允許用戶書寫、編輯、閱讀、保存、刪除、打印、回復(fù)和轉(zhuǎn)發(fā)郵件,同時還提供創(chuàng)建、維護(hù)和使用通訊錄,提取對方地址,信件自動回復(fù),以及建立目錄對來信進(jìn)行分類保存等功能。
MTA在后臺運(yùn)行,它將郵件通過網(wǎng)絡(luò)發(fā)送給對方主機(jī),并從網(wǎng)絡(luò)接收郵件,它有兩個功能:
① 發(fā)送和接收用戶的郵件。
② 向發(fā)信人報(bào)告郵件傳送的情況(已交付、被拒絕、丟失等)。
9.4? 什么是POP3協(xié)議?
答:TCP/IP專門設(shè)計(jì)了一個對電子郵件信箱進(jìn)行遠(yuǎn)程存取的協(xié)議,它允許用戶的郵箱安置在某個郵件服務(wù)器上,并允許用戶從他的個人計(jì)算機(jī)中對郵箱內(nèi)容進(jìn)行存取。這個協(xié)議就是POP(Post Office Protocol,郵局協(xié)議)。POP最初公布于1984年?,F(xiàn)在普遍采用的是它的第三個版本,即POP3,它在1993年成為Internet標(biāo)準(zhǔn)。
9.5? 簡述NFS的基本工作原理。
答:NFS是一種基于TCP/IP的,專門負(fù)責(zé)文件操作的應(yīng)用層軟件,它建立在XDR和RPC機(jī)制上。通過這些機(jī)制,NFS就可以屏蔽主機(jī)和網(wǎng)絡(luò)特性,為用戶提供完全透明的文件訪問功能。NFS采取客戶-服務(wù)器結(jié)構(gòu),客戶是訪問遠(yuǎn)程文件系統(tǒng)的主機(jī),此時遠(yuǎn)程文件系統(tǒng)就像本地文件系統(tǒng)的一部分;服務(wù)器是提供本地資源(目錄或文件)能夠被遠(yuǎn)程主機(jī)安裝并訪問的主機(jī)??蛻襞c服務(wù)器之間通過RPC機(jī)制進(jìn)行通信。
NFS是通過將NFS服務(wù)器的文件系統(tǒng)安裝到客戶機(jī)的文件系統(tǒng)上而得以實(shí)現(xiàn)的。NFS協(xié)議只負(fù)責(zé)文件的傳送工作,而不負(fù)責(zé)連接文件系統(tǒng)。NFS服務(wù)器可以導(dǎo)出一個或多個文件系統(tǒng),供客戶安裝。被導(dǎo)出的文件系統(tǒng)可以是整個磁盤分區(qū),或是一個子樹??梢酝ㄟ^配置NFS服務(wù)器來指定允許訪問導(dǎo)出文件系統(tǒng)的客戶及訪問權(quán)限。NFS允許客戶把一個遠(yuǎn)程文件系統(tǒng)安裝在自己文件系統(tǒng)的多個位置上。
9.6? 如何配置NFS服務(wù)器?
答:①手動方式:用文本編輯器(如vi)修改配置文件/etc/exports。/etc/exports文件的格式如下:
directory_to_export? NFS_client(permissions) ?[NFS_client(permissions)…]
其中,directory_to_export是要導(dǎo)出的文件系統(tǒng)或目錄的絕對路徑名;NFS_client是允許訪問該文件系統(tǒng)或目錄的客戶機(jī)名稱;permissions是該客戶機(jī)對此目錄的訪問權(quán)限,可選值為ro(只讀)和rw(讀、寫)。
然后,在命令提示符“# ”下執(zhí)行exportfs命令,使上述配置文件生效:
exportfs ?-a
②圖形界面:可以使用圖形界面下的netconf配置工具,在“服務(wù)器端任務(wù)”頁面中選擇“網(wǎng)絡(luò)文件系統(tǒng)(NFS)”進(jìn)行配置。
9.7? 網(wǎng)絡(luò)管理系統(tǒng)主要有哪些功能?
答:網(wǎng)絡(luò)管理系統(tǒng)應(yīng)具備下述主要功能:
① 配置管理。定義、識別、初始化、監(jiān)控網(wǎng)絡(luò)中的被管對象,改變被管對象的操作特性,報(bào)告被管對象的狀態(tài)。
② 故障管理。指與故障設(shè)備的監(jiān)測、恢復(fù)或故障排除等措施有關(guān)的網(wǎng)絡(luò)管理功能,其目的是保證網(wǎng)絡(luò)能夠提供可靠的服務(wù)。
③ 性能管理。以提高網(wǎng)絡(luò)性能為原則,保證在使用最少網(wǎng)絡(luò)資源和具有最小延時的前提下,網(wǎng)絡(luò)能提供可行、連續(xù)的通信能力。
④ 安全管理。保證網(wǎng)絡(luò)不被非法使用。
⑤ 計(jì)費(fèi)管理。記錄用戶使用網(wǎng)絡(luò)資源的情況,并收取相應(yīng)的費(fèi)用,同時統(tǒng)計(jì)網(wǎng)絡(luò)利用率。一般來說,前兩個功能是必須的。
9.8? 網(wǎng)絡(luò)安全威脅主要來自哪些方面?ISO安全模型包括哪些安全機(jī)制?
答:網(wǎng)絡(luò)安全威脅主要來自下述方面:① 仿冒用戶身份。② 信息流監(jiān)視。③ 篡改網(wǎng)絡(luò)信息。④ 否認(rèn)發(fā)出的信息。⑤ 授權(quán)威脅。⑥ 活動天窗(Trapdoor)。⑦ 拒絕服務(wù)。⑧ 非法使用。⑨ 信息泄露。⑩ 物理入侵。?完整性侵犯。?特洛伊木馬。?重發(fā)信息。此外,一個實(shí)際的網(wǎng)絡(luò)中往往存在一些安全缺陷,如路由器配置錯誤、存在匿名FTP、Telnet開放、密碼文件/etc/password缺乏安全保護(hù)等。
ISO安全模型包括的安全機(jī)制有:身份鑒別,訪問控制,數(shù)據(jù)加密,數(shù)據(jù)完整性,數(shù)字簽名,防重發(fā)和審計(jì)機(jī)制等。
9.9? Linux系統(tǒng)的安全設(shè)定包括哪些方面?
答:對Linux系統(tǒng)的安全設(shè)定包括取消不必要的服務(wù)、限制遠(yuǎn)程存取、隱藏重要資料、修補(bǔ)安全漏洞、采用安全工具及經(jīng)常性的安全檢查等。
9.10 什么是計(jì)算機(jī)病毒?它有何特征?對付病毒的常用方法有哪些?
答:計(jì)算機(jī)病毒是人為非法制造的帶破壞性的一個程序片段,它能攻擊合法的程序,使之受到感染。它可以隱藏在可執(zhí)行程序或數(shù)據(jù)文件中。當(dāng)帶毒程序運(yùn)行時,它們通過非授權(quán)方式入侵計(jì)算機(jī)系統(tǒng),依靠自身的強(qiáng)再生機(jī)制不斷進(jìn)行病毒體的擴(kuò)散。
計(jì)算機(jī)病毒主要有五個特征:① 病毒程序是人為編制的軟件,具有短小精悍的突出特點(diǎn)。② 病毒可以隱藏在可執(zhí)行程序或數(shù)據(jù)文件中。③ 可傳播性,具有強(qiáng)再生機(jī)制。④ 可潛伏性,具有依附于其他媒體寄生的能力。⑤ 病毒可在一定條件下被激活,從而對系統(tǒng)造成危害。
對付病毒的六條措施:① 購買、安裝正版軟件。② 不要隨意打開未知用戶發(fā)來的郵件。③ 安裝殺毒軟件,定期或不定期地運(yùn)行殺毒工具,并及時升級殺毒軟件版本。④ 及時下載操作系統(tǒng)的補(bǔ)丁軟件包。⑤ 系統(tǒng)重新安裝之前,最好將整個硬盤重新格式化,包括重新格式化引導(dǎo)區(qū)。⑥ 為文件和目錄設(shè)置最低權(quán)限。9.11 什么是防火墻?它如何發(fā)揮作用?主要類型是什么?
答:防火墻是一類安全防范措施的統(tǒng)稱,是計(jì)算機(jī)網(wǎng)絡(luò)系統(tǒng)總體安全策略的重要組成部分。防火墻通過特定的硬件和軟件系統(tǒng)在兩個網(wǎng)絡(luò)之間實(shí)現(xiàn)訪問控制策略,用來保護(hù)內(nèi)部的網(wǎng)絡(luò)不易受到來自Internet的侵害。
防火墻系統(tǒng)決定了哪些內(nèi)部服務(wù)可以被外界訪問,哪些外界人員可以訪問內(nèi)部的哪些服務(wù),以及哪些外部服務(wù)可以被內(nèi)部人員訪問。這樣,所有來往Internet的信息都必須經(jīng)過防火墻,并且接受它的檢查。由于Internet來客要訪問內(nèi)部網(wǎng)路,必須先透過防火墻,從而對來自Internet的攻擊有較好的免疫作用。
目前,防火墻有多種類型,但大致可以分為兩類: 一類基于包過濾(Packet filter)技術(shù),另一類基于代理服務(wù)(Proxy Service)技術(shù)。
?
總結(jié)
以上是生活随笔為你收集整理的Linux教程(第5版)孟庆昌版 课后答案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: idea和搜狗输入法快捷键冲突_ubun
- 下一篇: 公司通讯录