Linux教程(第5版)-習(xí)題答案_第1頁(yè)
Linux教程(第5版)-習(xí)題答案_第2頁(yè)
Linux教程(第5版)-習(xí)題答案_第3頁(yè)
Linux教程(第5版)-習(xí)題答案_第4頁(yè)
Linux教程(第5版)-習(xí)題答案_第5頁(yè)
已閱讀5頁(yè),還剩28頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

·PAGE258·Linux教程(第4版)思考題11.1什么是軟件?軟件分為哪幾種?答:軟件是相對(duì)硬件而言的,它是與數(shù)據(jù)處理系統(tǒng)操作有關(guān)的計(jì)算機(jī)程序和相關(guān)數(shù)據(jù)等的總稱。軟件通??煞譃槿箢?lèi),即系統(tǒng)軟件、應(yīng)用軟件和支撐軟件。1.2根據(jù)你的理解,簡(jiǎn)述操作系統(tǒng)的定義。答:(學(xué)生可根據(jù)自己的理解予以表述,要符合下面定義所包含的基本點(diǎn))操作系統(tǒng)是控制和管理計(jì)算機(jī)系統(tǒng)內(nèi)各種硬件和軟件資源、有效地組織多道程序運(yùn)行的系統(tǒng)軟件(或程序集合),是用戶與計(jì)算機(jī)之間的接口。1.3操作系統(tǒng)的主要功能是什么?答:操作系統(tǒng)的主要功能包括存儲(chǔ)管理、進(jìn)程和處理機(jī)管理、文件管理、設(shè)備管理和用戶接口服務(wù)。1.4獨(dú)立運(yùn)行的多用戶系統(tǒng)和單用戶機(jī)器組成的計(jì)算機(jī)網(wǎng)絡(luò)之間有哪些共同點(diǎn)和不同點(diǎn)?答:共同點(diǎn):①都是多用戶系統(tǒng),多個(gè)用戶可以同時(shí)上機(jī)使用計(jì)算機(jī)系統(tǒng);②系統(tǒng)中某些資源可以共享;③系統(tǒng)中各用戶可以彼此獨(dú)立的操作,互不干擾;④系統(tǒng)中的用戶可以交換信息。不同點(diǎn):①分布性:獨(dú)立運(yùn)行的多用戶系統(tǒng)是多個(gè)用戶同時(shí)在一臺(tái)主機(jī)上運(yùn)行多道程序,而單用戶機(jī)器組成的計(jì)算機(jī)網(wǎng)絡(luò)是通過(guò)通信線路將地理上分散的多臺(tái)計(jì)算機(jī)連接在一起;②自治性:前者中所有用戶共享同一CPU、內(nèi)存、盤(pán)空間等資源,有統(tǒng)一任務(wù)調(diào)度,而后者共享不同計(jì)算機(jī)上的資源,松散耦合,不具備整個(gè)系統(tǒng)統(tǒng)一任務(wù)調(diào)度;③體系結(jié)構(gòu):前者是單機(jī)系統(tǒng),后者是多機(jī)系統(tǒng);④通信方式:前者中進(jìn)程通過(guò)共享內(nèi)存、消息傳遞等進(jìn)行通信,后者通過(guò)網(wǎng)絡(luò)互聯(lián)協(xié)議實(shí)現(xiàn)數(shù)據(jù)通信和資源共享目的;⑤容錯(cuò)性:前者中某一部件出現(xiàn)故障將影響整個(gè)系統(tǒng),而后者不受影響,可靠性更高;⑥并行性:前者只能實(shí)現(xiàn)并發(fā)計(jì)算,而后者可以實(shí)現(xiàn)并行計(jì)算。1.5列出Linux系統(tǒng)的主要特點(diǎn)。答:Linux系統(tǒng)具有一系列顯著特點(diǎn),包括:與UNIX系統(tǒng)兼容;自由軟件和源碼公開(kāi);性能高和安全性強(qiáng);便于定制和再開(kāi)發(fā);互操作性強(qiáng);全面的多任務(wù)和真正的64位操作系統(tǒng)。1.6解釋核心版本和發(fā)行版本的含義。Linux2.1.1版和2.2.1版中,哪一個(gè)版本是穩(wěn)定的?答:核心版本主要是Linux的內(nèi)核,由Linus等人在不斷地開(kāi)發(fā)和推出新的內(nèi)核。Linux內(nèi)核的官方版本由LinusTorvalds本人維護(hù)著。發(fā)行版本是各個(gè)公司推出的版本,它們與核心版本是各自獨(dú)立發(fā)展的。發(fā)行版本通常內(nèi)附有一個(gè)核心源碼,以及很多針對(duì)不同硬件設(shè)備的核心映像。所以發(fā)行版本是一些基于Linux核心的軟件包。核心版本的序號(hào)由三部分?jǐn)?shù)字構(gòu)成:major.minor.patchlevel。Linux2.1.1版的次版本號(hào)為奇數(shù),不一定很穩(wěn)定,相當(dāng)于測(cè)試版;而Linux2.2.1版的次版本號(hào)為偶數(shù),是穩(wěn)定的版本。1.7某用戶的硬盤(pán)空間是10GB,內(nèi)存是256MB。他想安裝普華LinuxV4.0系統(tǒng),是否可以?答:不行。因?yàn)樵撚?jì)算機(jī)的內(nèi)存空間和硬盤(pán)空間配置不滿足普華Linux桌面版V4.0的基本需求(最小內(nèi)存為1GB,最少15.4GB自由硬盤(pán)空間,建議20GB以上)。1.8安裝Linux系統(tǒng)之前,需要做哪幾方面的準(zhǔn)備工作?答:比較重要的準(zhǔn)備工作有:備份數(shù)據(jù)、硬件檢查、準(zhǔn)備硬盤(pán)分區(qū)等。1.9普華Linux的主要安裝過(guò)程是什么?答:將安裝光盤(pán)放入光驅(qū)中,系統(tǒng)將被自動(dòng)引導(dǎo)。主要安裝過(guò)程是:語(yǔ)言選擇,許可協(xié)議,選擇安裝模式,磁盤(pán)分區(qū),檢查安裝選項(xiàng),安裝系統(tǒng),初始化設(shè)置。1.10什么是硬盤(pán)分區(qū)?一塊硬盤(pán)上可以有幾種類(lèi)型的分區(qū)?各自可以有多少個(gè)?在它們上面能否安裝Linux系統(tǒng)?答:硬盤(pán)分區(qū)是對(duì)硬盤(pán)的一種格式化,格式化后才能使用硬盤(pán)保存各種信息。在創(chuàng)建分區(qū)時(shí),就設(shè)置好硬盤(pán)的各項(xiàng)物理參數(shù),指定硬盤(pán)主引導(dǎo)記錄和引導(dǎo)記錄備份的存放位置。另外,分區(qū)時(shí)必須把硬盤(pán)的主分區(qū)設(shè)定為活動(dòng)分區(qū),這樣才能夠通過(guò)硬盤(pán)啟動(dòng)系統(tǒng)。

