版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
·PAGE258·Linux教程(第4版)思考題11.1什么是軟件?軟件分為哪幾種?答:軟件是相對硬件而言的,它是與數(shù)據(jù)處理系統(tǒng)操作有關(guān)的計算機程序和相關(guān)數(shù)據(jù)等的總稱。軟件通??煞譃槿箢?,即系統(tǒng)軟件、應(yīng)用軟件和支撐軟件。1.2根據(jù)你的理解,簡述操作系統(tǒng)的定義。答:(學(xué)生可根據(jù)自己的理解予以表述,要符合下面定義所包含的基本點)操作系統(tǒng)是控制和管理計算機系統(tǒng)內(nèi)各種硬件和軟件資源、有效地組織多道程序運行的系統(tǒng)軟件(或程序集合),是用戶與計算機之間的接口。1.3操作系統(tǒng)的主要功能是什么?答:操作系統(tǒng)的主要功能包括存儲管理、進程和處理機管理、文件管理、設(shè)備管理和用戶接口服務(wù)。1.4獨立運行的多用戶系統(tǒng)和單用戶機器組成的計算機網(wǎng)絡(luò)之間有哪些共同點和不同點?答:共同點:①都是多用戶系統(tǒng),多個用戶可以同時上機使用計算機系統(tǒng);②系統(tǒng)中某些資源可以共享;③系統(tǒng)中各用戶可以彼此獨立的操作,互不干擾;④系統(tǒng)中的用戶可以交換信息。不同點:①分布性:獨立運行的多用戶系統(tǒng)是多個用戶同時在一臺主機上運行多道程序,而單用戶機器組成的計算機網(wǎng)絡(luò)是通過通信線路將地理上分散的多臺計算機連接在一起;②自治性:前者中所有用戶共享同一CPU、內(nèi)存、盤空間等資源,有統(tǒng)一任務(wù)調(diào)度,而后者共享不同計算機上的資源,松散耦合,不具備整個系統(tǒng)統(tǒng)一任務(wù)調(diào)度;③體系結(jié)構(gòu):前者是單機系統(tǒng),后者是多機系統(tǒng);④通信方式:前者中進程通過共享內(nèi)存、消息傳遞等進行通信,后者通過網(wǎng)絡(luò)互聯(lián)協(xié)議實現(xiàn)數(shù)據(jù)通信和資源共享目的;⑤容錯性:前者中某一部件出現(xiàn)故障將影響整個系統(tǒng),而后者不受影響,可靠性更高;⑥并行性:前者只能實現(xiàn)并發(fā)計算,而后者可以實現(xiàn)并行計算。1.5列出Linux系統(tǒng)的主要特點。答:Linux系統(tǒng)具有一系列顯著特點,包括:與UNIX系統(tǒng)兼容;自由軟件和源碼公開;性能高和安全性強;便于定制和再開發(fā);互操作性強;全面的多任務(wù)和真正的64位操作系統(tǒng)。1.6解釋核心版本和發(fā)行版本的含義。Linux2.1.1版和2.2.1版中,哪一個版本是穩(wěn)定的?答:核心版本主要是Linux的內(nèi)核,由Linus等人在不斷地開發(fā)和推出新的內(nèi)核。Linux內(nèi)核的官方版本由LinusTorvalds本人維護著。發(fā)行版本是各個公司推出的版本,它們與核心版本是各自獨立發(fā)展的。發(fā)行版本通常內(nèi)附有一個核心源碼,以及很多針對不同硬件設(shè)備的核心映像。所以發(fā)行版本是一些基于Linux核心的軟件包。核心版本的序號由三部分?jǐn)?shù)字構(gòu)成:major.minor.patchlevel。Linux2.1.1版的次版本號為奇數(shù),不一定很穩(wěn)定,相當(dāng)于測試版;而Linux2.2.1版的次版本號為偶數(shù),是穩(wěn)定的版本。1.7某用戶的硬盤空間是10GB,內(nèi)存是256MB。他想安裝普華LinuxV4.0系統(tǒng),是否可以?答:不行。因為該計算機的內(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ū),檢查安裝選項,安裝系統(tǒng),初始化設(shè)置。1.10什么是硬盤分區(qū)?一塊硬盤上可以有幾種類型的分區(qū)?各自可以有多少個?在它們上面能否安裝Linux系統(tǒng)?答:硬盤分區(qū)是對硬盤的一種格式化,格式化后才能使用硬盤保存各種信息。在創(chuàng)建分區(qū)時,就設(shè)置好硬盤的各項物理參數(shù),指定硬盤主引導(dǎo)記錄和引導(dǎo)記錄備份的存放位置。另外,分區(qū)時必須把硬盤的主分區(qū)設(shè)定為活動分區(qū),這樣才能夠通過硬盤啟動系統(tǒng)。
硬盤上的分區(qū)有三種類型:主分區(qū)、擴展分區(qū)和邏輯分區(qū)。一個硬盤最多只能有4個主分區(qū);擴展分區(qū)可以有1個;擴展分區(qū)中可以劃分出多個邏輯分區(qū)(事實上只能建立20多個)。Linux既可以安裝在主分區(qū)上,也可以安裝在邏輯分區(qū)上,但在擴展分區(qū)上不能直接安裝。1.11多啟動系統(tǒng)與虛擬機系統(tǒng)有何異同?利用VMWare安裝Linux的基本步驟是什么?答:多啟動系統(tǒng):一臺機器上同時存在多個操作系統(tǒng),每個操作系統(tǒng)單獨占用硬盤的一個分區(qū),每一時刻只能運行一個系統(tǒng),在系統(tǒng)切換時需要重新啟動機器。虛擬機系統(tǒng):在一臺機器上安裝多個操作系統(tǒng),它們在主系統(tǒng)(如Windows)的平臺上同時運行,就像標(biāo)準(zhǔn)Windows應(yīng)用程序那樣切換,而且每個操作系統(tǒng)都可以進行虛擬分區(qū)、配置而不影響真實硬盤的數(shù)據(jù)。利用VMWare安裝Linux的基本步驟:下載并安裝VMWare,創(chuàng)建虛擬機;安裝Linux操作系統(tǒng);安裝VMWareTools。1.12XWindow的體系結(jié)構(gòu)包括哪兩部分?答:XWindow的體系結(jié)構(gòu)包括兩個部分:客戶-服務(wù)器模型和X協(xié)議。1.13系統(tǒng)設(shè)置的主要功能是什么?訪問它的方法是怎樣的?答:系統(tǒng)設(shè)置是普華LinuxV4.0提供的一個集成的圖形化配置環(huán)境。在系統(tǒng)設(shè)置中,幾乎能找到所有的系統(tǒng)配置和管理工具。它可以方便有效地進行如下幾類操作:查看系統(tǒng)信息,執(zhí)行系統(tǒng)管理任務(wù)。配置系統(tǒng)中的基本硬件設(shè)備。定制個性化的桌面環(huán)境。管理鼠標(biāo)、鍵盤的定制。訪問系統(tǒng)設(shè)置,可在系統(tǒng)主菜單中選擇“程序”→“設(shè)置”→“系統(tǒng)設(shè)置”。1.14KDE桌面環(huán)境由哪幾部分組成?答:KDE桌面環(huán)境由面板和桌面兩部分組成。1)面板。屏幕底部是面板,也稱K面板??梢詮倪@里啟動應(yīng)用程序和在桌面上切換。它比Windows7任務(wù)欄的配置更靈活,功能更強。面板包括系統(tǒng)主菜單按鈕、經(jīng)常使用的應(yīng)用程序、桌面小程序圖標(biāo),以及顯示當(dāng)前運行應(yīng)用程序的任務(wù)條。2)桌面。屏幕中間的部分是KDE桌面,上面放置了一些常用的應(yīng)用程序和文件的圖標(biāo),在上面雙擊鼠標(biāo)左鍵可運行相應(yīng)程序或打開文件,也可以拖動它們,改變其位置,或者添加/刪除桌面圖標(biāo)。1.15試配置所用的顯示器。 答:(上機題)配置所用的顯示器的基本步驟是:單擊屏幕左下角的“開始”按鈕,選擇“程序”→“設(shè)置”→“系統(tǒng)設(shè)置”,彈出“系統(tǒng)設(shè)置”窗口,雙擊“硬件”欄中的“顯示和監(jiān)控”。然后在打開的顯示配置界面上,在“分辨率”欄中用滑動條設(shè)置屏幕分辨率,像素范圍從640×480到1920×1080。通??蛇x擇1024×768;“方向”選擇“普通”即可。在“刷新率”下拉列表中設(shè)定顯示器的刷新頻率,通常選擇“自動”即可。配置完成后單擊“應(yīng)用”按鈕。思考題22.1簡述Linux命令的一般格式。答:Linux命令的一般格式是:命令名[選項][參數(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)機幫助手冊頁。2.3公元2049年的元旦是星期幾?答:運行命令:cal12049或calJan2049從顯示結(jié)果可知,2049年的元旦是星期五。2.4什么是文件?Linux下主要有哪些不同種類的文件?答:文件(File)是被命名的相關(guān)信息的集合體。它通常存放在外存(如磁盤、光盤)上,可以作為一個獨立單位存放和實施相應(yīng)的操作(如打開、關(guān)閉、讀、寫等)。Linux系統(tǒng)中主要有以下類型的文件:普通文件、目錄文件、特別文件以及符號鏈接文件。2.5確定當(dāng)前工作目錄是什么?把工作目錄改到父目錄上,然后用長格式列出其中所有的內(nèi)容。答:(上機做)執(zhí)行命令:pwd在屏幕上顯示出當(dāng)前工作目錄的絕對路徑名。然后依次執(zhí)行命令:cd..ls-lai2.6在所用的Linux系統(tǒng)上,根目錄下含有哪些內(nèi)容?各自的功能是什么?答:執(zhí)行命令:cd/將當(dāng)前目錄改到根目錄 ls-l列出它的清單上機操作并參照本教材8.3.3節(jié)相關(guān)內(nèi)容,闡述根目錄下各目錄的基本功能。2.7說出下列每一項信息各對應(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.10cp,copy和mv命令有何異同?答:cp命令復(fù)制一個文件,而原文件保持不變,這樣文件個數(shù)就增加了;mv命令將文件從一個目錄移到另一個目錄中,該文件就從原目錄中消失,文件個數(shù)不變。不能直接用copy作為復(fù)制文件的命令。因為Linux系統(tǒng)提供的眾多命令都是有一定規(guī)則和限制的,cp是copy的縮寫,是Linux默認(rèn)的復(fù)制文件的命令,而copy并不是Linux的合法命令。2.11用什么命令能把兩個文件合并成一個文件?答:使用cat命令,例如:catfile1file2>file3將文件file1和file2合并后放入file3中。2.12如何確定系統(tǒng)中是否有ps命令?如果有,它的功能是什么?答:可以使用manps命令。如果系統(tǒng)中有ps命令,將顯示ps命令的聯(lián)機幫助手冊頁,列出有關(guān)該命令的完整說明;否則,將顯示出錯信息。ps命令的功能是查看當(dāng)前系統(tǒng)中運行的進程信息。2.13要確定在文件ABC中是否含有表示星期六或者星期日字符的行,應(yīng)使用什么命令?答:grep‘Saturday|Sunday’ABC或者grep-i‘saturday|sunday’ABC2.14如何對文件ABC分別按字典順序、月份順序、算術(shù)值進行排序?答:按字典順序排序sort-dABC按月份順序排序sort--MABC按算術(shù)值排序sort–nABC2.15目錄ABC下有兩個子目錄a1,b2,以及5個普通文件。如果想刪除ABC目錄,應(yīng)使用什么命令?答:(1)最簡單,但是風(fēng)險較大的方法:rm-rABC(2)如果5個普通文件分別在子目錄a1和b2之下,則可以使用以下命令:cdABC/a1rm*cd../b2rm*cd../..rmdir-pABC(3)如果5個普通文件并未全在兩個子目錄之下,則可以使用以下命令:cdABCrm-r*cd..rmdirABC2.16如何用一個命令行統(tǒng)計給定目錄中有多少個子目錄?答:設(shè)給定目錄名為DIR,則可以使用以下命令行:ls-ldDIR|wc-l2.17類似于DOS下的dir,del,type命令的Linux命令各是什么?答:分別是:ls,rm和cat。2.18試說明find,tee,gzip命令的功能。答:分別使用以下命令:manfind顯示該命令的功能是:查找Linux系統(tǒng)上的文件或目錄。mantee顯示該命令的功能是:從標(biāo)準(zhǔn)輸入設(shè)備讀取數(shù)據(jù),將其輸出到標(biāo)準(zhǔn)輸出設(shè)備,同時保存到指定的文件中。mangzip顯示該命令的功能是:對文件進行壓縮和解壓縮。思考題33.1進入和退出vi的方法有哪些?答:進入vi的方法:在系統(tǒng)提示符(設(shè)為$)下輸入命令vi和想要編輯(建立)的文件名,便可進入vi,如:$vifilename退出vi的方法:(1):wq 把編輯緩沖區(qū)的內(nèi)容寫到你編輯的文件中,退出編輯器,回到shell下。(其操作過程是,先輸入冒號“:”,再輸入命令wq。以下命令操作相同。)(2):ZZ(大寫字母ZZ) 僅當(dāng)做過修改時才將緩沖區(qū)內(nèi)容寫到文件上。(3):x 與:ZZ相同。(4):q! 強行退出vi。感嘆號(!)告訴vi,無條件退出,丟棄緩沖區(qū)內(nèi)容。3.2vi編輯器的工作方式有哪些?相互間如何轉(zhuǎn)換?答:vi編輯器有三種工作方式:命令方式、插入方式和ex轉(zhuǎn)義方式?!馭hell命令→vi的命令方式:輸入命令vi進入編輯器時,就處于vi的命令方式。●vi的命令方式→Shell命令:在vi的命令方式下使用退出命令,可以返回shell命令方式?!駐i命令方式→插入方式:通過輸入vi的插入命令(i)、附加命令(a)、打開命令(o)、替換命令(s)、修改命令(c)或取代命令(r)可以從命令方式進入到插入方式?!癫迦敕绞健鷙i命令方式:由插入方式回到命令方式的辦法是按Esc鍵(通常在鍵盤的左上角)?!駐i的命令方式→Ex轉(zhuǎn)義方式:在vi的命令方式下,輸入一個冒號(:),就進入Ex轉(zhuǎn)義方式?!馝x轉(zhuǎn)義方式→vi的命令方式:轉(zhuǎn)義命令執(zhí)行后,自動回到vi命令方式。3.3建立一個文本文件,如會議通知。(1)建立文件notes,并統(tǒng)計其大小。(2)重新編輯文件notes,加上一個適當(dāng)?shù)臉?biāo)題。(3)修改notes中開會的時間和地點。(4)刪除文件中第3行,然后予以恢復(fù)。答:上機題。體會vi編輯器的工作方式及相互轉(zhuǎn)換,熟悉基本命令的使用??蓞⒄找韵虏襟E做:(1)進入vi,建立一個空文件notes;(2)進入插入方式,編輯一個會議通知;(3)返回vi命令方式,保存編輯的內(nèi)容并退出vi;(4)在shell命令方式下,執(zhí)行wc命令,統(tǒng)計文件notes的大??;(5)利用vi,重新編輯文件notes,加上一個會議通知的標(biāo)題;(6)保存編輯內(nèi)容并退出vi,利用cat命令查看該文件的內(nèi)容;(7)重新編輯文件notes,修改其中開會的時間和地點;(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命令進行修改。答:上機題。體會在vi編輯方式下,光標(biāo)移動的方式和不同修改命令的功能。注意各命令的使用方式和光標(biāo)位置的移動。3.5在vi之下,上、下、左、右移動光標(biāo)的方式有哪些?答:參照本教材P78的圖3-2解答。3.6解釋下述vi命令的功能:20G 18| dM 6H d4B x cw 10cc 3rk5s
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如果希望進入vi后光標(biāo)位于文件的第10行上,應(yīng)輸入什么命令?答:設(shè)要編輯的文件名是abc,且該文件大于10行。在shell提示符后輸入以下命令:vi+10abc3.8不管文件中某一行被編輯了多少次,總能把它恢復(fù)成被編輯之前的樣子,應(yīng)使用什么命令?答:使用U(大寫字母)命令就能把當(dāng)前行恢復(fù)成被編輯之前的樣子。3.9要將編輯文件中所有的字符串s1全部用字符串s2替換,包括在一行中多次出現(xiàn)的字符串,應(yīng)使用什么命令格式?答:可以使用的命令格式是:g/s1/s//s2/g思考題44.1常用的shell有哪幾種?Linux系統(tǒng)中默認(rèn)的shell是什么?答:常用的有:Bourneshell(簡稱sh)、Cshell(簡稱csh)、Kornshell(簡稱ksh)和BourneAgainshell(簡稱bash)。Linux系統(tǒng)中默認(rèn)的shell是bash。4.2簡述shell的主要特點。bash有什么特點?答:shell具有如下主要特點:(1)命令組合,構(gòu)成新的命令;(2)提供了文件名擴展字符(通配符,如*、?、[]);(3)可以直接使用shell的內(nèi)置命令,而不需創(chuàng)建新的進程;(4)允許靈活地使用數(shù)據(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點:①命令行歷史。使用命令行歷史特性,可以恢復(fù)以前輸入的命令。②命令行編輯??梢岳镁庉嬈鳎ㄈ鐅i)修改已經(jīng)輸入的命令。③命令補全。能在輸入文件名的一部分之后,由系統(tǒng)自動填入剩余的部分。④別名擴展。能建立代表某些命令的名字。4.3執(zhí)行shell腳本的方式主要是哪些?答:執(zhí)行shell腳本的常用方式基本上有兩種:(1)以腳本名作為參數(shù)。其一般形式是:$bash腳本名[參數(shù)](2)將shell腳本的權(quán)限設(shè)置為可執(zhí)行,然后在提示符下直接執(zhí)行它。例如,設(shè)abcd是shell腳本文件,執(zhí)行步驟如下:$chmoda+xabcd$PATH=$PATH:·$abcd或者$·/abcd4.4將主提示符改為用戶的主目錄名,并予以輸出。答:$PS1="$HOME>"echo$PS1$exportPS14.5說明三種引號的作用有什么區(qū)別。答:在shell中引號分為三種:雙引號、單引號和倒引號。(1)由雙引號括起來的字符(除$、倒引號ˋ和轉(zhuǎn)義字符\外)均作為普通字符對待,而那三個字符仍保留其特殊功能。(2)由單引號括起來的所有字符都作為普通字符出現(xiàn)。(3)用倒引號括起來的字符串被shell解釋為命令行,在執(zhí)行時,shell會先執(zhí)行該命令行,并以執(zhí)行結(jié)果取代用倒引號括起的部分。另外,可以將一個命令的執(zhí)行結(jié)果賦給變量,即命令替換。4.6利用變量賦值方式,將字符串DOSfilec:>\$student\*顯示出來。答:$string=’DOSfilec:>\$student\*’ $echo$string4.7顯示環(huán)境變量的設(shè)置情況,說明各自的意義。答:執(zhí)行env命令,在屏幕上將會顯示出當(dāng)前環(huán)境下的所有環(huán)境變量及其值。讀者可以依據(jù)所用機器上實際顯示的信息,進行說明。常用的環(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=echowhile[$count-gt0]docmd="$cmd\$$count"count=`expr$count-1`doneeval$cmd答:該腳本的功能是:逆向輸出用戶在命令行上提供的各個參數(shù)。例如,設(shè)該腳本名是ABC,執(zhí)行該腳本的命令行是:$ABCapplebigcatdog則結(jié)果輸出是:dogcatbigapple4.9編寫一個shell腳本,它把第二個位置參數(shù)及其以后的各個參數(shù)指定的文件復(fù)制到第一個位置參數(shù)指定的目錄中。答:上機實踐題。參考腳本如下: #!/bin/bash count=$#if[-d"$1"] then n=2dir=$1while[$n–le$count] do if[-f$2]thencp$2$direlseecho"$2isnotanordinaryfile."fishift ((n=n+1)) done elseecho"$1isnotadirectory."fi4.10編寫一個shell腳本,顯示當(dāng)天日期,查找給定的某用戶是否在系統(tǒng)中工作。如果在系統(tǒng)中,就發(fā)一個問候給他。答:上機實踐題。參考腳本如下: #!/bin/bash date echo"Inputausernameforsearching" readname ifwho|grep"$name" then echo"Lucky,thereis$nameinmysystemnow." echo"Hi,howareyou!">/var/spool/mail/$name elseecho"Unlucky,thereisnot$nameinmysystem." fi4.11答:上機實踐題。參考腳本如下: #!/bin/bash count=$#if[-d"$1"] then cd$1n=2 while[$n–le$count] do if[-f$2]thencat$2elseecho"Sorry,cannotdisplay$2."fishift ((n=n+1)) done elseecho"$1isnotadirectory."fi4.12利用for循環(huán)將當(dāng)前目錄下的.c文件移到指定的目錄下,并按文件大小排序,顯示移動后指定目錄的內(nèi)容。答:上機實踐題。參考腳本如下: #!/bin/bash echo"Inputthenameofadirectory." readdirif[-d$dir] thenfornamein*.c do mv$namedir donels-Sdir lsdir elseecho"Sorry!$dirisnotadirectory." fi4.13利用數(shù)組形式存放10個城市的名字,然后利用for循環(huán)把它們打印出來。答:上機實踐題。參考腳本如下:#!/bin/bashcity=(BeijingShanghaiTianjinGuangzhouChongqingHangzhouNanjingShenyangTaiyuanJinan)foriin${city[*]}doecho$idone4.14編寫一個shell腳本,求費波納奇數(shù)列的前10項及總和。答:上機實踐題。參考腳本如下: #!/bin/bash fib[1]=1fib[2]=1 n=3 ((sum=fib[1]+fib[2])) while[$n–lt10] 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$sum4.15下述表達式的作用是什么?${name[*]} ${name[@]} ${name#*/}${name%%.*} ${#name[*]} ${name:-Hello}答:${name[*]}和${name[@]}都表示數(shù)組name中所有非空元素的值,每個元素的值用空格分開。${name#*/}如果name值的開頭包含模式*/,那么該表達式的值就是name中去掉最少匹配*/部分后的結(jié)果;否則,就是name的值。${name%%.*}如果name值的末尾包含.*,那么該表達式的值就是name中去掉最多匹配.*部分后的結(jié)果;否則,就是name的值。${#nane[*]}的值是數(shù)組name中已經(jīng)設(shè)置的元素的個數(shù)。${name:-Hello}如果name的值為空,則整個表達式的值等于給定的字符串Hello,name保持不變;否則,整個表達式的值等于name的值,name保持不變。4.16答:上機實踐題。$history40$!-54.17定義一個別名命令,它等價的功能是:顯示當(dāng)前日期及工作目錄,并列出有多少用戶在系統(tǒng)上工作。答:上機實踐題。$aliascmd=’date;pwd;who|wc–l’$cmd4.18設(shè)計一個程序cuts,它由標(biāo)準(zhǔn)輸入讀取數(shù)據(jù),獲取由第一個參數(shù)n和第二個參數(shù)m所限定范圍的數(shù)據(jù),n和m都是整數(shù),即從輸入的字符串中抽取第n個字符至第m個字符之間的所有字符(包括這兩個字符)。例如:$cuts1114thisisatestofcutsprogram(輸入)test(顯示結(jié)果)答:上機實踐題。參考腳本如下:#!/bin/bashread-p"Inputastring:"strecho$str|cut-c$1-$2思考題55.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什么是進程?什么是線程?Linux系統(tǒng)中的進程有哪些狀態(tài)?如何獲取系統(tǒng)中各進程的狀態(tài)?答:簡單地說,進程就是程序的一次執(zhí)行過程。具體地說,進程是具有獨立功能的程序關(guān)于某個數(shù)據(jù)集合上的一次運行活動,是系統(tǒng)進行資源分配和調(diào)度的一個獨立單位。線程(Thread)是進程中實施調(diào)度和分派的基本單位。在Linux系統(tǒng)中,進程有五種狀態(tài):①運行態(tài)(TASK_RUNNING)。②可中斷等待態(tài)(TASK_INTERRUPTIBLE)。③不可中斷等待態(tài)(TASK_UNINTERRUPTIBLE)。④停止態(tài)(TASK_STOPPED)。⑤僵死態(tài)(TASK_ZOMBIE)。利用命令psaux可以獲取系統(tǒng)中各進程的狀態(tài)。5.4Linux系統(tǒng)中進程有哪兩種模式?各有何特點?答:Linux系統(tǒng)中進程的運行模式劃分為用戶模式和內(nèi)核模式。在內(nèi)核模式下運行的進程可以執(zhí)行機器的特權(quán)指令,該進程的運行不受用戶的干預(yù),即使是root用戶也不能干預(yù)內(nèi)核模式下進程的運行。用戶模式中執(zhí)行的進程,可以通過系統(tǒng)調(diào)用或在出現(xiàn)中斷、異常時進入內(nèi)核模式。5.5Linux系統(tǒng)中進程控制塊的作用是什么?它與進程有何關(guān)系?答:Linux系統(tǒng)中的每個進程都有一個名為task_struct的數(shù)據(jù)結(jié)構(gòu),它相當(dāng)于“進程控制塊”,包含了進程的描述信息和控制信息,是進程組成中最關(guān)鍵的部分。每個進程有唯一的進程控制塊;操作系統(tǒng)根據(jù)它對進程實施控制和管理,是進程存在的唯一標(biāo)志。5.6Linux系統(tǒng)如何執(zhí)行進程調(diào)度?答:Linux系統(tǒng)的進程調(diào)度涉及調(diào)度方式、調(diào)度策略和調(diào)度時機三個方面。Linux內(nèi)核的調(diào)度方式基本上采用“搶占式優(yōu)先級”方式。Linux系統(tǒng)針對不同類別的進程提供了三種不同的調(diào)度策略,即:SCHED_FIFO(適合于實時進程)、SCHED_RR(對應(yīng)“時間片輪轉(zhuǎn)法”)以及SCHED_OTHER(適合于交互式的分時進程)。核心進行進程調(diào)度的時機有以下幾種情況:(1)當(dāng)前進程調(diào)用系統(tǒng)調(diào)用nanosleep()或者pause(),使自己進入睡眠狀態(tài),主動讓出一段時間的CPU使用權(quán);(2)進程終止,永久地放棄對CPU的使用;(3)在時鐘中斷處理程序執(zhí)行過程中,發(fā)現(xiàn)當(dāng)前進程連續(xù)運行的時間過長;(4)當(dāng)喚醒一個睡眠進程時,發(fā)現(xiàn)被喚醒的進程比當(dāng)前進程更有資格運行;(5)一個進程通過執(zhí)行系統(tǒng)調(diào)用來改變調(diào)度策略或者降低自身的優(yōu)先權(quán),從而引起立即調(diào)度。5.7shell的基本工作過程是怎樣的?答:shell命令解釋程序不屬于內(nèi)核部分,而是在核心之外,以用戶態(tài)方式運行。其基本工作流程是:①讀取用戶由鍵盤輸入的命令行。②判斷命令是否正確,且將命令行的其他參數(shù)改造為系統(tǒng)調(diào)用exec()內(nèi)部處理所要求的形式。③終端進程調(diào)用fork()建立一個子進程。⑤當(dāng)調(diào)度子進程運行時,它調(diào)用exec()根據(jù)文件名(即命令名)到目錄中查找有關(guān)文件(可執(zhí)行文件),調(diào)入內(nèi)存,更換自己的映像,然后執(zhí)行這個程序(即執(zhí)行這條命令)。⑥如果命令行末尾有&(后臺命令符號),則終端進程不執(zhí)行系統(tǒng)調(diào)用wait4(),而是立即發(fā)提示符$,讓用戶輸入下一個命令,轉(zhuǎn)①;如果命令末尾沒有&,則終端進程要一直等待。當(dāng)子進程(即執(zhí)行該命令程序的進程)完成處理后終止,向父進程(終端進程)報告。此時,終端進程被喚醒,在做必要的判別等工作后,終端進程發(fā)提示符$,讓用戶輸入新的命令,重復(fù)上述處理過程。5.8Linux系統(tǒng)一般采用哪種文件系統(tǒng)?其構(gòu)造形式如何?答:目前,Linux主要使用的文件系統(tǒng)是ext2、ext3和ext4。ext3是ext2的升級版本,加入了記錄數(shù)據(jù)的日志功能。ext4是ext3文件系統(tǒng)的后繼版本,是擴展日志式文件系統(tǒng)。ext2文件系統(tǒng)中的文件信息都保存在數(shù)據(jù)塊中。ext2文件系統(tǒng)將邏輯塊劃分成塊組,每個塊組重復(fù)保存著一些有關(guān)整個文件系統(tǒng)的關(guān)鍵信息以及實際的文件和目錄的數(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é)點位示圖、索引節(jié)點表和數(shù)據(jù)塊。位于每個塊組的最前面,其中超級塊中包含有文件系統(tǒng)本身的大小和形式的基本信息,文件系統(tǒng)管理員可以利用這些信息來使用和維護文件系統(tǒng)。5.10什么是索引節(jié)點?索引節(jié)點主要有哪些內(nèi)容?它與文件有何關(guān)系?答:索引節(jié)點又被稱為I節(jié)點,是一個結(jié)構(gòu)數(shù)組,其中包含有關(guān)該文件的全部管理信息。索引節(jié)點主要包括以下內(nèi)容:文件模式,文件屬主信息,文件大小,時間戳,文件鏈接計數(shù),數(shù)據(jù)塊索引表等。ext2文件系統(tǒng)的索引節(jié)點起著文件控制塊的作用,利用這種數(shù)據(jù)結(jié)構(gòu)可對文件進行控制和管理。每個文件都只有一個索引節(jié)點。5.11為什么要設(shè)立虛擬文件系統(tǒng)(VFS)?它與實際文件系統(tǒng)的關(guān)系是怎樣的?答:Linux系統(tǒng)可以支持多種文件系統(tǒng),為此,必須使用一種統(tǒng)一的接口,這就是虛擬文件系統(tǒng)(VFS)。通過VFS將不同文件系統(tǒng)的實現(xiàn)細(xì)節(jié)隱藏起來,從外部看上去所有的文件系統(tǒng)都是一樣的。VFS是建立在具體文件系統(tǒng)之上的,VFS必須管理所有的文件系統(tǒng)。用戶程序(進程)通過有關(guān)文件系統(tǒng)操作的系統(tǒng)調(diào)用進入系統(tǒng)空間,然后經(jīng)由VFS才可使用Linux系統(tǒng)中具體的文件系統(tǒng)。5.12Linux系統(tǒng)通常為什么要把硬盤劃分為多個文件系統(tǒng)?簡述文件系統(tǒng)安裝的基本過程。答:一個硬盤上可以同時存在多個文件系統(tǒng),每個文件系統(tǒng)占據(jù)硬盤的一個獨立分區(qū)。Linux文件系統(tǒng)可以根據(jù)需要隨時裝卸,從而實現(xiàn)文件存儲空間的動態(tài)擴充和信息安全。在系統(tǒng)初啟時,只有根文件系統(tǒng),其他的文件系統(tǒng)可以根據(jù)需要作為子系統(tǒng)動態(tài)地安裝到主系統(tǒng)中,已安裝的子文件系統(tǒng)也可從整個文件系統(tǒng)上卸下來,恢復(fù)安裝前的獨立狀態(tài)。文件系統(tǒng)安裝的基本過程是:超級用戶可以使用命令mount將新文件系統(tǒng)安裝到主文件系統(tǒng)中。該命令帶有3個主要參數(shù):要安裝的文件系統(tǒng)類型、該文件系統(tǒng)所在分區(qū)名和安裝新文件系統(tǒng)的路徑名(即安裝點)。執(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)安裝點的VFS索引節(jié)點,并且在同一目錄下不能安裝多個文件系統(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é)點就一直保存在VFS索引節(jié)點緩存中。5.13Linux系統(tǒng)采用哪兩種內(nèi)存管理技術(shù)?各自的基本實現(xiàn)思想是什么?答:Linux系統(tǒng)采用交換和請求分頁兩種內(nèi)存管理技術(shù)。請求分頁存儲管理技術(shù)是在簡單分頁存儲技術(shù)基礎(chǔ)上發(fā)展起來的,它的基本思想是:當(dāng)進程運行時,不必把整個進程映像都放在內(nèi)存中,只需在內(nèi)存保留當(dāng)前用到的那一部分頁面。當(dāng)進程訪問到某些尚未在內(nèi)存的頁面時,就由核心把這些頁面裝入內(nèi)存。這種策略使進程的虛擬地址空間映射到機器的物理空間時具有更大的靈活性,通常允許進程的大小可大于可用內(nèi)存的總量,并允許更多進程同時在內(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)核的交換守護進程kswapd完成的。5.14何謂虛擬存儲器?Linux系統(tǒng)如何支持虛存?答:所謂虛擬存儲器是用戶能作為可編址內(nèi)存對待的虛擬存儲空間,它使用戶邏輯存儲器與物理存儲器分離,是操作系統(tǒng)給用戶提供的一個比真實內(nèi)存空間大得多的地址空間。Linux存儲管理采用請求分頁技術(shù),請求分頁提供虛擬存儲器。它的基本思想是:當(dāng)我們要執(zhí)行一個程序時才把它換入內(nèi)存;但并不把全部程序都換入內(nèi)存,而是用到哪一頁時才換入它。這樣,就減少了對換時間和所需內(nèi)存數(shù)量,允許增加程序的道數(shù)。5.15Linux系統(tǒng)中交換空間為何采用連續(xù)空間?答:因為進程使用交換空間是臨時性的,速度是關(guān)鍵性問題,系統(tǒng)一次進行多個盤塊I/O傳輸比每次一塊、多次傳輸?shù)乃俣纫?,所以核心在交換設(shè)備上是分配一片連續(xù)空間,而不管碎片的問題。5.16Linux為什么要采用三級頁表?該機制如何工作?答:現(xiàn)在地址碼通常采用32位,這樣,每個進程的虛擬存儲空間可達4GB。而Linux系統(tǒng)中頁面的大小為4KB,因此進程虛擬存儲空間要劃分為220(1M)個頁面。如果直接用頁表描述這種映射關(guān)系,那么每個進程的頁表就要有220(1M)個表項。很顯然,用大量的內(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)的表項,該表項指向相應(yīng)的PMD。②以線性地址中第2個位段作為下標(biāo),在PMD中找到相應(yīng)的表項,該表項指向相應(yīng)的PT。③以線性地址中第3個位段作為下標(biāo),在PT中找到相應(yīng)的表項,該表項指向相應(yīng)的物理頁面(即該物理頁面的起始地址)。④線性地址中的最低位段是物理頁面內(nèi)的相對位移量,此位移量與該物理頁面的起始地址相加就得到相應(yīng)的物理地址。5.17Linux信號機制是如何實現(xiàn)進程通信的?答:信號機制是在軟件層次上對中斷機制的一種模擬。異步進程可以通過彼此發(fā)送信號來實現(xiàn)簡單通信。系統(tǒng)預(yù)先規(guī)定若干個不同類型的信號,各表示發(fā)生了不同的事件,每個信號對應(yīng)一個編號。運行進程當(dāng)遇到相應(yīng)事件或者出現(xiàn)特定要求時,就把一個信號寫到相應(yīng)進程task_struct結(jié)構(gòu)的signal位圖中。接收信號的進程在運行過程中要檢測自身是否收到了信號,如果已收到信號,則轉(zhuǎn)去執(zhí)行預(yù)先規(guī)定好的信號處理程序。處理之后,再返回原先正在執(zhí)行的程序。5.18管道文件如何實現(xiàn)兩個進程間的通信?答:管道文件是連接兩個命令的一個打開文件。一個命令向該文件中寫入數(shù)據(jù),稱作寫者;另一個命令從該文件中讀出數(shù)據(jù),稱作讀者。系統(tǒng)自動處理二者之間的同步、調(diào)度和緩沖。利用管道文件可以實現(xiàn)兩個或多個進程間的直接通信。5.19Linux系統(tǒng)中設(shè)備驅(qū)動分層結(jié)構(gòu)是怎樣的?如何實現(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é)對用戶隱藏起來,實現(xiàn)用戶程序與設(shè)備無關(guān)性。5.20Linux系統(tǒng)中可安裝模塊的思想是什么?答:可安裝模塊是可以在系統(tǒng)運行時動態(tài)地安裝和拆卸的內(nèi)核模塊。利用這個機制,可以根據(jù)需要在不必對內(nèi)核重新編譯連接的條件下,將可安裝模塊動態(tài)插入運行中的內(nèi)核,成為其中一個有機組成部分;或者從內(nèi)核卸載已安裝的模塊。設(shè)備驅(qū)動程序或者與設(shè)備驅(qū)動緊密相關(guān)的部分(如文件系統(tǒng))都是利用可安裝模塊實現(xiàn)的。5.21什么是中斷?中斷的一般處理過程是什么?答:所謂中斷是指CPU對系統(tǒng)發(fā)生的某個事件作出的一種反應(yīng)——CPU暫停正在執(zhí)行的程序,保留現(xiàn)場后自動地執(zhí)行相應(yīng)的處理程序,處理完該事件后,如被中斷進程的優(yōu)先級最高,則返回斷點繼續(xù)執(zhí)行被“打斷”的程序。中斷的一般處理過程:保存被中斷程序的現(xiàn)場,分析中斷原因,轉(zhuǎn)入相應(yīng)處理程序進行處理,恢復(fù)被中斷程序現(xiàn)場(即中斷返回)。5.22Linux系統(tǒng)怎樣處理系統(tǒng)調(diào)用?答:Linux的系統(tǒng)調(diào)用是通過中斷指令I(lǐng)NT0x80實現(xiàn)的。當(dāng)CPU執(zhí)行到中斷指令I(lǐng)NT0x80時,硬件就作出一系列響應(yīng),其動作與中斷響應(yīng)相同。CPU穿過陷阱門,從用戶空間進入系統(tǒng)空間。相應(yīng)地,進程的上下文從用戶堆棧切換到系統(tǒng)堆棧。接著運行內(nèi)核函數(shù)system_call()。首先,進一步保存各寄存器的內(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)處理。如果本進程收到信號,則對信號作相應(yīng)處理。最后進程從系統(tǒng)空間返回到用戶空間。思考題66.1gcc編譯過程一般分為哪幾個階段?各階段的主要工作是什么?答:gcc編譯過程可以分為4個階段,包括預(yù)處理(Preprocessing)、編譯(Compiling)、匯編(Assembling)和連接(Linking)?!耦A(yù)處理程序讀取C語言源文件,對其中以“#”開頭的指令(偽指令)和特殊符號進行處理。●編譯程序?qū)︻A(yù)處理之后的輸出文件進行詞法分析和語法分析,試圖找出所有不符合語法規(guī)則的部分,并根據(jù)問題的大小做出不同處理。在確定各成分都符合語法規(guī)則后,將其“翻譯”為功能等價的中間代碼表示或者匯編代碼?!駞R編程序把匯編語言代碼翻譯成目標(biāo)機器代碼?!襁B接程序要解決外部符號訪問地址問題,也就是將一個文件中引用的符號(如變量或函數(shù)調(diào)用)與該符號在另外一個文件中的定義連接起來,從而使有關(guān)的目標(biāo)文件連成一個整體,最終成為可被操作系統(tǒng)執(zhí)行的可執(zhí)行文件。6.2對C語言程序進行編譯時,針對以下情況應(yīng)使用的編譯命令行是什么?(1)只生成目標(biāo)文件,不進行連接。(2)在預(yù)處理后的輸出中保留源文件中的注釋。(3)將輸出寫到file指定的文件中。(4)指示編譯程序在目標(biāo)代碼中加入供調(diào)試程序gdb使用的附加信息。(5)連接時搜索由library命名的庫。答:(1)只生成目標(biāo)文件,不進行連接:gcc-c源文件名(2)在預(yù)處理后的輸出中保留源文件中的注釋:gcc-C源文件名(3)將輸出寫到file指定的文件中:gcc-ofile源文件名(4)指示編譯程序在目標(biāo)代碼中加入供調(diào)試程序gdb使用的附加信息:gcc-g源文件名(5)連接時搜索由library命名的庫:gcc-llibrary源文件名6.3通常,程序中的錯誤按性質(zhì)分為哪三種?答:程序中的錯誤按其性質(zhì)可分為以下三種:(1)編譯錯誤,即語法錯誤。(2)運行錯誤。(3)邏輯錯誤。6.4gdb主要幫助用戶在調(diào)試程序時完成哪些工作?答:gdb主要幫助用戶在調(diào)試程序時完成四方面的工作:(1)啟動程序,可以按用戶要求影響程序的運行行為。(2)使運行程序在指定條件處停止。(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>intmain(intargc,char**argv){char*p;inti;p=malloc(30);strcpy(p,"not30bytes");printf("p=<%s>\n",p);if(argc==2){if(strcmp(argv[1],"-b")==0)p[50]='a';elseif(strcmp(argv[1],"-f")==0){free(p);p[0]='b';}}/*free(p);*/return0;}答:這是上機操作題。先利用gcc-gbadprog.c-obadprog對源文件進行編譯;通過編譯后,運行badprog文件,看看出現(xiàn)什么問題;然后利用gdb工具調(diào)試該程序。參考書中6.2.6節(jié)的示例,依據(jù)調(diào)試時實際顯示的即時信息,分析可能的原因(注意數(shù)組大?。。?,使用相應(yīng)的命令一步步調(diào)試,直至找出問題根源;然后予以改正,再重新編譯、運行。6.6調(diào)試下面的程序:/*callstk.c有3個函數(shù)調(diào)用深度的調(diào)用鏈*/#include<stdio.h>#include<stdlib.h>intmake_key(void);intget_key_num(void);intnumber(void);intmain(void){intret=make_key();printf("make_keyreturns%d\n",ret);exit(EXIT_SUCCESS);}intmake_key(void){intret=get_key_num();returnret;}intget_key_num(void){intret=number();returnret;}intnumber(void){return10;}答:這是上機操作題。體會函數(shù)調(diào)用的層次關(guān)系。6.7GNUmake的工作過程是怎樣的?答:GNUmake的工作過程是:①依次讀入各makefile文件;②初始化文件中的變量;③推導(dǎo)隱式規(guī)則,并分析所有規(guī)則;④為所有的目標(biāo)文件創(chuàng)建依賴關(guān)系鏈;⑤根據(jù)依賴關(guān)系和時間數(shù)據(jù),確定哪些目標(biāo)文件要重新生成;⑥執(zhí)行相應(yīng)的生成命令。6.8makefile的作用是什么?其書寫規(guī)則是怎樣的?答:makefile文件是make命令必備的一個文本形式的數(shù)據(jù)庫文件,它定義了一系列規(guī)則,記錄了文件之間的依賴關(guān)系及在此依賴關(guān)系基礎(chǔ)上所應(yīng)執(zhí)行的命令序列,即定義了一系列規(guī)則來指定哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯等。此外,還可以有變量定義、注釋等。makefile的通用形式如下所示:目標(biāo)文件:[相依文件…]<tab>命令1[#注釋]…<tab>命令n[#注釋]其書寫規(guī)則是:依賴行從一行的開頭開始書寫。各命令行單獨占一行,每個命令行的第一個字符必須是制表符<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.ob.oc.od.oassmb.o gcca.ob.oc.od.oassmb.o-L/home/user/lib-lm–oproga.o:a.c gcc–ca.cb.o:b.cdefs.h gcc-cb.cc.o:c.c gcc-cc.cd.o:d.cdefs.h gcc-cd.cassmb.o:assmb.s as-oassmb.oassmb.sclean: rmprog*.o思考題77.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)核部分。相同點:系統(tǒng)調(diào)用和庫函數(shù)都是由程序代碼構(gòu)成,二者調(diào)用方式相同,都需要在調(diào)用時傳送參數(shù),實參的個數(shù)、出現(xiàn)的次序和實參的類型與原型說明中形參表的設(shè)計相同。區(qū)別:庫函數(shù)調(diào)用依賴于所運行的用戶環(huán)境,程序調(diào)用庫函數(shù)時,它運行的目標(biāo)代碼是屬于程序的,程序處于“用戶態(tài)”執(zhí)行;而系統(tǒng)調(diào)用的使用不依賴于它運行的用戶環(huán)境,是操作系統(tǒng)內(nèi)核提供的低層服務(wù),系統(tǒng)調(diào)用時所執(zhí)行的代碼是屬于內(nèi)核的,程序處于“核心態(tài)”執(zhí)行。庫函數(shù)的調(diào)用最終還是要通過系統(tǒng)調(diào)用來實現(xiàn),庫函數(shù)一般執(zhí)行一條指令,該指令(操作系統(tǒng)陷阱operatingsystemtrap)將進程執(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ù)、出現(xiàn)的順序和實參的類型應(yīng)與原型說明中形參表的設(shè)計相同。7.3編寫一個程序,把一個文件的內(nèi)容復(fù)制到另一個文件上,即實現(xiàn)簡單的copy功能。要求:只用open(),read(),write()和close()系統(tǒng)調(diào)用,程序的第一個參數(shù)是源文件,第二個參數(shù)是目的文件。答:(上機題)該程序?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>#defineSIZE512intmain(intargc,charconst*argv[]){intfd1,fd2,N;charbuf[SIZE];if(argc<3){fprintf(stderr,"usage:%sorigindestination\n",argv[0]);return1;}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,"Cannotopenafile!\n"); return1;}while((N=read(fd1,buf,SIZE))>0)write(fd2,buf,N);//從源文件讀,寫入目的文件,實現(xiàn)copy功能close(fd1);close(fd2);return0;}7.4編寫一個程序,它把給定的正文插入到文件的任意指定位置,并輸出最后結(jié)果。答:(上機題)該程序?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>#defineSIZE512intmain(intargc,charconst*argv[]){intPOS;intfd,fdtmp,n;charstr[SIZE];charbuf[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,"Cannotopenafile!\n"); return1;}truncate("tmp.txt",0);//清空tmp.txtprintf("originalfileis:\n");//輸出插入前的文件內(nèi)容lseek(fd,0,SEEK_SET);while((n=read(fd,buf,SIZE))>0)write(STDOUT_FILENO,buf,n);printf("inputposition:");scanf("%d",&POS);//輸入插入位置printf("inputstring:");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)容寫回,實現(xiàn)插入功能while((n=read(fdtmp,buf,SIZE))>0){write(fd,buf,n);}printf("AfterInsert:\n");//輸出插入后的文件內(nèi)容lseek(fd,0,SEEK_SET);while((n=read(fd,buf,SIZE))>0)write(STDOUT_FILENO,buf,n);close(fd);close(fdtmp);return0;}7.5編寫一個程序,它首先打開一個文件,然后利用fork()創(chuàng)建一個子進程;隨后,當(dāng)父進程運行時先執(zhí)行wait();父子進程都打印自己和其父進程的ID號;并且,二者都向該文件寫入(利用write)一條信息,表明是在哪個進程中。試問:如果沒有wait調(diào)用,會出現(xiàn)什么情況?答:(上機題)該程序?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>intmain(intargc,char*argv[]){intfile;pid_tpid;charbuf_child[]="I’mthechildprocess.\n";charbuf_father[]="I’mthefatherprocess.\n";if((file=open(argv[1],O_CREAT|O_RDWR,S_IRWXU))<0){//打開文件,文件名由argv[1]提供 perror("openargv[1]"); exit(EXIT_FAILURE);}if((pid=fork())<0){ fprintf(stderr,"%s:forkofchildfailed:%s\n",argv[0],strerror(errno)); exit(1);};if(pid==0){//子進程printf("\n\nInthchildprocess\n");printf("CurrentProcessID:%d\n",getpid());printf("ParentProcessID:%d\n",getppid());write(file,buf_child,strlen(buf_child));}elseif(pid>0){//父進程wait(NULL);//等待子進程完成printf("\n\nInthefatherprocess\n");printf("CurrentProcessID:%d\n",getpid());printf("Parent:ProcessID%d\n",getppid());write(file,buf_father,strlen(buf_father));}}利用系統(tǒng)調(diào)用wait()可以實現(xiàn)父子進程的同步,即:保證子進程輸出在前,父進程輸出在后。如果沒有wait(),則輸出結(jié)果的先后順序會有隨機性,那樣,每次運行的結(jié)果都有可能不同。7.6編寫一個程序,盡可能多地輸出有關(guān)當(dāng)前進程的信息:PID、PPID、打開文件、當(dāng)前目錄、nice值等。請簡要說明,如何確定哪些文件是打開的?如何確定多個文件描述符表示同一個文件?答:(上機題)該程序?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>intmain(intargc,char*argv[]){intfile1,file2;pid_tpid,ppid;charstr[20],dir[100]="/proc/";charsubdir[20]="/fd";if(argc<3){ fprintf(stderr,"usage:%sfile1file2\n",argv[0]); return1;}if((file1=open(argv[1],O_CREAT|O_RDWR,S_IRWXU))<0){perror("openargv[1]"); exit(EXIT_FAILURE);}if((file2=open(argv[2],O_CREAT|O_RDWR,S_IRWXU))<0){perror("openargv[2]"); exit(EXIT_FAILURE);}pid=getpid();ppid=getppid();printf("CurrentProcess:%d\n",pid);printf("ParentProcess:%d\n",ppid);printf("Niceofcurrentprocess:%d\n",getpriority(PRIO_PROCESS,pid));system("echocurrentdirectoryis`pwd`");sprintf(str,"%d",pid);//將pid轉(zhuǎn)換為字符串,保存在str中strcat(dir,str);strcat(dir,subdir);//拼接字符串,形成如下形式的/proc/3724/fd,設(shè)3724為getpid()返回值chdir(dir);printf("Thenumberoffilestobeopened:\n");system("ls|wc-l");//統(tǒng)計打開的文件數(shù)量return0;}利用getpid()獲取當(dāng)前進程的id,假設(shè)為3724。然后進入目錄/proc/3724/fd,利用命令ls-l可以看出該進程打開了哪些文件。系統(tǒng)為每個進程自動打開三個標(biāo)準(zhǔn)文件(即標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和錯誤輸出),其文件描述符分別為0,1和2,本題給出的參考代碼中,打開了兩個文件,這樣可以更加清楚的看到進程打開的所有文件。如果文件描述符后面->所指向的文件名稱一致,則代表這些文件描述符對應(yīng)同一個文件。運行本代碼時,可以讓文件1和文件2這兩個參數(shù)相同,即同一個文件打開兩次,能夠看到不同的文件描述符對應(yīng)了同一個文件的情況。另外,root用戶還可以使用lsof命令查看某進程所打開的文件信息:#lsof–p進程號7.7編寫一個管道程序,它所創(chuàng)建的管道等價于下面的shell管道:$echogoodmorning|seds/good/hi/g該程序的實現(xiàn)過程是:調(diào)用pipe()建立一個管道,利用fork()創(chuàng)建兩個子進程:一個是左側(cè)進程,另一個是右側(cè)進程。左側(cè)進程使用close(pipefd[0])關(guān)閉管道讀取端,使用close(1)關(guān)閉最初的標(biāo)準(zhǔn)輸出,使用dup(pipefd[1])將管道的寫入端改為文件描述符1,使用close(pipefd[1])關(guān)閉打開文件描述符的一個副本,調(diào)用ex關(guān)閉打開文件描述符的一個副本,調(diào)用execvp()啟動運行的程序。在父進程中,關(guān)閉管道的兩端:close(pipefd[0])和close(pipefd[1])。最后,在父進程中使用wait()等待兩個子進程結(jié)束。答:(上機題)#include<unistd.h>#include<stdio.h>#include<errno.h>#include<sys/types.h>#include<stdlib.h>intmain(intargc,char*argv[]){intpipefd[2];pid_tleftpid,rightpid;char*arg1[]={"echo","goodmorning",0};char*arg2[]={"sed","s/good/hi/g",0};if(pipe(pipefd)){//創(chuàng)建管道 fprintf(stderr,"%s:pipefailed:%s\n",argv[0],strerror(errno)); exit(1);};if((leftpid=fork())<0){//創(chuàng)建左側(cè)子進程 fprintf(stderr,"%s:forkofleftchildfailed:%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);//執(zhí)行echogoodmorning,結(jié)果寫入管道}if((rightpid=fork())<0){//創(chuàng)建右側(cè)子進程 fprintf(stderr,"%s:forkofrightchildfailed:%s\n",argv[0],strerror(errno)); exit(1);}; if(rightpid==0){//右側(cè)子進程 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)建一個消息隊列,輸出其隊列ID。然后再次調(diào)用msgget()打開已有的隊列。如果兩次得到的ID相同,則顯示打開隊列的I
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度國際會議及展覽活動宣傳推廣合同3篇
- 二零二五年度建筑管道系統(tǒng)安裝服務(wù)合同2篇
- 2025年度個人委托新能源儲能技術(shù)投資合同3篇
- 商鋪售后返租合同中的履約保障與爭議解決(2025年版)2篇
- 二零二五年度建筑玻璃幕墻工程勞務(wù)分包及安全評估協(xié)議3篇
- 2025年度氣體滅火系統(tǒng)研發(fā)與生產(chǎn)合作協(xié)議
- 二零二五年度城市綠化帶植物病蟲害防治合同3篇
- 2025版壓路機設(shè)備翻新改造與租賃合同范本3篇
- 二零二五年度商用機動車買賣合同范本3篇
- 高速公路交通安全宣傳教育活動合同(二零二五版)3篇
- 場地委托授權(quán)
- 2024年四川省成都市龍泉驛區(qū)中考數(shù)學(xué)二診試卷(含答案)
- 項目工地春節(jié)放假安排及安全措施
- 印染廠安全培訓(xùn)課件
- 紅色主題研學(xué)課程設(shè)計
- 胸外科手術(shù)圍手術(shù)期處理
- 裝置自動控制的先進性說明
- 《企業(yè)管理課件:團隊管理知識點詳解PPT》
- 移動商務(wù)內(nèi)容運營(吳洪貴)任務(wù)二 軟文的寫作
- 英語詞匯教學(xué)中落實英語學(xué)科核心素養(yǎng)
- 《插畫設(shè)計》課程標(biāo)準(zhǔn)
評論
0/150
提交評論