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