硬盤(pán)上的分區(qū)有三種類(lèi)型:主分區(qū)、擴(kuò)展分區(qū)和邏輯分區(qū)。一個(gè)硬盤(pán)最多只能有4個(gè)主分區(qū);擴(kuò)展分區(qū)可以有1個(gè);擴(kuò)展分區(qū)中可以劃分出多個(gè)邏輯分區(qū)(事實(shí)上只能建立20多個(gè))。Linux既可以安裝在主分區(qū)上,也可以安裝在邏輯分區(qū)上,但在擴(kuò)展分區(qū)上不能直接安裝。1.11多啟動(dòng)系統(tǒng)與虛擬機(jī)系統(tǒng)有何異同?利用VMWare安裝Linux的基本步驟是什么?答:多啟動(dòng)系統(tǒng):一臺(tái)機(jī)器上同時(shí)存在多個(gè)操作系統(tǒng),每個(gè)操作系統(tǒng)單獨(dú)占用硬盤(pán)的一個(gè)分區(qū),每一時(shí)刻只能運(yùn)行一個(gè)系統(tǒng),在系統(tǒng)切換時(shí)需要重新啟動(dòng)機(jī)器。虛擬機(jī)系統(tǒng):在一臺(tái)機(jī)器上安裝多個(gè)操作系統(tǒng),它們?cè)谥飨到y(tǒng)(如Windows)的平臺(tái)上同時(shí)運(yùn)行,就像標(biāo)準(zhǔn)Windows應(yīng)用程序那樣切換,而且每個(gè)操作系統(tǒng)都可以進(jìn)行虛擬分區(qū)、配置而不影響真實(shí)硬盤(pán)的數(shù)據(jù)。利用VMWare安裝Linux的基本步驟:下載并安裝VMWare,創(chuàng)建虛擬機(jī);安裝Linux操作系統(tǒng);安裝VMWareTools。1.12XWindow的體系結(jié)構(gòu)包括哪兩部分?答:XWindow的體系結(jié)構(gòu)包括兩個(gè)部分:客戶-服務(wù)器模型和X協(xié)議。1.13系統(tǒng)設(shè)置的主要功能是什么?訪問(wèn)它的方法是怎樣的?答:系統(tǒng)設(shè)置是普華LinuxV4.0提供的一個(gè)集成的圖形化配置環(huán)境。在系統(tǒng)設(shè)置中,幾乎能找到所有的系統(tǒng)配置和管理工具。它可以方便有效地進(jìn)行如下幾類(lèi)操作:查看系統(tǒng)信息,執(zhí)行系統(tǒng)管理任務(wù)。配置系統(tǒng)中的基本硬件設(shè)備。定制個(gè)性化的桌面環(huán)境。管理鼠標(biāo)、鍵盤(pán)的定制。訪問(wèn)系統(tǒng)設(shè)置,可在系統(tǒng)主菜單中選擇“程序”→“設(shè)置”→“系統(tǒng)設(shè)置”。1.14KDE桌面環(huán)境由哪幾部分組成?答:KDE桌面環(huán)境由面板和桌面兩部分組成。1)面板。屏幕底部是面板,也稱K面板??梢詮倪@里啟動(dòng)應(yīng)用程序和在桌面上切換。它比Windows7任務(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)程序或打開(kāi)文件,也可以拖動(dòng)它們,改變其位置,或者添加/刪除桌面圖標(biāo)。1.15試配置所用的顯示器。 答:(上機(jī)題)配置所用的顯示器的基本步驟是:?jiǎn)螕羝聊蛔笙陆堑摹伴_(kāi)始”按鈕,選擇“程序”→“設(shè)置”→“系統(tǒng)設(shè)置”,彈出“系統(tǒng)設(shè)置”窗口,雙擊“硬件”欄中的“顯示和監(jiān)控”。然后在打開(kāi)的顯示配置界面上,在“分辨率”欄中用滑動(dòng)條設(shè)置屏幕分辨率,像素范圍從640×480到1920×1080。通常可選擇1024×768;“方向”選擇“普通”即可。在“刷新率”下拉列表中設(shè)定顯示器的刷新頻率,通常選擇“自動(dòng)”即可。配置完成后單擊“應(yīng)用”按鈕。思考題22.1簡(jiǎn)述Linux命令的一般格式。答:Linux命令的一般格式是:命令名[選項(xiàng)][參數(shù)]…2.2請(qǐng)說(shuō)明下述命令的功能:date,cd,cp,pwd,rm,mkdir,echo,who,ls,cat,more,man。答:date命令用于在屏幕上顯示或設(shè)置系統(tǒng)的日期和時(shí)間。 cd命令改變工作目錄。cp命令將源文件或目錄復(fù)制到目標(biāo)文件或目錄中。pwd命令顯示出當(dāng)前目錄的路徑。rm命令可以刪除文件或目錄。mkdir命令用來(lái)創(chuàng)建目錄。echo命令可以將命令行中的參數(shù)顯示到標(biāo)準(zhǔn)輸出(即屏幕)上。who命令將列出所有正在使用系統(tǒng)的用戶、所用終端名和注冊(cè)到系統(tǒng)的時(shí)間。ls命令列出指定目錄的內(nèi)容。cat命令連接文件并打印到標(biāo)準(zhǔn)輸出設(shè)備上。cat經(jīng)常用來(lái)顯示文件的內(nèi)容。more命令顯示文件內(nèi)容,每次顯示一屏。man命令格式化并顯示某一命令的聯(lián)機(jī)幫助手冊(cè)頁(yè)。2.3公元2049年的元旦是星期幾?答:運(yùn)行命令:cal12049或calJan2049從顯示結(jié)果可知,2049年的元旦是星期五。2.4什么是文件?Linux下主要有哪些不同種類(lèi)的文件?答:文件(File)是被命名的相關(guān)信息的集合體。它通常存放在外存(如磁盤(pán)、光盤(pán))上,可以作為一個(gè)獨(dú)立單位存放和實(shí)施相應(yīng)的操作(如打開(kāi)、關(guān)閉、讀、寫(xiě)等)。Linux系統(tǒng)中主要有以下類(lèi)型的文件:普通文件、目錄文件、特別文件以及符號(hào)鏈接文件。2.5確定當(dāng)前工作目錄是什么?把工作目錄改到父目錄上,然后用長(zhǎng)格式列出其中所有的內(nèi)容。答:(上機(jī)做)執(zhí)行命令:pwd在屏幕上顯示出當(dāng)前工作目錄的絕對(duì)路徑名。然后依次執(zhí)行命令:cd..ls-lai2.6在所用的Linux系統(tǒng)上,根目錄下含有哪些內(nèi)容?各自的功能是什么?答:執(zhí)行命令:cd/將當(dāng)前目錄改到根目錄 ls-l列出它的清單上機(jī)操作并參照本教材8.3.3節(jié)相關(guān)內(nèi)容,闡述根目錄下各目錄的基本功能。2.7說(shuō)出下列每一項(xiàng)信息各對(duì)應(yīng)哪一類(lèi)文件:(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è)備(軟盤(pán))文件(6)目錄文件,其中包含用戶可共享的庫(kù)文件(7)普通文件(可執(zhí)行文件)2.8要想改變目錄列表中下面三部分的內(nèi)容,應(yīng)該分別用什么命令?(1)-rwxr--r-- (2)N (3)…ABC答:(1)使用chmod命令改變相應(yīng)文件或目錄的存取權(quán)限。(2)使用ln命令可以增加指定文件的鏈接數(shù),使用rm刪除文件,可以減少相應(yīng)文件的鏈接數(shù)。(3)使用mv命令可以對(duì)指定文件或目錄重新命名。2.9請(qǐng)給出下列命令執(zhí)行的結(jié)果:(1)cd (2)cd.. (3)cd../.. (4)cd/答:(1)cd將當(dāng)前目錄改到用戶主目錄。(2)cd..將當(dāng)前目錄向上移一級(jí)(即父目錄)。(3)cd../..將當(dāng)前目錄向上移動(dòng)兩級(jí)。(4)cd/將當(dāng)前目錄改到根目錄。2.10cp,copy和mv命令有何異同?答:cp命令復(fù)制一個(gè)文件,而原文件保持不變,這樣文件個(gè)數(shù)就增加了;mv命令將文件從一個(gè)目錄移到另一個(gè)目錄中,該文件就從原目錄中消失,文件個(gè)數(shù)不變。不能直接用copy作為復(fù)制文件的命令。因?yàn)長(zhǎng)inux系統(tǒng)提供的眾多命令都是有一定規(guī)則和限制的,cp是copy的縮寫(xiě),是Linux默認(rèn)的復(fù)制文件的命令,而copy并不是Linux的合法命令。2.11用什么命令能把兩個(gè)文件合并成一個(gè)文件?答:使用cat命令,例如:catfile1file2>file3將文件file1和file2合并后放入file3中。2.12如何確定系統(tǒng)中是否有ps命令?如果有,它的功能是什么?答:可以使用manps命令。如果系統(tǒng)中有ps命令,將顯示ps命令的聯(lián)機(jī)幫助手冊(cè)頁(yè),列出有關(guān)該命令的完整說(shuō)明;否則,將顯示出錯(cuò)信息。ps命令的功能是查看當(dāng)前系統(tǒng)中運(yùn)行的進(jìn)程信息。2.13要確定在文件ABC中是否含有表示星期六或者星期日字符的行,應(yīng)使用什么命令?答:grep‘Saturday|Sunday’ABC或者grep-i‘saturday|sunday’ABC2.14如何對(duì)文件ABC分別按字典順序、月份順序、算術(shù)值進(jìn)行排序?答:按字典順序排序sort-dABC按月份順序排序sort--MABC按算術(shù)值排序sort–nABC2.15目錄ABC下有兩個(gè)子目錄a1,b2,以及5個(gè)普通文件。如果想刪除ABC目錄,應(yīng)使用什么命令?答:(1)最簡(jiǎn)單,但是風(fēng)險(xiǎn)較大的方法:rm-rABC(2)如果5個(gè)普通文件分別在子目錄a1和b2之下,則可以使用以下命令:cdABC/a1rm*cd../b2rm*cd../..rmdir-pABC(3)如果5個(gè)普通文件并未全在兩個(gè)子目錄之下,則可以使用以下命令:cdABCrm-r*cd..rmdirABC2.16如何用一個(gè)命令行統(tǒng)計(jì)給定目錄中有多少個(gè)子目錄?答:設(shè)給定目錄名為DIR,則可以使用以下命令行:ls-ldDIR|wc-l2.17類(lèi)似于DOS下的dir,del,type命令的Linux命令各是什么?答:分別是:ls,rm和cat。2.18試說(shuō)明find,tee,gzip命令的功能。答:分別使用以下命令:manfind顯示該命令的功能是:查找Linux系統(tǒng)上的文件或目錄。mantee顯示該命令的功能是:從標(biāo)準(zhǔn)輸入設(shè)備讀取數(shù)據(jù),將其輸出到標(biāo)準(zhǔn)輸出設(shè)備,同時(shí)保存到指定的文件中。mangzip顯示該命令的功能是:對(duì)文件進(jìn)行壓縮和解壓縮。思考題33.1進(jìn)入和退出vi的方法有哪些?答:進(jìn)入vi的方法:在系統(tǒng)提示符(設(shè)為$)下輸入命令vi和想要編輯(建立)的文件名,便可進(jìn)入vi,如:$vifilename退出vi的方法:(1):wq 把編輯緩沖區(qū)的內(nèi)容寫(xiě)到你編輯的文件中,退出編輯器,回到shell下。(其操作過(guò)程是,先輸入冒號(hào)“:”,再輸入命令wq。以下命令操作相同。)(2):ZZ(大寫(xiě)字母ZZ) 僅當(dāng)做過(guò)修改時(shí)才將緩沖區(qū)內(nèi)容寫(xiě)到文件上。(3):x 與:ZZ相同。(4):q! 強(qiáng)行退出vi。感嘆號(hào)(!)告訴vi,無(wú)條件退出,丟棄緩沖區(qū)內(nèi)容。3.2vi編輯器的工作方式有哪些?相互間如何轉(zhuǎn)換?答:vi編輯器有三種工作方式:命令方式、插入方式和ex轉(zhuǎn)義方式?!馭hell命令→vi的命令方式:輸入命令vi進(jìn)入編輯器時(shí),就處于vi的命令方式?!駐i的命令方式→Shell命令:在vi的命令方式下使用退出命令,可以返回shell命令方式?!駐i命令方式→插入方式:通過(guò)輸入vi的插入命令(i)、附加命令(a)、打開(kāi)命令(o)、替換命令(s)、修改命令(c)或取代命令(r)可以從命令方式進(jìn)入到插入方式。●插入方式→vi命令方式:由插入方式回到命令方式的辦法是按Esc鍵(通常在鍵盤(pán)的左上角)?!駐i的命令方式→Ex轉(zhuǎn)義方式:在vi的命令方式下,輸入一個(gè)冒號(hào)(:),就進(jìn)入Ex轉(zhuǎn)義方式?!馝x轉(zhuǎn)義方式→vi的命令方式:轉(zhuǎn)義命令執(zhí)行后,自動(dòng)回到vi命令方式。3.3建立一個(gè)文本文件,如會(huì)議通知。(1)建立文件notes,并統(tǒng)計(jì)其大小。(2)重新編輯文件notes,加上一個(gè)適當(dāng)?shù)臉?biāo)題。(3)修改notes中開(kāi)會(huì)的時(shí)間和地點(diǎn)。(4)刪除文件中第3行,然后予以恢復(fù)。答:上機(jī)題。體會(huì)vi編輯器的工作方式及相互轉(zhuǎn)換,熟悉基本命令的使用??蓞⒄找韵虏襟E做:(1)進(jìn)入vi,建立一個(gè)空文件notes;(2)進(jìn)入插入方式,編輯一個(gè)會(huì)議通知;(3)返回vi命令方式,保存編輯的內(nèi)容并退出vi;(4)在shell命令方式下,執(zhí)行wc命令,統(tǒng)計(jì)文件notes的大??;(5)利用vi,重新編輯文件notes,加上一個(gè)會(huì)議通知的標(biāo)題;(6)保存編輯內(nèi)容并退出vi,利用cat命令查看該文件的內(nèi)容;(7)重新編輯文件notes,修改其中開(kāi)會(huì)的時(shí)間和地點(diǎn);(8)保存內(nèi)容并退出vi,然后利用cat命令查看該文件的內(nèi)容,注意內(nèi)容的變化;(9)重新編輯該文件,利用文本刪除命令刪除其中的第3行;接著分別利用復(fù)原命令u和U恢復(fù)刪除的內(nèi)容。注意各個(gè)命令執(zhí)行后屏幕顯示內(nèi)容的變化。從中體會(huì)各命令的功能。3.4建立一個(gè)文本文件,將光標(biāo)移至第5行上。分別利用c,C和cc命令進(jìn)行修改。答:上機(jī)題。體會(huì)在vi編輯方式下,光標(biāo)移動(dòng)的方式和不同修改命令的功能。注意各命令的使用方式和光標(biāo)位置的移動(dòng)。3.5在vi之下,上、下、左、右移動(dòng)光標(biāo)的方式有哪些?答:參照本教材P78的圖3-2解答。3.6解釋下述vi命令的功能:20G 18| dM 6H d4B x cw 10cc 3rk5s

7S >8M /this ?abc?-5 mg g/int/p 答:20G 光標(biāo)移至第20行的開(kāi)頭。 18| 光標(biāo)移至當(dāng)前行的第18列上。 dM刪除從當(dāng)前行至屏幕中間行的所有行 6H將光標(biāo)移到距離屏幕頂部5行的行首 d4B從光標(biāo)位置反向刪除4個(gè)詞(包括光標(biāo)所在詞)。 x 刪除光標(biāo)所在的字符。cw將光標(biāo)所在字符至詞尾刪除,然后用新輸入的文本代替。10cc 先刪除光標(biāo)所在行及其下面9行(共10行),然后以新輸入的文本代替。3rk 表示從光標(biāo)位置開(kāi)始向右共有3個(gè)字符被k替代。5s 光標(biāo)所在字符及其后的4個(gè)字符(共5個(gè)字符)被新輸入的字符序列替代。7S 當(dāng)前行及其下面6行(共7行)被新輸入的正文替換。>8M將當(dāng)前行和屏幕中間行之間各行向右移動(dòng)8個(gè)字符/this 從光標(biāo)所在行開(kāi)始向前查找字符串“this”,找到后就做上標(biāo)記。?abc?-5從光標(biāo)所在行開(kāi)始向后查找字符串“abc”,光標(biāo)停在首次找到行之前的倒數(shù)第5行的行首,即行號(hào)是(匹配行號(hào)-5)。 mg在光標(biāo)所在位置做上標(biāo)記g,但屏幕上并不顯示“g”。 g/int/p在屏幕上顯示當(dāng)前所編輯的文件中所有包含字符串“int”的行。3.7如果希望進(jìn)入vi后光標(biāo)位于文件的第10行上,應(yīng)輸入什么命令?答:設(shè)要編輯的文件名是abc,且該文件大于10行。在shell提示符后輸入以下命令:vi+10abc3.8不管文件中某一行被編輯了多少次,總能把它恢復(fù)成被編輯之前的樣子,應(yīng)使用什么命令?答:使用U(大寫(xiě)字母)命令就能把當(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(簡(jiǎn)稱sh)、Cshell(簡(jiǎn)稱csh)、Kornshell(簡(jiǎn)稱ksh)和BourneAgainshell(簡(jiǎn)稱bash)。Linux系統(tǒng)中默認(rèn)的shell是bash。4.2簡(jiǎn)述shell的主要特點(diǎn)。bash有什么特點(diǎn)?答:shell具有如下主要特點(diǎn):(1)命令組合,構(gòu)成新的命令;(2)提供了文件名擴(kuò)展字符(通配符,如*、?、[]);(3)可以直接使用shell的內(nèi)置命令,而不需創(chuàng)建新的進(jìn)程;(4)允許靈活地使用數(shù)據(jù)流,提供通配符、輸入/輸出重定向、管道線等機(jī)制,方便了模式匹配、I/O處理和數(shù)據(jù)傳輸;(5)結(jié)構(gòu)化的程序模塊,提供了順序流程控制、條件控制、循環(huán)控制等;(6)提供了在后臺(tái)(&)執(zhí)行命令的能力;(7)提供了可配置的環(huán)境,允許創(chuàng)建和修改命令、命令提示符和其他的系統(tǒng)行為;(8)提供了一個(gè)高級(jí)的命令語(yǔ)言,能創(chuàng)建從簡(jiǎn)單到復(fù)雜的程序。這些shell程序稱為shell腳本。bash是Linux點(diǎn):①命令行歷史。使用命令行歷史特性,可以恢復(fù)以前輸入的命令。②命令行編輯??梢岳镁庉嬈鳎ㄈ鐅i)修改已經(jīng)輸入的命令。③命令補(bǔ)全。能在輸入文件名的一部分之后,由系統(tǒng)自動(dòng)填入剩余的部分。④別名擴(kuò)展。能建立代表某些命令的名字。4.3執(zhí)行shell腳本的方式主要是哪些?答:執(zhí)行shell腳本的常用方式基本上有兩種:(1)以腳本名作為參數(shù)。其一般形式是:$bash腳本名[參數(shù)](2)將shell腳本的權(quán)限設(shè)置為可執(zhí)行,然后在提示符下直接執(zhí)行它。例如,設(shè)abcd是shell腳本文件,執(zhí)行步驟如下:$chmoda+xabcd$PATH=$PATH:·$abcd或者$·/abcd4.4將主提示符改為用戶的主目錄名,并予以輸出。答:$PS1="$HOME>"echo$PS1$exportPS14.5說(shuō)明三種引號(hào)的作用有什么區(qū)別。答:在shell中引號(hào)分為三種:雙引號(hào)、單引號(hào)和倒引號(hào)。(1)由雙引號(hào)括起來(lái)的字符(除$、倒引號(hào)ˋ和轉(zhuǎn)義字符\外)均作為普通字符對(duì)待,而那三個(gè)字符仍保留其特殊功能。(2)由單引號(hào)括起來(lái)的所有字符都作為普通字符出現(xiàn)。(3)用倒引號(hào)括起來(lái)的字符串被shell解釋為命令行,在執(zhí)行時(shí),shell會(huì)先執(zhí)行該命令行,并以執(zhí)行結(jié)果取代用倒引號(hào)括起的部分。另外,可以將一個(gè)命令的執(zhí)行結(jié)果賦給變量,即命令替換。4.6利用變量賦值方式,將字符串DOSfilec:>\$student\*顯示出來(lái)。答:$string=’DOSfilec:>\$student\*’ $echo$string4.7顯示環(huán)境變量的設(shè)置情況,說(shuō)明各自的意義。答:執(zhí)行env命令,在屏幕上將會(huì)顯示出當(dāng)前環(huán)境下的所有環(huán)境變量及其值。讀者可以依據(jù)所用機(jī)器上實(shí)際顯示的信息,進(jìn)行說(shuō)明。常用的環(huán)境變量有以下幾個(gè)。(1)HOME:用戶主目錄的全路徑名。(2)LOGNAME:即用戶注冊(cè)名,由Linux自動(dòng)設(shè)置。(3)PWD:當(dāng)前工作目錄的路徑。(4)PATH:shell查找命令的路徑(目錄)列表,各個(gè)目錄用冒號(hào)(:)隔開(kāi)。(5)PS1:shell的主提示符。用戶可以設(shè)置PS1的值。⑹SHELL:當(dāng)前使用的shell。通常,它的值是/bin/bash。⑺TERM:終端類(lèi)型。(8)MAIL:系統(tǒng)信箱的路徑。4.8分析下列shell腳本的功能:count=$#cmd=echowhile[$count-gt0]docmd="$cmd\$$count"count=`expr$count-1`doneeval$cmd答:該腳本的功能是:逆向輸出用戶在命令行上提供的各個(gè)參數(shù)。例如,設(shè)該腳本名是ABC,執(zhí)行該腳本的命令行是:$ABCapplebigcatdog則結(jié)果輸出是:dogcatbigapple4.9編寫(xiě)一個(gè)shell腳本,它把第二個(gè)位置參數(shù)及其以后的各個(gè)參數(shù)指定的文件復(fù)制到第一個(gè)位置參數(shù)指定的目錄中。答:上機(jī)實(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編寫(xiě)一個(gè)shell腳本,顯示當(dāng)天日期,查找給定的某用戶是否在系統(tǒng)中工作。如果在系統(tǒng)中,就發(fā)一個(gè)問(wèn)候給他。答:上機(jī)實(shí)踐題。參考腳本如下: #!/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答:上機(jī)實(shí)踐題。參考腳本如下: #!/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文件移到指定的目錄下,并按文件大小排序,顯示移動(dòng)后指定目錄的內(nèi)容。答:上機(jī)實(shí)踐題。參考腳本如下: #!/bin/bash echo"Inputthenameofadirectory." readdirif[-d$dir] thenfornamein*.c do mv$namedir donels-Sdir lsdir elseecho"Sorry!$dirisnotadirectory." fi4.13利用數(shù)組形式存放10個(gè)城市的名字,然后利用for循環(huán)把它們打印出來(lái)。答:上機(jī)實(shí)踐題。參考腳本如下:#!/bin/bashcity=(BeijingShanghaiTianjinGuangzhouChongqingHangzhouNanjingShenyangTaiyuanJinan)foriin${city[*]}doecho$idone4.14編寫(xiě)一個(gè)shell腳本,求費(fèi)波納奇數(shù)列的前10項(xiàng)及總和。答:上機(jī)實(shí)踐題。參考腳本如下: #!/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下述表達(dá)式的作用是什么?${name[*]} ${name[@]} ${name#*/}${name%%.*} ${#name[*]} ${name:-Hello}答:${name[*]}和${name[@]}都表示數(shù)組name中所有非空元素的值,每個(gè)元素的值用空格分開(kāi)。${name#*/}如果name值的開(kāi)頭包含模式*/,那么該表達(dá)式的值就是name中去掉最少匹配*/部分后的結(jié)果;否則,就是name的值。${name%%.*}如果name值的末尾包含.*,那么該表達(dá)式的值就是name中去掉最多匹配.*部分后的結(jié)果;否則,就是name的值。${#nane[*]}的值是數(shù)組name中已經(jīng)設(shè)置的元素的個(gè)數(shù)。${name:-Hello}如果name的值為空,則整個(gè)表達(dá)式的值等于給定的字符串Hello,name保持不變;否則,整個(gè)表達(dá)式的值等于name的值,name保持不變。4.16答:上機(jī)實(shí)踐題。$history40$!-54.17定義一個(gè)別名命令,它等價(jià)的功能是:顯示當(dāng)前日期及工作目錄,并列出有多少用戶在系統(tǒng)上工作。答:上機(jī)實(shí)踐題。$aliascmd=’date;pwd;who|wc–l’$cmd4.18設(shè)計(jì)一個(gè)程序cuts,它由標(biāo)準(zhǔn)輸入讀取數(shù)據(jù),獲取由第一個(gè)參數(shù)n和第二個(gè)參數(shù)m所限定范圍的數(shù)據(jù),n和m都是整數(shù),即從輸入的字符串中抽取第n個(gè)字符至第m個(gè)字符之間的所有字符(包括這兩個(gè)字符)。例如:$cuts1114thisisatestofcutsprogram(輸入)test(顯示結(jié)果)答:上機(jī)實(shí)踐題。參考腳本如下:#!/bin/bashread-p"Inputastring:"strecho$str|cut-c$1-$2思考題55.1說(shuō)明Linux系統(tǒng)的體系結(jié)構(gòu)分為哪幾層。答:Linux系統(tǒng)的體系結(jié)構(gòu)大致可分為三層:①靠近硬件的底層是內(nèi)核,即Linux操作系統(tǒng)常駐內(nèi)存部分。②中間層是內(nèi)核之外的shell層,即操作系統(tǒng)的系統(tǒng)程序部分。③最高層是應(yīng)用層,即用戶程序部分。5.2說(shuō)明Linux系統(tǒng)核心結(jié)構(gòu)的組成情況。答:Linux是采用單體結(jié)構(gòu)的操作系統(tǒng),所有的內(nèi)核系統(tǒng)功能都包含在一個(gè)大型的內(nèi)核軟件之中。Linux內(nèi)核分為用戶層、核心層和硬件層3個(gè)層次,其內(nèi)核結(jié)構(gòu)框圖如下圖所示。5.3什么是進(jìn)程?什么是線程?Linux系統(tǒng)中的進(jìn)程有哪些狀態(tài)?如何獲取系統(tǒng)中各進(jìn)程的狀態(tài)?答:簡(jiǎn)單地說(shuō),進(jìn)程就是程序的一次執(zhí)行過(guò)程。具體地說(shuō),進(jìn)程是具有獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位。線程(Thread)是進(jìn)程中實(shí)施調(diào)度和分派的基本單位。在Linux系統(tǒng)中,進(jìn)程有五種狀態(tài):①運(yùn)行態(tài)(TASK_RUNNING)。②可中斷等待態(tài)(TASK_INTERRUPTIBLE)。③不可中斷等待態(tài)(TASK_UNINTERRUPTIBLE)。④停止態(tài)(TASK_STOPPED)。⑤僵死態(tài)(TASK_ZOMBIE)。利用命令psaux可以獲取系統(tǒng)中各進(jìn)程的狀態(tài)。5.4Linux系統(tǒng)中進(jìn)程有哪兩種模式?各有何特點(diǎn)?答:Linux系統(tǒng)中進(jìn)程的運(yùn)行模式劃分為用戶模式和內(nèi)核模式。在內(nèi)核模式下運(yùn)行的進(jìn)程可以執(zhí)行機(jī)器的特權(quán)指令,該進(jìn)程的運(yùn)行不受用戶的干預(yù),即使是root用戶也不能干預(yù)內(nèi)核模式下進(jìn)程的運(yùn)行。用戶模式中執(zhí)行的進(jìn)程,可以通過(guò)系統(tǒng)調(diào)用或在出現(xiàn)中斷、異常時(shí)進(jìn)入內(nèi)核模式。5.5Linux系統(tǒng)中進(jìn)程控制塊的作用是什么?它與進(jìn)程有何關(guān)系?答:Linux系統(tǒng)中的每個(gè)進(jìn)程都有一個(gè)名為task_struct的數(shù)據(jù)結(jié)構(gòu),它相當(dāng)于“進(jìn)程控制塊”,包含了進(jìn)程的描述信息和控制信息,是進(jìn)程組成中最關(guān)鍵的部分。每個(gè)進(jìn)程有唯一的進(jìn)程控制塊;操作系統(tǒng)根據(jù)它對(duì)進(jìn)程實(shí)施控制和管理,是進(jìn)程存在的唯一標(biāo)志。5.6Linux系統(tǒng)如何執(zhí)行進(jìn)程調(diào)度?答:Linux系統(tǒng)的進(jìn)程調(diào)度涉及調(diào)度方式、調(diào)度策略和調(diào)度時(shí)機(jī)三個(gè)方面。Linux內(nèi)核的調(diào)度方式基本上采用“搶占式優(yōu)先級(jí)”方式。Linux系統(tǒng)針對(duì)不同類(lèi)別的進(jìn)程提供了三種不同的調(diào)度策略,即:SCHED_FIFO(適合于實(shí)時(shí)進(jìn)程)、SCHED_RR(對(duì)應(yīng)“時(shí)間片輪轉(zhuǎn)法”)以及SCHED_OTHER(適合于交互式的分時(shí)進(jìn)程)。核心進(jìn)行進(jìn)程調(diào)度的時(shí)機(jī)有以下幾種情況:(1)當(dāng)前進(jìn)程調(diào)用系統(tǒng)調(diào)用nanosleep()或者pause(),使自己進(jìn)入睡眠狀態(tài),主動(dòng)讓出一段時(shí)間的CPU使用權(quán);(2)進(jìn)程終止,永久地放棄對(duì)CPU的使用;(3)在時(shí)鐘中斷處理程序執(zhí)行過(guò)程中,發(fā)現(xiàn)當(dāng)前進(jìn)程連續(xù)運(yùn)行的時(shí)間過(guò)長(zhǎng);(4)當(dāng)喚醒一個(gè)睡眠進(jìn)程時(shí),發(fā)現(xiàn)被喚醒的進(jìn)程比當(dāng)前進(jìn)程更有資格運(yùn)行;(5)一個(gè)進(jìn)程通過(guò)執(zhí)行系統(tǒng)調(diào)用來(lái)改變調(diào)度策略或者降低自身的優(yōu)先權(quán),從而引起立即調(diào)度。5.7shell的基本工作過(guò)程是怎樣的?答:shell命令解釋程序不屬于內(nèi)核部分,而是在核心之外,以用戶態(tài)方式運(yùn)行。其基本工作流程是:①讀取用戶由鍵盤(pán)輸入的命令行。②判斷命令是否正確,且將命令行的其他參數(shù)改造為系統(tǒng)調(diào)用exec()內(nèi)部處理所要求的形式。③終端進(jìn)程調(diào)用fork()建立一個(gè)子進(jìn)程。⑤當(dāng)調(diào)度子進(jìn)程運(yùn)行時(shí),它調(diào)用exec()根據(jù)文件名(即命令名)到目錄中查找有關(guān)文件(可執(zhí)行文件),調(diào)入內(nèi)存,更換自己的映像,然后執(zhí)行這個(gè)程序(即執(zhí)行這條命令)。⑥如果命令行末尾有&(后臺(tái)命令符號(hào)),則終端進(jìn)程不執(zhí)行系統(tǒng)調(diào)用wait4(),而是立即發(fā)提示符$,讓用戶輸入下一個(gè)命令,轉(zhuǎn)①;如果命令末尾沒(méi)有&,則終端進(jìn)程要一直等待。當(dāng)子進(jìn)程(即執(zhí)行該命令程序的進(jìn)程)完成處理后終止,向父進(jìn)程(終端進(jìn)程)報(bào)告。此時(shí),終端進(jìn)程被喚醒,在做必要的判別等工作后,終端進(jìn)程發(fā)提示符$,讓用戶輸入新的命令,重復(fù)上述處理過(guò)程。5.8Linux系統(tǒng)一般采用哪種文件系統(tǒng)?其構(gòu)造形式如何?答:目前,Linux主要使用的文件系統(tǒng)是ext2、ext3和ext4。ext3是ext2的升級(jí)版本,加入了記錄數(shù)據(jù)的日志功能。ext4是ext3文件系統(tǒng)的后繼版本,是擴(kuò)展日志式文件系統(tǒng)。ext2文件系統(tǒng)中的文件信息都保存在數(shù)據(jù)塊中。ext2文件系統(tǒng)將邏輯塊劃分成塊組,每個(gè)塊組重復(fù)保存著一些有關(guān)整個(gè)文件系統(tǒng)的關(guān)鍵信息以及實(shí)際的文件和目錄的數(shù)據(jù)塊。Ext2文件系統(tǒng)的物理構(gòu)造形式如下圖所示5.9什么是塊組?什么是超級(jí)塊?超級(jí)塊的功能是什么?答:Linux主要使用的文件系統(tǒng)是ext2和ext3,各自劃分成若干塊組。每個(gè)塊組重復(fù)保存著一些有關(guān)整個(gè)文件系統(tǒng)的關(guān)鍵信息,以及真正的文件和目錄的數(shù)據(jù)塊,其中包含超級(jí)塊、塊組描述結(jié)構(gòu)、塊位示圖、索引節(jié)點(diǎn)位示圖、索引節(jié)點(diǎn)表和數(shù)據(jù)塊。位于每個(gè)塊組的最前面,其中超級(jí)塊中包含有文件系統(tǒng)本身的大小和形式的基本信息,文件系統(tǒng)管理員可以利用這些信息來(lái)使用和維護(hù)文件系統(tǒng)。5.10什么是索引節(jié)點(diǎn)?索引節(jié)點(diǎn)主要有哪些內(nèi)容?它與文件有何關(guān)系?答:索引節(jié)點(diǎn)又被稱為I節(jié)點(diǎn),是一個(gè)結(jié)構(gòu)數(shù)組,其中包含有關(guān)該文件的全部管理信息。索引節(jié)點(diǎn)主要包括以下內(nèi)容:文件模式,文件屬主信息,文件大小,時(shí)間戳,文件鏈接計(jì)數(shù),數(shù)據(jù)塊索引表等。ext2文件系統(tǒng)的索引節(jié)點(diǎn)起著文件控制塊的作用,利用這種數(shù)據(jù)結(jié)構(gòu)可對(duì)文件進(jìn)行控制和管理。每個(gè)文件都只有一個(gè)索引節(jié)點(diǎn)。5.11為什么要設(shè)立虛擬文件系統(tǒng)(VFS)?它與實(shí)際文件系統(tǒng)的關(guān)系是怎樣的?答:Linux系統(tǒng)可以支持多種文件系統(tǒng),為此,必須使用一種統(tǒng)一的接口,這就是虛擬文件系統(tǒng)(VFS)。通過(guò)VFS將不同文件系統(tǒng)的實(shí)現(xiàn)細(xì)節(jié)隱藏起來(lái),從外部看上去所有的文件系統(tǒng)都是一樣的。VFS是建立在具體文件系統(tǒng)之上的,VFS必須管理所有的文件系統(tǒng)。用戶程序(進(jìn)程)通過(guò)有關(guān)文件系統(tǒng)操作的系統(tǒng)調(diào)用進(jìn)入系統(tǒng)空間,然后經(jīng)由VFS才可使用Linux系統(tǒng)中具體的文件系統(tǒng)。5.12Linux系統(tǒng)通常為什么要把硬盤(pán)劃分為多個(gè)文件系統(tǒng)?簡(jiǎn)述文件系統(tǒng)安裝的基本過(guò)程。答:一個(gè)硬盤(pán)上可以同時(shí)存在多個(gè)文件系統(tǒng),每個(gè)文件系統(tǒng)占據(jù)硬盤(pán)的一個(gè)獨(dú)立分區(qū)。Linux文件系統(tǒng)可以根據(jù)需要隨時(shí)裝卸,從而實(shí)現(xiàn)文件存儲(chǔ)空間的動(dòng)態(tài)擴(kuò)充和信息安全。在系統(tǒng)初啟時(shí),只有根文件系統(tǒng),其他的文件系統(tǒng)可以根據(jù)需要作為子系統(tǒng)動(dòng)態(tài)地安裝到主系統(tǒng)中,已安裝的子文件系統(tǒng)也可從整個(gè)文件系統(tǒng)上卸下來(lái),恢復(fù)安裝前的獨(dú)立狀態(tài)。文件系統(tǒng)安裝的基本過(guò)程是:超級(jí)用戶可以使用命令mount將新文件系統(tǒng)安裝到主文件系統(tǒng)中。該命令帶有3個(gè)主要參數(shù):要安裝的文件系統(tǒng)類(lèi)型、該文件系統(tǒng)所在分區(qū)名和安裝新文件系統(tǒng)的路徑名(即安裝點(diǎn))。執(zhí)行該命令時(shí),Linux系統(tǒng)內(nèi)核必須首先檢查有關(guān)參數(shù)的有效性。VFS首先應(yīng)找到要安裝的文件系統(tǒng),通過(guò)查找由file_systems指針指向的鏈表中的每一個(gè)file_system_type數(shù)據(jù)結(jié)構(gòu)來(lái)搜索已知的文件系統(tǒng)(該結(jié)構(gòu)包含文件系統(tǒng)的名字和指向VFS超級(jí)塊讀取程序地址的指針),當(dāng)找到一個(gè)匹配的名字時(shí),就可以得到讀取文件系統(tǒng)超級(jí)塊的程序的地址。接著要查找作為新文件系統(tǒng)安裝點(diǎn)的VFS索引節(jié)點(diǎn),并且在同一目錄下不能安裝多個(gè)文件系統(tǒng)。VFS安裝程序必須分配一個(gè)VFS超級(jí)塊(super_block),并且向它傳遞一些有關(guān)文件系統(tǒng)安裝的信息。申請(qǐng)一個(gè)vfsmount數(shù)據(jù)結(jié)構(gòu)(其中包括存儲(chǔ)文件系統(tǒng)的塊設(shè)備的設(shè)備號(hào)、文件系統(tǒng)安裝的目錄和一個(gè)指向文件系統(tǒng)的VFS超級(jí)塊的指針),并使它的指針指向所分配的VFS超級(jí)塊。當(dāng)文件系統(tǒng)安裝以后,該文件系統(tǒng)的根索引節(jié)點(diǎn)就一直保存在VFS索引節(jié)點(diǎn)緩存中。5.13Linux系統(tǒng)采用哪兩種內(nèi)存管理技術(shù)?各自的基本實(shí)現(xiàn)思想是什么?答:Linux系統(tǒng)采用交換和請(qǐng)求分頁(yè)兩種內(nèi)存管理技術(shù)。請(qǐng)求分頁(yè)存儲(chǔ)管理技術(shù)是在簡(jiǎn)單分頁(yè)存儲(chǔ)技術(shù)基礎(chǔ)上發(fā)展起來(lái)的,它的基本思想是:當(dāng)進(jìn)程運(yùn)行時(shí),不必把整個(gè)進(jìn)程映像都放在內(nèi)存中,只需在內(nèi)存保留當(dāng)前用到的那一部分頁(yè)面。當(dāng)進(jìn)程訪問(wèn)到某些尚未在內(nèi)存的頁(yè)面時(shí),就由核心把這些頁(yè)面裝入內(nèi)存。這種策略使進(jìn)程的虛擬地址空間映射到機(jī)器的物理空間時(shí)具有更大的靈活性,通常允許進(jìn)程的大小可大于可用內(nèi)存的總量,并允許更多進(jìn)程同時(shí)在內(nèi)存中執(zhí)行。內(nèi)存交換的基本思想是:當(dāng)系統(tǒng)中出現(xiàn)內(nèi)存不足時(shí),Linux內(nèi)存管理子系統(tǒng)就釋放一些內(nèi)存頁(yè),從而增加系統(tǒng)中空閑內(nèi)存頁(yè)的數(shù)量,此任務(wù)是由內(nèi)核的交換守護(hù)進(jìn)程kswapd完成的。5.14何謂虛擬存儲(chǔ)器?Linux系統(tǒng)如何支持虛存?答:所謂虛擬存儲(chǔ)器是用戶能作為可編址內(nèi)存對(duì)待的虛擬存儲(chǔ)空間,它使用戶邏輯存儲(chǔ)器與物理存儲(chǔ)器分離,是操作系統(tǒng)給用戶提供的一個(gè)比真實(shí)內(nèi)存空間大得多的地址空間。Linux存儲(chǔ)管理采用請(qǐng)求分頁(yè)技術(shù),請(qǐng)求分頁(yè)提供虛擬存儲(chǔ)器。它的基本思想是:當(dāng)我們要執(zhí)行一個(gè)程序時(shí)才把它換入內(nèi)存;但并不把全部程序都換入內(nèi)存,而是用到哪一頁(yè)時(shí)才換入它。這樣,就減少了對(duì)換時(shí)間和所需內(nèi)存數(shù)量,允許增加程序的道數(shù)。5.15Linux系統(tǒng)中交換空間為何采用連續(xù)空間?答:因?yàn)檫M(jìn)程使用交換空間是臨時(shí)性的,速度是關(guān)鍵性問(wèn)題,系統(tǒng)一次進(jìn)行多個(gè)盤(pán)塊I/O傳輸比每次一塊、多次傳輸?shù)乃俣纫?,所以核心在交換設(shè)備上是分配一片連續(xù)空間,而不管碎片的問(wèn)題。5.16Linux為什么要采用三級(jí)頁(yè)表?該機(jī)制如何工作?答:現(xiàn)在地址碼通常采用32位,這樣,每個(gè)進(jìn)程的虛擬存儲(chǔ)空間可達(dá)4GB。而Linux系統(tǒng)中頁(yè)面的大小為4KB,因此進(jìn)程虛擬存儲(chǔ)空間要?jiǎng)澐譃?20(1M)個(gè)頁(yè)面。如果直接用頁(yè)表描述這種映射關(guān)系,那么每個(gè)進(jìn)程的頁(yè)表就要有220(1M)個(gè)表項(xiàng)。很顯然,用大量的內(nèi)存資源來(lái)存放頁(yè)表是不可取的。為此,Linux系統(tǒng)采用三級(jí)頁(yè)表的方式。Linux系統(tǒng)三級(jí)頁(yè)表地址映射如下圖所示。圖中PGD表示頁(yè)面目錄,PMD表示中間目錄,PT表示頁(yè)表。一個(gè)線性虛擬地址在邏輯上劃分成4個(gè)位段,從高位到低位分別用做檢索頁(yè)面目錄PGD的下標(biāo)、中間目錄PMD的下標(biāo)、頁(yè)表PT的下標(biāo)和物理頁(yè)面(即內(nèi)存塊)內(nèi)的位移。把一個(gè)線性地址映射成物理地址分為以下4步:①以線性地址中最高位段作為下標(biāo),在PGD中找到相應(yīng)的表項(xiàng),該表項(xiàng)指向相應(yīng)的PMD。②以線性地址中第2個(gè)位段作為下標(biāo),在PMD中找到相應(yīng)的表項(xiàng),該表項(xiàng)指向相應(yīng)的PT。③以線性地址中第3個(gè)位段作為下標(biāo),在PT中找到相應(yīng)的表項(xiàng),該表項(xiàng)指向相應(yīng)的物理頁(yè)面(即該物理頁(yè)面的起始地址)。④線性地址中的最低位段是物理頁(yè)面內(nèi)的相對(duì)位移量,此位移量與該物理頁(yè)面的起始地址相加就得到相應(yīng)的物理地址。5.17Linux信號(hào)機(jī)制是如何實(shí)現(xiàn)進(jìn)程通信的?答:信號(hào)機(jī)制是在軟件層次上對(duì)中斷機(jī)制的一種模擬。異步進(jìn)程可以通過(guò)彼此發(fā)送信號(hào)來(lái)實(shí)現(xiàn)簡(jiǎn)單通信。系統(tǒng)預(yù)先規(guī)定若干個(gè)不同類(lèi)型的信號(hào),各表示發(fā)生了不同的事件,每個(gè)信號(hào)對(duì)應(yīng)一個(gè)編號(hào)。運(yùn)行進(jìn)程當(dāng)遇到相應(yīng)事件或者出現(xiàn)特定要求時(shí),就把一個(gè)信號(hào)寫(xiě)到相應(yīng)進(jìn)程task_struct結(jié)構(gòu)的signal位圖中。接收信號(hào)的進(jìn)程在運(yùn)行過(guò)程中要檢測(cè)自身是否收到了信號(hào),如果已收到信號(hào),則轉(zhuǎn)去執(zhí)行預(yù)先規(guī)定好的信號(hào)處理程序。處理之后,再返回原先正在執(zhí)行的程序。5.18管道文件如何實(shí)現(xiàn)兩個(gè)進(jìn)程間的通信?答:管道文件是連接兩個(gè)命令的一個(gè)打開(kāi)文件。一個(gè)命令向該文件中寫(xiě)入數(shù)據(jù),稱作寫(xiě)者;另一個(gè)命令從該文件中讀出數(shù)據(jù),稱作讀者。系統(tǒng)自動(dòng)處理二者之間的同步、調(diào)度和緩沖。利用管道文件可以實(shí)現(xiàn)兩個(gè)或多個(gè)進(jìn)程間的直接通信。5.19Linux系統(tǒng)中設(shè)備驅(qū)動(dòng)分層結(jié)構(gòu)是怎樣的?如何實(shí)現(xiàn)與設(shè)備的無(wú)關(guān)性?答:設(shè)備驅(qū)動(dòng)的分層結(jié)構(gòu)自頂向下依次為:應(yīng)用層、文件系統(tǒng)層、設(shè)備驅(qū)動(dòng)層、物理設(shè)備層。Linux系統(tǒng)采用設(shè)備文件統(tǒng)一管理硬件設(shè)備,從而將硬件設(shè)備的特性及管理細(xì)節(jié)對(duì)用戶隱藏起來(lái),實(shí)現(xiàn)用戶程序與設(shè)備無(wú)關(guān)性。5.20Linux系統(tǒng)中可安裝模塊的思想是什么?答:可安裝模塊是可以在系統(tǒng)運(yùn)行時(shí)動(dòng)態(tài)地安裝和拆卸的內(nèi)核模塊。利用這個(gè)機(jī)制,可以根據(jù)需要在不必對(duì)內(nèi)核重新編譯連接的條件下,將可安裝模塊動(dòng)態(tài)插入運(yùn)行中的內(nèi)核,成為其中一個(gè)有機(jī)組成部分;或者從內(nèi)核卸載已安裝的模塊。設(shè)備驅(qū)動(dòng)程序或者與設(shè)備驅(qū)動(dòng)緊密相關(guān)的部分(如文件系統(tǒng))都是利用可安裝模塊實(shí)現(xiàn)的。5.21什么是中斷?中斷的一般處理過(guò)程是什么?答:所謂中斷是指CPU對(duì)系統(tǒng)發(fā)生的某個(gè)事件作出的一種反應(yīng)——CPU暫停正在執(zhí)行的程序,保留現(xiàn)場(chǎng)后自動(dòng)地執(zhí)行相應(yīng)的處理程序,處理完該事件后,如被中斷進(jìn)程的優(yōu)先級(jí)最高,則返回?cái)帱c(diǎn)繼續(xù)執(zhí)行被“打斷”的程序。中斷的一般處理過(guò)程:保存被中斷程序的現(xiàn)場(chǎng),分析中斷原因,轉(zhuǎn)入相應(yīng)處理程序進(jìn)行處理,恢復(fù)被中斷程序現(xiàn)場(chǎng)(即中斷返回)。5.22Linux系統(tǒng)怎樣處理系統(tǒng)調(diào)用?答:Linux的系統(tǒng)調(diào)用是通過(guò)中斷指令I(lǐng)NT0x80實(shí)現(xiàn)的。當(dāng)CPU執(zhí)行到中斷指令I(lǐng)NT0x80時(shí),硬件就作出一系列響應(yīng),其動(dòng)作與中斷響應(yīng)相同。CPU穿過(guò)陷阱門(mén),從用戶空間進(jìn)入系統(tǒng)空間。相應(yīng)地,進(jìn)程的上下文從用戶堆棧切換到系統(tǒng)堆棧。接著運(yùn)行內(nèi)核函數(shù)system_call()。首先,進(jìn)一步保存各寄存器的內(nèi)容;接著調(diào)用syscall_trace(),以系統(tǒng)調(diào)用號(hào)為下標(biāo)檢索系統(tǒng)調(diào)用入口表sys_call_table,從中找到相應(yīng)的函數(shù);然后,轉(zhuǎn)去執(zhí)行該函數(shù),完成具體的服務(wù)。執(zhí)行完服務(wù)程序,核心檢查是否發(fā)生錯(cuò)誤,并作相應(yīng)處理。如果本進(jìn)程收到信號(hào),則對(duì)信號(hào)作相應(yīng)處理。最后進(jìn)程從系統(tǒng)空間返回到用戶空間。思考題66.1gcc編譯過(guò)程一般分為哪幾個(gè)階段?各階段的主要工作是什么?答:gcc編譯過(guò)程可以分為4個(gè)階段,包括預(yù)處理(Preprocessing)、編譯(Compiling)、匯編(Assembling)和連接(Linking)?!耦A(yù)處理程序讀取C語(yǔ)言源文件,對(duì)其中以“#”開(kāi)頭的指令(偽指令)和特殊符號(hào)進(jìn)行處理。●編譯程序?qū)︻A(yù)處理之后的輸出文件進(jìn)行詞法分析和語(yǔ)法分析,試圖找出所有不符合語(yǔ)法規(guī)則的部分,并根據(jù)問(wèn)題的大小做出不同處理。在確定各成分都符合語(yǔ)法規(guī)則后,將其“翻譯”為功能等價(jià)的中間代碼表示或者匯編代碼?!駞R編程序把匯編語(yǔ)言代碼翻譯成目標(biāo)機(jī)器代碼?!襁B接程序要解決外部符號(hào)訪問(wèn)地址問(wèn)題,也就是將一個(gè)文件中引用的符號(hào)(如變量或函數(shù)調(diào)用)與該符號(hào)在另外一個(gè)文件中的定義連接起來(lái),從而使有關(guān)的目標(biāo)文件連成一個(gè)整體,最終成為可被操作系統(tǒng)執(zhí)行的可執(zhí)行文件。6.2對(duì)C語(yǔ)言程序進(jìn)行編譯時(shí),針對(duì)以下情況應(yīng)使用的編譯命令行是什么?(1)只生成目標(biāo)文件,不進(jìn)行連接。(2)在預(yù)處理后的輸出中保留源文件中的注釋。(3)將輸出寫(xiě)到file指定的文件中。(4)指示編譯程序在目標(biāo)代碼中加入供調(diào)試程序gdb使用的附加信息。(5)連接時(shí)搜索由library命名的庫(kù)。答:(1)只生成目標(biāo)文件,不進(jìn)行連接:gcc-c源文件名(2)在預(yù)處理后的輸出中保留源文件中的注釋:gcc-C源文件名(3)將輸出寫(xiě)到file指定的文件中:gcc-ofile源文件名(4)指示編譯程序在目標(biāo)代碼中加入供調(diào)試程序gdb使用的附加信息:gcc-g源文件名(5)連接時(shí)搜索由library命名的庫(kù):gcc-llibrary源文件名6.3通常,程序中的錯(cuò)誤按性質(zhì)分為哪三種?答:程序中的錯(cuò)誤按其性質(zhì)可分為以下三種:(1)編譯錯(cuò)誤,即語(yǔ)法錯(cuò)誤。(2)運(yùn)行錯(cuò)誤。(3)邏輯錯(cuò)誤。6.4gdb主要幫助用戶在調(diào)試程序時(shí)完成哪些工作?答:gdb主要幫助用戶在調(diào)試程序時(shí)完成四方面的工作:(1)啟動(dòng)程序,可以按用戶要求影響程序的運(yùn)行行為。(2)使運(yùn)行程序在指定條件處停止。(3)當(dāng)程序停止時(shí),檢查它出現(xiàn)了什么問(wèn)題。(4)動(dòng)態(tài)改變程序的執(zhí)行環(huán)境,這樣就可以糾正一個(gè)錯(cuò)誤的影響,然后再糾正其他錯(cuò)誤。6.5調(diào)試下面的程序:/*badprog.c錯(cuò)誤地訪問(wèn)內(nèi)存*/#include<stdio.h>#include<stdlib.h>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;}答:這是上機(jī)操作題。先利用gcc-gbadprog.c-obadprog對(duì)源文件進(jìn)行編譯;通過(guò)編譯后,運(yùn)行badprog文件,看看出現(xiàn)什么問(wèn)題;然后利用gdb工具調(diào)試該程序。參考書(shū)中6.2.6節(jié)的示例,依據(jù)調(diào)試時(shí)實(shí)際顯示的即時(shí)信息,分析可能的原因(注意數(shù)組大小?。?,使用相應(yīng)的命令一步步調(diào)試,直至找出問(wèn)題根源;然后予以改正,再重新編譯、運(yùn)行。6.6調(diào)試下面的程序:/*callstk.c有3個(gè)函數(shù)調(diào)用深度的調(diào)用鏈*/#include<stdio.h>#include<stdlib.h>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;}答:這是上機(jī)操作題。體會(huì)函數(shù)調(diào)用的層次關(guān)系。6.7GNUmake的工作過(guò)程是怎樣的?答:GNUmake的工作過(guò)程是:①依次讀入各makefile文件;②初始化文件中的變量;③推導(dǎo)隱式規(guī)則,并分析所有規(guī)則;④為所有的目標(biāo)文件創(chuàng)建依賴關(guān)系鏈;⑤根據(jù)依賴關(guān)系和時(shí)間數(shù)據(jù),確定哪些目標(biāo)文件要重新生成;⑥執(zhí)行相應(yīng)的生成命令。6.8makefile的作用是什么?其書(shū)寫(xiě)規(guī)則是怎樣的?答:makefile文件是make命令必備的一個(gè)文本形式的數(shù)據(jù)庫(kù)文件,它定義了一系列規(guī)則,記錄了文件之間的依賴關(guān)系及在此依賴關(guān)系基礎(chǔ)上所應(yīng)執(zhí)行的命令序列,即定義了一系列規(guī)則來(lái)指定哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯等。此外,還可以有變量定義、注釋等。makefile的通用形式如下所示:目標(biāo)文件:[相依文件…]<tab>命令1[#注釋]…<tab>命令n[#注釋]其書(shū)寫(xiě)規(guī)則是:依賴行從一行的開(kāi)頭開(kāi)始書(shū)寫(xiě)。各命令行單獨(dú)占一行,每個(gè)命令行的第一個(gè)字符必須是制表符<tab>,而不能使用8個(gè)空格;#號(hào)后的內(nèi)容為注釋。它可以位于一行的開(kāi)頭;在依賴行上,目標(biāo)文件和相依文件之間要用一個(gè)或兩個(gè)冒號(hào)分開(kāi)。一個(gè)目標(biāo)文件可以出現(xiàn)在多個(gè)依賴行上,此時(shí)所有的依賴行的類(lèi)型必須一致(一個(gè)冒號(hào)或兩個(gè)冒號(hào))。6.9設(shè)某個(gè)正在開(kāi)發(fā)的程序由以下內(nèi)容組成:①4個(gè)C語(yǔ)言源文件:a.c,b.c,c.c和d.c。設(shè)b.c和d.c都使用了defs.h中的聲明。②匯編語(yǔ)言源文件assmb.s被某個(gè)C語(yǔ)言源文件調(diào)用。③使用了在/home/user/lib/libm.so中的一組例程。設(shè)最后生成的可執(zhí)行文件名為prog。試編寫(xiě)相應(yīng)的makefile文件。答:先根據(jù)題意,畫(huà)出依賴關(guān)系圖,再編寫(xiě)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)用?什么是庫(kù)函數(shù)?二者有何異同?答:系統(tǒng)調(diào)用是操作系統(tǒng)內(nèi)核提供的、與用戶程序之間的接口,也就是操作系統(tǒng)提供給程序員的接口,一般位于操作系統(tǒng)核心的最高層。庫(kù)函數(shù):由系統(tǒng)提供,用于解決共性問(wèn)題,為程序的開(kāi)發(fā)和執(zhí)行提供方便的程序,本身并不屬于操作系統(tǒng)的內(nèi)核部分。相同點(diǎn):系統(tǒng)調(diào)用和庫(kù)函數(shù)都是由程序代碼構(gòu)成,二者調(diào)用方式相同,都需要在調(diào)用時(shí)傳送參數(shù),實(shí)參的個(gè)數(shù)、出現(xiàn)的次序和實(shí)參的類(lèi)型與原型說(shuō)明中形參表的設(shè)計(jì)相同。區(qū)別:庫(kù)函數(shù)調(diào)用依賴于所運(yùn)行的用戶環(huán)境,程序調(diào)用庫(kù)函數(shù)時(shí),它運(yùn)行的目標(biāo)代碼是屬于程序的,程序處于“用戶態(tài)”執(zhí)行;而系統(tǒng)調(diào)用的使用不依賴于它運(yùn)行的用戶環(huán)境,是操作系統(tǒng)內(nèi)核提供的低層服務(wù),系統(tǒng)調(diào)用時(shí)所執(zhí)行的代碼是屬于內(nèi)核的,程序處于“核心態(tài)”執(zhí)行。庫(kù)函數(shù)的調(diào)用最終還是要通過(guò)系統(tǒng)調(diào)用來(lái)實(shí)現(xiàn),庫(kù)函數(shù)一般執(zhí)行一條指令,該指令(操作系統(tǒng)陷阱operatingsystemtrap)將進(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)程序代碼中用到的宏定義、類(lèi)型定義、全稱變量及函數(shù)說(shuō)明等。2、在C語(yǔ)言程序中,系統(tǒng)調(diào)用的調(diào)用方式與調(diào)用庫(kù)函數(shù)相同,即調(diào)用時(shí),提供的實(shí)參的個(gè)數(shù)、出現(xiàn)的順序和實(shí)參的類(lèi)型應(yīng)與原型說(shuō)明中形參表的設(shè)計(jì)相同。7.3編寫(xiě)一個(gè)程序,把一個(gè)文件的內(nèi)容復(fù)制到另一個(gè)文件上,即實(shí)現(xiàn)簡(jiǎn)單的copy功能。要求:只用open(),read(),write()和close()系統(tǒng)調(diào)用,程序的第一個(gè)參數(shù)是源文件,第二個(gè)參數(shù)是目的文件。答:(上機(jī)題)該程序?qū)?yīng)命令的使用格式是:命令名源文件目的文件#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<errno.h>#include<stdio.h>#include<stdlib.h>#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);//以只讀方式打開(kāi)源文件fd2=open(argv[2],O_CREAT|O_RDWR,S_IRWXU);//打開(kāi)目的文件,不存在則創(chuàng)建if(fd1<0||fd2<0){ fprintf(stderr,"Cannotopenafile!\n"); return1;}while((N=read(fd1,buf,SIZE))>0)write(fd2,buf,N);//從源文件讀,寫(xiě)入目的文件,實(shí)現(xiàn)copy功能close(fd1);close(fd2);return0;}7.4編寫(xiě)一個(gè)程序,它把給定的正文插入到文件的任意指定位置,并輸出最后結(jié)果。答:(上機(jī)題)該程序?qū)?yīng)命令的使用格式是:命令名待插入文件名#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<errno.h>#include<stdio.h>#include<stdlib.h>#include<string.h>#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);//將輸入的文本寫(xiě)到文件指定位置write(fd,str,strlen(str));lseek(fdtmp,0,SEEK_SET);//將輔助文件的內(nèi)容寫(xiě)回,實(shí)現(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編寫(xiě)一個(gè)程序,它首先打開(kāi)一個(gè)文件,然后利用fork()創(chuàng)建一個(gè)子進(jìn)程;隨后,當(dāng)父進(jìn)程運(yùn)行時(shí)先執(zhí)行wait();父子進(jìn)程都打印自己和其父進(jìn)程的ID號(hào);并且,二者都向該文件寫(xiě)入(利用write)一條信息,表明是在哪個(gè)進(jìn)程中。試問(wèn):如果沒(méi)有wait調(diào)用,會(huì)出現(xiàn)什么情況?答:(上機(jī)題)該程序?qū)?yīng)命令的使用格式是:命令名文件名#include<sys/stat.h>#include<sys/types.h>#include<sys/wait.h>#include<unistd.h>#include<stdio.h>#include<stdlib.h>#include<fcntl.h>#include<errno.h>#include<string.h>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){//打開(kāi)文件,文件名由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){//子進(jìn)程printf("\n\nInthchildprocess\n");printf("CurrentProcessID:%d\n",getpid());printf("ParentProcessID:%d\n",getppid());write(file,buf_child,strlen(buf_child));}elseif(pid>0){//父進(jìn)程wait(NULL);//等待子進(jìn)程完成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()可以實(shí)現(xiàn)父子進(jìn)程的同步,即:保證子進(jìn)程輸出在前,父進(jìn)程輸出在后。如果沒(méi)有wait(),則輸出結(jié)果的先后順序會(huì)有隨機(jī)性,那樣,每次運(yùn)行的結(jié)果都有可能不同。7.6編寫(xiě)一個(gè)程序,盡可能多地輸出有關(guān)當(dāng)前進(jìn)程的信息:PID、PPID、打開(kāi)文件、當(dāng)前目錄、nice值等。請(qǐng)簡(jiǎn)要說(shuō)明,如何確定哪些文件是打開(kāi)的?如何確定多個(gè)文件描述符表示同一個(gè)文件?答:(上機(jī)題)該程序?qū)?yīng)命令的使用方式是:命令名文件1文件2#include<sys/stat.h>#include<sys/types.h>#include<unistd.h>#include<stdio.h>#include<stdlib.h>#include<fcntl.h>#include<sys/time.h>#include<sys/resource.h>#include<string.h>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)計(jì)打開(kāi)的文件數(shù)量return0;}利用getpid()獲取當(dāng)前進(jìn)程的id,假設(shè)為3724。然后進(jìn)入目錄/proc/3724/fd,利用命令ls-l可以看出該進(jìn)程打開(kāi)了哪些文件。系統(tǒng)為每個(gè)進(jìn)程自動(dòng)打開(kāi)三個(gè)標(biāo)準(zhǔn)文件(即標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和錯(cuò)誤輸出),其文件描述符分別為0,1和2,本題給出的參考代碼中,打開(kāi)了兩個(gè)文件,這樣可以更加清楚的看到進(jìn)程打開(kāi)的所有文件。如果文件描述符后面->所指向的文件名稱一致,則代表這些文件描述符對(duì)應(yīng)同一個(gè)文件。運(yùn)行本代碼時(shí),可以讓文件1和文件2這兩個(gè)參數(shù)相同,即同一個(gè)文件打開(kāi)兩次,能夠看到不同的文件描述符對(duì)應(yīng)了同一個(gè)文件的情況。另外,root用戶還可以使用lsof命令查看某進(jìn)程所打開(kāi)的文件信息:#lsof–p進(jìn)程號(hào)7.7編寫(xiě)一個(gè)管道程序,它所創(chuàng)建的管道等價(jià)于下面的shell管道:$echogoodmorning|seds/good/hi/g該程序的實(shí)現(xiàn)過(guò)程是:調(diào)用pipe()建立一個(gè)管道,利用fork()創(chuàng)建兩個(gè)子進(jìn)程:一個(gè)是左側(cè)進(jìn)程,另一個(gè)是右側(cè)進(jìn)程。左側(cè)進(jìn)程使用close(pipefd[0])關(guān)閉管道讀取端,使用close(1)關(guān)閉最初的標(biāo)準(zhǔn)輸出,使用dup(pipefd[1])將管道的寫(xiě)入端改為文件描述符1,使用close(pipefd[1])關(guān)閉打開(kāi)文件描述符的一個(gè)副本,調(diào)用ex關(guān)閉打開(kāi)文件描述符的一個(gè)副本,調(diào)用execvp()啟動(dòng)運(yùn)行的程序。在父進(jìn)程中,關(guān)閉管道的兩端:close(pipefd[0])和close(pipefd[1])。最后,在父進(jìn)程中使用wait()等待兩個(gè)子進(jìn)程結(jié)束。答:(上機(jī)題)#include<unistd.h>#include<stdio.h>#include<errno.h>#include<sys/types.h>#include<stdlib.h>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è)子進(jìn)程 fprintf(stderr,"%s:forkofleftchildfailed:%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í)行echogoodmorning,結(jié)果寫(xiě)入管道}if((rightpid=fork())<0){//創(chuàng)建右側(cè)子進(jìn)程 fprintf(stderr,"%s:forkofrightchildfailed:%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)建一個(gè)消息隊(duì)列,輸出其隊(duì)列ID。然后再次調(diào)用msgget()打開(kāi)已有的隊(duì)列。如果兩次得到的ID相同,則顯示打開(kāi)隊(duì)列的I

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論