




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
PAGEPAGE35操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書實(shí)驗(yàn)1操作系統(tǒng)環(huán)境通過調(diào)查研究活動和對Windows、Linux系統(tǒng)運(yùn)行的觀察分析,回顧計(jì)算環(huán)境的基本術(shù)語,加深理解有關(guān)操作系統(tǒng)的基礎(chǔ)概念,掌握主流操作系統(tǒng)的命令和圖形界面,學(xué)會在操作系統(tǒng)上的主要系統(tǒng)管理操作。1.1操作系統(tǒng)的計(jì)算環(huán)境1.2Windowsxp系統(tǒng)管理1.3訪問Linux系統(tǒng)§1.1操作系統(tǒng)的計(jì)算環(huán)境背景知識本實(shí)驗(yàn)幫助回顧Windowsxp/XP、UNIX和Linux的計(jì)算環(huán)境術(shù)語,加深理解有關(guān)操作系統(tǒng)的基礎(chǔ)概念。調(diào)查在學(xué)?;蚱渌麢C(jī)構(gòu)中Windows、UNIX和Linux的使用情況,看哪些機(jī)構(gòu)在使用Windows、UNIX或者Linux系統(tǒng);研究Web站點(diǎn),看哪些因特網(wǎng)網(wǎng)站(尤其是簡體中文網(wǎng)站)分別支持著Windows、UNIX和Linux操作系統(tǒng)的應(yīng)用。實(shí)驗(yàn)?zāi)康耐ㄟ^實(shí)驗(yàn),加深對以下內(nèi)容的理解基本的計(jì)算機(jī)硬件組件;計(jì)算機(jī)操作系統(tǒng);Windows的發(fā)展和版本UNIX和Linux的歷史和版本;Windowsxp、UNIX或Linux操作環(huán)境。調(diào)查在機(jī)構(gòu)、學(xué)校和學(xué)生中Windows、UNIX和Linux操作系統(tǒng)的使用情況,分別研究支持Windows和Linux的Web站點(diǎn)。工具/準(zhǔn)備工作在開始本實(shí)驗(yàn)之前,請回顧教科書的相關(guān)內(nèi)容,聯(lián)系指導(dǎo)老師或者熟識網(wǎng)絡(luò)技術(shù)的人士,如學(xué)?;蚱髽I(yè)信息技術(shù)部門的職員,了解學(xué)校或者其他機(jī)構(gòu)中使用了哪些服務(wù)器和網(wǎng)絡(luò)操作系統(tǒng),找出是否在用WindowsNT/2000/XP、UNIX和Linux以及在哪里使用這些操作系統(tǒng),需要準(zhǔn)備一臺帶有瀏覽器,能夠訪問因特網(wǎng)的計(jì)算機(jī)。實(shí)驗(yàn)內(nèi)容與步驟1、識別一臺計(jì)算機(jī)的4個(gè)主要硬件組成部分2、復(fù)習(xí)3個(gè)概念:內(nèi)核、shell、文件系統(tǒng)3、Windowsxp/XP操作系統(tǒng)的主要優(yōu)點(diǎn)是什么?4、UNIX操作系統(tǒng)的主要優(yōu)點(diǎn)是什么?5、Linux操作系統(tǒng)的主要優(yōu)點(diǎn)是什么?6、列舉Linux操作系統(tǒng)的主要組成部分7、Linux內(nèi)核管理著哪幾件事情?8、Linux系統(tǒng)的主要shell的名字和它們各自默認(rèn)的提示符是什么?9、操作系統(tǒng)的文件系統(tǒng)由哪幾部分組成的?10、在指導(dǎo)老師或者信息技術(shù)人員的幫助下,找出在學(xué)校或者其他機(jī)構(gòu)中使用的幾種操作系統(tǒng)。請列舉其版本、支持廠商和服務(wù)器的功能,通過有關(guān)教科書和對Web網(wǎng)站的搜索了解,列舉出你找到的Linux發(fā)行版本及其支持廠商和網(wǎng)站?!?.2Windowsxp系統(tǒng)管理背景知識WindowsxpProfessional的“管理工具”中集成了許多系統(tǒng)管理工具,利用這些工具,管理員可以方便地實(shí)現(xiàn)各種系統(tǒng)維護(hù)和管理功能。這些工具集中在“控制面板”的“管理工具”選項(xiàng)下,用戶和管理員可以很容易地對它們操作和使用。默認(rèn)情況下,只有一些常用工具隨Windowsxp系統(tǒng)的安裝而安裝:服務(wù):啟動和停止由Windows系統(tǒng)提供的各項(xiàng)服務(wù)計(jì)算機(jī)管理器:管理磁盤以及使用其他系統(tǒng)工具來管理本地或遠(yuǎn)程計(jì)算機(jī)事件查看器:顯示來自于Window和其他程序的監(jiān)視與排錯(cuò)信息數(shù)據(jù)源(ODBC):添加、刪除以及配置ODBC數(shù)據(jù)源和驅(qū)動程序性能:顯示系統(tǒng)性能圖表以及配置數(shù)據(jù)日志和警報(bào)組件服務(wù):配置并管理COM+應(yīng)用程序另一些工具則隨系統(tǒng)服務(wù)的安裝而添加到系統(tǒng)中,例如:Telnet服務(wù)器管理:查看以及修改Telnet服務(wù)器設(shè)置和連接Internet服務(wù)管理器:管理IIS、Internet和IntranetWeb站點(diǎn)的Web服務(wù)器本地安全策略:查看和修改本地安全策略,諸如用戶權(quán)限和審計(jì)策略實(shí)驗(yàn)?zāi)康牧私夂蛯W(xué)習(xí)Windows系統(tǒng)管理工具及其使用熟悉Windows系統(tǒng)工具的內(nèi)容和應(yīng)用由此,進(jìn)一步熟悉Windows操作系統(tǒng)的應(yīng)用環(huán)境工具/準(zhǔn)備工作在開始本實(shí)驗(yàn)之前,請回顧教科書的相關(guān)內(nèi)容,需要準(zhǔn)備一臺運(yùn)行WindowsxpProfessional操作系統(tǒng)的計(jì)算機(jī)實(shí)驗(yàn)內(nèi)容與步驟為了幫助用戶管理和監(jiān)視系統(tǒng),Windowsxp提供了多種系統(tǒng)管理工具,其中最主要的有:計(jì)算機(jī)管理,事件查看器,性能監(jiān)視,服務(wù),數(shù)據(jù)源(ODBC)。步驟1:登錄進(jìn)入WindowsxpProfessional。步驟2:在“開始”菜單中單擊“設(shè)置”-“控制面板”命令,雙擊“管理工具”圖標(biāo)。在本地計(jì)算機(jī)“管理工具”組中,有哪些系統(tǒng)管理工具,基本功能是什么?使用“計(jì)算機(jī)管理”可通過一個(gè)合并的桌面工具來管理本地或遠(yuǎn)程計(jì)算機(jī),它將幾個(gè)Windowsxp管理實(shí)用程序合并到一個(gè)控制臺目錄樹中,使管理員可以輕松地訪問特定計(jì)算機(jī)的管理屬性和工具。步驟3:在“管理工具”窗口中,雙擊“計(jì)算機(jī)管理”圖標(biāo)?!坝?jì)算機(jī)管理”使用的窗口與“Windows資源管理器”相似。在用于導(dǎo)航和工具選擇的控制臺目錄樹中有“系統(tǒng)工具”、“存儲”及“服務(wù)和應(yīng)用程序”等節(jié)點(diǎn),窗口右側(cè)“名稱”窗格中顯示了工具的名稱、類型或可用的子工具等。事件查看器不但可以記錄各種應(yīng)用程序錯(cuò)誤、損壞的文件、丟失的數(shù)據(jù)以及其他問題,而且還可以把系統(tǒng)和網(wǎng)絡(luò)的問題作為事件記錄下來。管理員通過查看在事件查看器中顯示的系統(tǒng)信息,可以迅速診斷和糾正可能發(fā)生的錯(cuò)誤和問題。步驟4:在“管理工具”窗口中,雙擊“事件查看器”圖標(biāo)。步驟5:在事件查看器中觀察“應(yīng)用程序日志”:本地計(jì)算機(jī)中,共有______________個(gè)應(yīng)用程序日志事件。步驟6:單擊“查看”菜單中的“篩選”命令,系統(tǒng)日志包括的事件類型有哪些?“性能”監(jiān)視工具通過圖表、日志和報(bào)告,使管理員可以看到特定的組件和應(yīng)用進(jìn)程的資源使用情況。利用性能監(jiān)視器,可以測量計(jì)算機(jī)的性能,識別以及診斷計(jì)算機(jī)可能發(fā)生的錯(cuò)誤,并且可以為某應(yīng)用程序或者附加硬件制作計(jì)劃。另外,當(dāng)資源使用達(dá)到某一限定值時(shí),也可以使用警報(bào)來通知管理員。步驟7:在“管理工具”窗口中,雙擊“性能”圖標(biāo)?!靶阅堋贝翱诘目刂婆_目錄樹中包括的節(jié)點(diǎn)有哪些?步驟8:在“管理工具”窗口中,雙擊“服務(wù)”圖標(biāo)。在你的本地計(jì)算機(jī)中,管理著______個(gè)系統(tǒng)服務(wù)項(xiàng)目。通過觀察,重點(diǎn)描述你所感興趣的5個(gè)系統(tǒng)服務(wù)項(xiàng)目ODBC,即開放數(shù)據(jù)庫連接。通過ODBC可以訪問來自多種數(shù)據(jù)庫管理系統(tǒng)的數(shù)據(jù)。例如,ODBC數(shù)據(jù)源會允許一個(gè)訪問SQL數(shù)據(jù)庫中數(shù)據(jù)的程序,同時(shí)訪問VisualFoxPro數(shù)據(jù)庫中的數(shù)據(jù)。為此,必須為系統(tǒng)添加稱為“驅(qū)動程序”軟件組件。步驟9:在“管理工具”窗口中,雙擊“數(shù)據(jù)源(ODBC)”圖標(biāo),打開“ODBC數(shù)據(jù)源管理器”對話框,請描述其中各選項(xiàng)卡的功能步驟10:單擊“驅(qū)動程序”選項(xiàng)卡,試分析,系統(tǒng)為哪些數(shù)據(jù)源缺省安裝了ODBC驅(qū)動程序§1.3訪問Linux系統(tǒng)背景知識Linux是一個(gè)與DOS或Windows完全不同的操作環(huán)境,具有它自己獨(dú)特的風(fēng)格1、登錄Linux和使用GNOME首先回顧Linux登錄ID和口令的要求,使用標(biāo)準(zhǔn)圖形用戶界面GNOME練習(xí)登錄Linux系統(tǒng),并修改登錄口令接著,學(xué)習(xí)使用GNOME。GNOME是優(yōu)秀的Linux桌面平臺,也是目前Linux各版本中使用的對國際化支持最好的桌面平臺。使用GNOME需要熟悉面板,練習(xí)使用鼠標(biāo)和鍵盤管理視窗;還需要練習(xí)工作空間的切換和使用工作空間菜單然后通過Linux系統(tǒng)的Shell、Linux文件、目錄和權(quán)限等諸方面來掌握Linux系統(tǒng)管理的有關(guān)知識最后,退出(或者注銷)并返回Linux登錄界面2、Linux系統(tǒng)的Shell使用Linux系統(tǒng)時(shí),用戶多數(shù)時(shí)間是通過Shell與系統(tǒng)進(jìn)行對話的。Shell是一個(gè)接收用戶輸入命令并將其轉(zhuǎn)換成指令的程序,它是用戶與Linux系統(tǒng)之間的界面之一。Linux系統(tǒng)中可以使用的Shell包括:bash:BourneAgainShell。這是Linux系統(tǒng)上最常用的Shell,它合乎POSIX標(biāo)準(zhǔn)且相容于BourneShell,是GNU工程(自由軟件基金會)的產(chǎn)物,并且提供了編輯命令行的功能csh:CShell。由Berkeley(伯克利大學(xué))開發(fā),與BourneShell在交互式使用上很多是相兼容的,但在程序設(shè)計(jì)界面上卻有很大的不同。它不提供編輯命令行的功能,但它有類似的功能叫命令歷史記錄ksh:KornShell。在UNIX系統(tǒng)下得到普遍使用,并最早將現(xiàn)代Shell技術(shù)(包括取自CShell的部分)引入BourneShell,提供了編輯命令行功能sh:BourneShell。是原始的Shell,不提供編輯命令行功能tcsh:CShell的加強(qiáng)版,提供了編輯命令行的功能zsh:ZShell。最新的Shell,與BourneShell兼容,提供編輯命令行的功能3、Linux系統(tǒng)的文件、目錄和權(quán)限Linux的文件名與DOS有許多相似之處也有其自身的特點(diǎn)Linux文件名沒有標(biāo)準(zhǔn)格式。通常文件名中可以包含任何字符(“/”字符除外,“~”字符不能作為文件名的第一個(gè)字符),文件名的長度限制在256個(gè)字符以內(nèi)。Linux的文件名也提供了功能強(qiáng)大且精確的通配符。文件的權(quán)限是Linux系統(tǒng)安全的核心部分,包括:Read(可讀)權(quán)限:表示可以讀取文件內(nèi)的數(shù)據(jù)Write(可寫)權(quán)限:表示可以改變或刪除該文件Execute(可執(zhí)行)權(quán)限:表示可以把該文件當(dāng)成程序執(zhí)行除文件權(quán)限之外,Linux系統(tǒng)上還有目錄和很多其他類型的文件,其中包括特殊文件(設(shè)備)、Socket和符號連接等等(平時(shí)我們經(jīng)常使用的Windows設(shè)備如軟驅(qū)、光驅(qū)等在Linux中也是一種特殊的文件)擁有root口令的用戶稱為超級用戶,超級用戶有權(quán)訪問整個(gè)系統(tǒng),包括建立普通用戶帳號、修改密碼、安裝與卸載軟件等一切權(quán)限。超級用戶的提示符為“#”,普通用戶提示符為“$”幾個(gè)用戶在一個(gè)系統(tǒng)下共用一個(gè)帳號,其個(gè)人文件的安全就得不到保障。建立普通用戶帳號后,系統(tǒng)能保證用戶是唯一能夠存取其個(gè)人文件的人。另一方面,即使沒有與人共享一個(gè)系統(tǒng),建立普通用戶帳號也是必要的。因?yàn)槿绻偸且猿売脩舻卿涍M(jìn)行操作(超級用戶的權(quán)限是整個(gè)系統(tǒng)),一旦出現(xiàn)誤操作(如:破壞或移動、刪除一個(gè)重要的系統(tǒng)文件)處理起來也很棘手。4、Linux文件系統(tǒng)Linux的文件系統(tǒng)是文件和目錄層次的集合。了解Linux文件系統(tǒng)的結(jié)構(gòu)有助于更好地理解和使用Linux。在Linux文件系統(tǒng)根目錄下,有如下子目錄:bin、dev、etc、home、install、lib、mnt、proc、root、tmp、user、var(不同版本,目錄會略有不同)。/bin目錄該目錄中存放許多基本的系統(tǒng)程序。/dev目錄該目錄中存放的文件是設(shè)備驅(qū)動程序,用來訪問系統(tǒng)設(shè)備和資源,如磁盤設(shè)備、調(diào)制解調(diào)器、內(nèi)存等實(shí)驗(yàn)?zāi)康?、登錄Linux和熟悉GNOME通過登錄Linux操作理解以下內(nèi)容:1)Linux登錄ID的要求。2)在GNOME環(huán)境下登錄進(jìn)入Linux系統(tǒng)。3)修改口令。4)正確退出或者注銷Linux系統(tǒng)。通過以下操作熟悉GNOME界面:1)回顧GNOME面板圖標(biāo)和菜單。2)管理GNOME視窗。2、使用LinuxShell1)了解用戶Linux環(huán)境所使用的Shell。2)更改用戶系統(tǒng)的Shell。3)初步了解bash。3、熟悉Linux的文件和目錄1)掌握Linux文件名通配符的使用。2)了解Linux系統(tǒng)目錄的特點(diǎn)。4、了解Linux文件系統(tǒng)1)了解Linux文件系統(tǒng)根目錄的子目錄。2)了解/bin目錄中的文件。3)了解/dev目錄中的文件。工具/準(zhǔn)備工作在開始本實(shí)驗(yàn)之前,請回顧教科書中的相關(guān)內(nèi)容,需要做以下準(zhǔn)備:1)由指導(dǎo)老師分配的Linux登錄用戶ID(如user2)和口令2)一臺運(yùn)行RedHatLinux操作系統(tǒng)并帶有GNOME的計(jì)算機(jī)實(shí)驗(yàn)內(nèi)容與步驟登錄規(guī)則和口令規(guī)則列舉至少2條Linux登錄ID的規(guī)則或者要求,列舉至少3條Linux口令的規(guī)則或者要求2、登錄Linux獲取用戶名和口令,在帶有GNOME登錄界面的Linux工作站上執(zhí)行以下步驟完成本實(shí)驗(yàn)環(huán)節(jié):步驟1:開機(jī),啟動RedHatLinux系統(tǒng),在系統(tǒng)登錄界面的左下方單擊“會話”,在屏幕上彈出的菜單中選擇會話方式,我們選擇“GNOME”,單擊“確定”按鈕。步驟2:使用分配的用戶名登錄。將這個(gè)用戶名輸入在歡迎界面的“用戶”輸入框中,回車后再輸入分配的口令并回車。系統(tǒng)顯示RedHatLinux桌面。步驟3:單擊屏幕左下方的紅帽子,在菜單中單擊“系統(tǒng)工具”-“終端”命令,顯示“終端”窗口。步驟4:在命令行提示符($)下輸入更改口令的命令。應(yīng)該輸入的命令是什么?步驟5:系統(tǒng)提示:(current)UNIXpassword:,輸入當(dāng)前密碼(注意區(qū)分大小寫)。步驟6:系統(tǒng)接著提示:Newpassword,輸入新的密碼abc。是否能夠把密碼改為abc?說出為什么能夠或者為什么不能改?步驟7:當(dāng)再次出現(xiàn)提示符的時(shí)候,輸入另外一個(gè)密碼abcdef。能夠把密碼改為abcdef嗎?說出為什么能夠或者為什么不能改?步驟8:輸入新的密碼Linuxl23。步驟9:重新輸入確認(rèn)密碼。確認(rèn)后收到了什么信息?步驟10:在命令行提示符($)下鍵入Exit或者按下Ctrl和D鍵,關(guān)閉終端視窗。3、熟悉GNOME在GNOME環(huán)境中執(zhí)行下面的步驟,完成本實(shí)驗(yàn)環(huán)節(jié):步驟1:練習(xí)使用GNOME面板。GNOME面板左下方有若干個(gè)圖標(biāo)。移動鼠標(biāo)光標(biāo)停留在這些圖標(biāo)上一到兩秒鐘,可看到關(guān)于它們的操作提示。步驟2:顯示面板菜單?!癎NOME幫助”圖標(biāo)的上方有一個(gè)帶箭頭的子面板菜單按鈕。單擊并記錄主菜單標(biāo)題,作好記錄。步驟3:打開和最小化/最大化一個(gè)視窗。單擊面板上的“OpenOWriter”文字處理器圖標(biāo),打開一個(gè)文字處理輯視窗。在打開文字處理視窗之后,可以單擊右上角的按鈕選擇最小化、最大化或者還原。步驟4:給定視窗的大小。把鼠標(biāo)光標(biāo)移動到視窗的任何一邊。可以看到一個(gè)箭頭標(biāo)志。當(dāng)該標(biāo)志出現(xiàn)的時(shí)候按下鼠標(biāo)左鍵不放,然后拖動視窗的邊界可以進(jìn)行縮放。步驟5:移動視窗。單擊視窗的標(biāo)題欄保持不放。拖動視窗到一個(gè)新的位置。步驟6:處理重疊視窗。在文字處理視窗打開的情況下,打開新的視窗會重疊或者覆蓋住文字處理視窗。新打開的視窗現(xiàn)在成為前端視窗或者說是當(dāng)前進(jìn)程。為了把文字處理視窗從底層帶到頂層來,可單擊能夠看見的視窗的任何部分。如果看不到,則可單擊前面視窗的左上角符號,打開“窗口菜單”,從中選擇需要的視窗。步驟7:關(guān)閉視窗。單擊視窗右上角“關(guān)閉窗口”按鈕,可關(guān)閉當(dāng)前視窗。步驟8:鎖定工作站。如果需要離開工作站一會兒,而又想保持桌面不變,可以鎖定工作站。當(dāng)回來的時(shí)候,需要輸入密碼來解鎖工作站。系統(tǒng)管理員使用root或者超級用戶的密碼能夠解鎖任何工作站。單擊紅帽子,選擇“鎖住屏幕”命令,鎖住工作站屏幕,然后解鎖。步驟9:處理工作空間按鈕。工作空間又稱虛擬控制臺,是Linux操作系統(tǒng)的一大特色,它可使用戶同時(shí)在多個(gè)控制臺上工作,由此感受Linux操作系統(tǒng)的多用戶、多任務(wù)的能力。Linux的虛擬控制臺訪問方式允許一個(gè)用戶在同一時(shí)間從控制臺(與系統(tǒng)直接相聯(lián)的監(jiān)視器和鍵盤)進(jìn)行多次登錄;而“工作空間”按鈕讓用戶可以在一個(gè)工作空間中打開一系列應(yīng)用程序,而在另一個(gè)工作空間中打開另一系列應(yīng)用程序。可以單擊每一個(gè)工作空間按鈕從一個(gè)工作空間切換到另一個(gè)中去。每一個(gè)工作空間可以有不同的背景(墻紙)。工作空間從1到4命名。能夠通過右鍵單擊其中任意一個(gè)按鈕重新命名。默認(rèn)情況下,工作空間1是打開的。1)在工作空間1-4中分別打開不同的任務(wù)視窗。2)單擊每一個(gè)工作空間按鈕,在4個(gè)視窗中切換。3)關(guān)閉每一個(gè)視窗中正在運(yùn)行的應(yīng)用程序。4、Linux系統(tǒng)中的Shell在提示符下(例如$)輸入:echo$SHELL并按回車鍵即可找出當(dāng)前系統(tǒng)所使用的Shell。如果更改系統(tǒng)的Shell,建議考慮bash,因?yàn)樗墓δ茏顝?qiáng)大,并且符合POSIX標(biāo)準(zhǔn),而且在Linux上非常的流行。使用chsh命令可改變所使用的Shell。5、Linux系統(tǒng)中文件與目錄我們來了解Linux通配符的使用。首先假設(shè)當(dāng)前目錄下有五個(gè)文件(inv1jig.c、inv2jig.c、inv3jig.c、invinitjig.c、invpar.c),然后執(zhí)行操作: $lsinv?jig.c使用此命令將列出文件名中第四個(gè)字符包含數(shù)字的文件,結(jié)果包括:____________________執(zhí)行操作: $lsinv[13]jig.c結(jié)果包括:____________________使用以下命令列出文件名中第四個(gè)字符為1到3的文件: $lsinv[1-3]jig.c結(jié)果包括:____________________使用以下命令列出文件名中在inv和jig中間夾著任何長度字符串的文件: $lsinv*jig.c結(jié)果包括:____________________使用以下命令將列出文件名中至少包含一個(gè)數(shù)字并且擴(kuò)展名為“.c”或“.o”的文件: $ls*[0-9]*.[co]結(jié)果包括:____________________Linux中目錄的概念與DOS或Windows差不多,只是在DOS或Windows中目錄用“\”號表示,而在Linux則用“/”號表示。與DOS或Windows一樣,Linux的目錄也可以采用絕對與相對路徑表示。在Linux操作系統(tǒng)中,不管是文本模式還是圖形模式,其所有的文件布局都是樹型目錄方式。為返回工作目錄,無論現(xiàn)在處于何級目錄位置,只要鍵入“cd”命令即可返回登錄時(shí)的工作目錄。鍵入pwd,可查到當(dāng)前工作目錄的完全路徑。記錄下當(dāng)前的工作目錄:__________________還可以通過一個(gè)“~”字符來引用自己的主目錄,例如: /home/CAI$ls~class/等價(jià)于 /home/CAI$ls/home/CAI/class/6、Linux的文件系統(tǒng)1)本次實(shí)驗(yàn)使用的Linux系統(tǒng)的版本是?2)在Linux文件系統(tǒng)根目錄下有哪些子目錄?(例如:bin、dev、etc、home、install、lib、mnt、proc、root、tmp、user、var,注意區(qū)分不同版本目錄的不同)。3)用“l(fā)s–f/bin”命令列出/bin系統(tǒng)目錄中的文件個(gè)數(shù)和主要文件7、注銷GNOME單擊紅帽子,在“GNOME幫助”菜單中選擇“注銷”命令,單擊“確定”按鈕確定注銷,將會從當(dāng)前的GNOME會話中退出,返回到Linux登錄界面。8、可選練習(xí):1)有關(guān)目錄的命令(1)pwd命令pwd(即printworkingdirectory,打印工作路徑)命令的功能是顯示當(dāng)前的工作路徑。如現(xiàn)在是在“/home/CAI”目錄下,則可以用此命令來證實(shí)。例如:$pwd “$”表示在Linux系統(tǒng)的提示符下/home/CAI pwd命令證明的確是在“/home/CAI”下(2)cd命令cd命令用來切換目錄,假設(shè)在剛才的目錄切換到另一目錄,如下所示: $cd/usr/bin 將當(dāng)前的目錄轉(zhuǎn)到“/usr/bin”下 $pwd /usr/bin $cd 此命令返回工作目錄 $pwd $/home/CAI2)有關(guān)文件的命令(1)ls命令ls命令的功能是顯示指定目錄的內(nèi)容,例如: $cd $ls–a 此命令顯示當(dāng)前工作目錄下的所有文件(參數(shù)“a”表示所有文件,“-”號是用來控制參數(shù))顯示時(shí),文件名前帶“.”號表示隱含文件。輸入“l(fā)s-l”命令,參數(shù)“-l”表示額外文件的信息。(2)cat命令cat命令的功能是顯示文件內(nèi)容,也可用于文件的連接。此命令常用來快速瀏覽文件,使用方法如:$cat.bashrc瀏覽文件的其他命令還有emacs、more等。(3)chown命令chown命令的功能是改變文件的屬主和組(“屬主”可以是用戶名或用戶ID;“組”可以是組名或組的ID;文件名是以空格分開的要改變權(quán)限的文件列表,支持通配符)。例如: $chownhost:caifile1 將文件file1的屬主改為host組的cai(4)cp命令cp命令的功能是復(fù)制文件,用法是:cp[options]源文件目標(biāo)文件cp命令還可以使用以下參數(shù):-f:強(qiáng)行覆蓋已存在的目標(biāo)文件。-i:在強(qiáng)行覆蓋已存在的目標(biāo)文件時(shí)給出提示。-R:整個(gè)目錄復(fù)制。(5)date命令date命令的功能是打印或設(shè)置系統(tǒng)日期和時(shí)間,其用法與DOS中的date命令相似,例如:$date(6)dd命令dd命令的功能是復(fù)制一個(gè)文件(并可以將此文件轉(zhuǎn)換成其他格式)。例如: $ddif=sourcefileof=destfile使用dd命令能夠?qū)⑽募ourcefile復(fù)制為文件destfile。(7)file命令file命令的功能是探測文件和目錄的類型。(8)find命令find命令的功能是搜索目錄中的文件,用法是:find[路徑][匹配表達(dá)式]3)其他的命令(1)kill命令kill命令的功能是中止一個(gè)過程,用法是:kill[-s信號][p][-a]進(jìn)程號kill-l[信號](2)clear命令clear命令的功能是清除屏幕,用法如同DOS中的cls命令:$clear(3)mount、umount命令mount、umount命令的功能分別是安裝與卸下一個(gè)文件系統(tǒng)。用法如下:$mount/mnt/floppy 此命令將A驅(qū)動器安裝上$umount/mnt/floppy 此命令將A驅(qū)動器卸下(4)reboot命令reboot命令的功能是重新啟動系統(tǒng),用法是:$reboot(5)passwd命令passwd命令的功能是設(shè)置用戶密碼,用戶可以使用passwd這個(gè)命令來更改自己的登錄密碼:一般用戶只能更改自己的密碼;超級用戶不但能更改自身的密碼,還能更改其他用戶的密碼。還可以用這個(gè)命令來更改用戶的其他信息,如用戶的全名,用戶的登錄Shell,用戶的密碼失效時(shí)間間隔等。(6)su命令su命令的功能是使普通用戶以root帳號登錄,用法是:鍵入su命令,Shell要求root密碼。鍵入密碼按回車鍵則進(jìn)入root帳號。鍵入exit回到以前的普通用戶。
實(shí)驗(yàn)2Windowsxp編程背景知識Windowsxp可以識別的應(yīng)用程序包括控制臺應(yīng)用程序、GUI應(yīng)用程序和服務(wù)應(yīng)用程序??刂婆_應(yīng)用程序可以創(chuàng)建GUI,GUI應(yīng)用程序可以作為服務(wù)來運(yùn)行,服務(wù)也可以向標(biāo)準(zhǔn)的輸出流寫入數(shù)據(jù)。不同類型應(yīng)用程序間的惟一重要區(qū)別是其啟動方法。Windowsxp是以NT的技術(shù)構(gòu)建的,它提供了創(chuàng)建控制臺應(yīng)用程序的能力,使用戶可以利用標(biāo)準(zhǔn)的C++工具,如iostream庫中的cout和cin對象,來創(chuàng)建小型應(yīng)用程序。當(dāng)系統(tǒng)運(yùn)行時(shí),Windowsxp的服務(wù)通常要向系統(tǒng)用戶提供所需功能。服務(wù)應(yīng)用程序類型需要ServiceMail()函數(shù),由服務(wù)控制管理器(SCM)加以調(diào)用。SCM是操作系統(tǒng)的集成部分,負(fù)責(zé)響應(yīng)系統(tǒng)啟動以開始服務(wù)、指導(dǎo)用戶控制或從另一個(gè)服務(wù)中來的請求。其本身負(fù)責(zé)使應(yīng)用程序的行為像一個(gè)服務(wù)。通常,服務(wù)登錄到特殊的LocalSystem賬號下,此賬號具有與開發(fā)人員創(chuàng)建的服務(wù)不同的權(quán)限。當(dāng)令C++編譯器創(chuàng)建可執(zhí)行程序時(shí),編譯器將源代碼編譯成OBJ文件,然后將其與標(biāo)準(zhǔn)庫相鏈接。產(chǎn)生的EXE文件是裝載器指令、機(jī)器指令和應(yīng)用程序的數(shù)據(jù)的集合。裝載器指令告訴系統(tǒng)從哪里裝載機(jī)器代碼。另一個(gè)裝載器指令告訴系統(tǒng)從哪里開始執(zhí)行進(jìn)程的主線程。在進(jìn)行某些設(shè)置后,進(jìn)入開發(fā)者提供的main()、ServiceMain()或WinMain()函數(shù)的低級入口點(diǎn)。機(jī)器代碼中包括有控制邏輯,它所做的事包括跳轉(zhuǎn)到WindowsAPI函數(shù),進(jìn)行計(jì)算或向磁盤寫入數(shù)據(jù)等。Windows允許開發(fā)人員將大型應(yīng)用程序分為較小的、互相有關(guān)系的服務(wù)模塊,即動態(tài)鏈接庫(DLL)代碼塊,在其中包含應(yīng)用程序所使用的機(jī)器代碼和應(yīng)用程序的數(shù)據(jù)。實(shí)驗(yàn)?zāi)康耐ㄟ^對Windowsxp編程,進(jìn)一步熟悉操作系統(tǒng)的基本概念,較好地理解Windowsxp的結(jié)構(gòu)。實(shí)驗(yàn)內(nèi)容與步驟1.簡單的控制臺應(yīng)用程序我們先來創(chuàng)建一個(gè)名為“Hello,World”的應(yīng)用程序。步驟1:登錄進(jìn)入WindowsxpProfessional。步驟2:在“開始”菜單中單擊“程序”-“附件”-“記事本”命令,將清單2-l中的程序鍵入記事本中,并把代碼保存為Hello.cpp。清單2-1一個(gè)簡單的Windowsxp控制臺應(yīng)用程序//hello項(xiàng)目#include<iostream>
voidmain(){std::cout<<“Hello,Windowsxp”<<std::endl;}步驟3:在“開始”菜單中單擊“程序”-“附件”-“命令提示符”命令,進(jìn)入Windows“命令提示符”窗口,并利用簡單的標(biāo)準(zhǔn)命令行:C:\>CLHello.cpp來創(chuàng)建可執(zhí)行的Hello.EXE。操作能否正常進(jìn)行?如果不行,則可能的原因是什么?步驟4:運(yùn)行Hello.EXE程序,產(chǎn)生用戶鍵入的一行文字。運(yùn)行結(jié)果(如果運(yùn)行不成功,則可能的原因是什么?)2.GUI應(yīng)用程序在下面的實(shí)驗(yàn)中,C++編譯器創(chuàng)建一個(gè)GUI應(yīng)用程序,代碼中包括了WinMain()方法,這是GUI類型的應(yīng)用程序的標(biāo)準(zhǔn)入口點(diǎn)。步驟1:在“開始”菜單中單擊“程序”-“附件”-“記事本”命令,將清單2-2中的程序鍵入記事本中,并把代碼保存為2-2.cpp。清單2-2Windowsxp的GUI應(yīng)用程序//msgbox項(xiàng)目#include<windows.h> //標(biāo)準(zhǔn)的include
//告訴連接器與包括MessageBoxAPI函數(shù)的user32庫進(jìn)行連接#pragmacomment(lib,“user32.lib”)
//這是一個(gè)可以彈出信息框然后退出的筒單的應(yīng)用程序intAPIENTRYWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow){::MessageBox(NULL, //沒有父窗口“Hello,Windowsxp”, //消息框中的文本“Greetings”, //消息框標(biāo)題MB_OK); //其中只有一個(gè)OK按鈕
return(0);//返回0以便通知系統(tǒng)不進(jìn)入消息循環(huán)}也可以利用任何其他文本編輯器鍵入程序代碼,如果這樣,例如使用WORD來鍵入和編輯程序,則應(yīng)該注意什么問題?步驟2:編譯、運(yùn)行2-2.EXE文件。在清單2-2的GUI應(yīng)用程序中,首先需要Windows.h頭文件,以便獲得傳送給WinMain()和MessageBox()API函數(shù)的數(shù)據(jù)類型定義。接著的pragma指令指示編譯器/連接器找到User32.LIB庫文件并將其與產(chǎn)生的EXE文件連接起來。這樣就可以運(yùn)行簡單的命令行命令CLMsgBox.CPP來創(chuàng)建這一應(yīng)用程序,如果沒有pragma指令,則MessageBox()API函數(shù)就成為未定義的了。這一指令是VisualStudioC++編譯器特有的。接下來是WinMain()方法。其中有四個(gè)由實(shí)際的低級入口點(diǎn)傳遞來的參數(shù)。hInstance參數(shù)用來裝入與代碼相連的圖標(biāo)或位圖一類的資源,無論何時(shí),都可用GetModuleHandle()API函數(shù)將這些資源提取出來。系統(tǒng)利用實(shí)例句柄來指明代碼和初始的數(shù)據(jù)裝在內(nèi)存的何處。句柄的數(shù)值實(shí)際上是EXE文件映像的基地址,通常為0x00400000。下一個(gè)參數(shù)hPrevInstance是為向后兼容而設(shè)的,現(xiàn)在系統(tǒng)將其設(shè)為NULL。應(yīng)用程序的命令行(不包括程序的名稱)是lpCmdLine參數(shù)。另外,系統(tǒng)利用nCmdShow參數(shù)告訴應(yīng)用程序如何顯示它的主窗口(選項(xiàng)包括最小化、最大化和正常)。最后,程序調(diào)用MessageBox()API函數(shù)并退出。如果在進(jìn)入消息循環(huán)之前就結(jié)束運(yùn)行的話,最后必須返回0。記錄運(yùn)行結(jié)果(試將其中的信息與清單2-1程序的運(yùn)行結(jié)果進(jìn)行比較)。3.進(jìn)程對象操作系統(tǒng)將當(dāng)前運(yùn)行的應(yīng)用程序看作是進(jìn)程對象。利用系統(tǒng)提供的惟一的稱為句柄(HANDLE)的號碼,就可與進(jìn)程對象交互。這一號碼只對當(dāng)前進(jìn)程有效。本實(shí)驗(yàn)表示了一個(gè)簡單的進(jìn)程句柄的應(yīng)用。在系統(tǒng)中運(yùn)行的任何進(jìn)程都可調(diào)用GetCurrentProcess()API函數(shù),此函數(shù)可返回標(biāo)識進(jìn)程本身的句柄。然后就可在Windows需要該進(jìn)程的有關(guān)情況時(shí),利用這一句柄來提供。步驟1:將清單2-3.cpp程序鍵入記事本中,并把代碼保存為2-3.cpp。清單2-3獲得和使用進(jìn)程的句柄//prochandle項(xiàng)目#include<windows.h>#include<iostream>
//確定自己的優(yōu)先權(quán)的簡單應(yīng)用程序voidmain(){//從當(dāng)前進(jìn)程中提取句柄HANDLEhProcessThis=::GetCurrentProcess();
//請求內(nèi)核提供該進(jìn)程所屬的優(yōu)先權(quán)類DWORDdwPriority=::GetPriorityClass(hProcessThis);
//發(fā)出消息,為用戶描述該類std::cout<<“Currentprocesspriority:”;switch(dwPriority){caseHIGH_PRIORITY_CLASS:std::cout<<“High”;break;caseNORMAL_PRIORITY_CLASS:std
::cout<<
“Normal”;break;caseIDLE_PRIORITY_CLASS:std::cout<<“Idle”;break;caseREALTIME_PRIORITY_CLASS:std::cout<<“Realtime”;break;default:std::cout<<“<unknown>”;break;}std::cout<<std::endl;}清單2-3中列出的是一種獲得進(jìn)程句柄的方法。對于進(jìn)程句柄可進(jìn)行的惟一有用的操作是在API調(diào)用時(shí),將其作為參數(shù)傳送給系統(tǒng),正如清單2-3中對GetPriorityClass()API函數(shù)的調(diào)用那樣。在這種情況下,系統(tǒng)向進(jìn)程對象內(nèi)“窺視”,以決定其優(yōu)先級,然后將此優(yōu)先級返回給應(yīng)用程序。OpenProcess()和CreateProcess()API函數(shù)也可以用于提取進(jìn)程句柄。前者提取的是已經(jīng)存在的進(jìn)程的句柄,而后者創(chuàng)建一個(gè)新進(jìn)程,并將其句柄提供出來。步驟2:編譯、運(yùn)行2-3文件,運(yùn)行結(jié)果為:_______________步驟3:將清單2-4.cpp程序鍵入記事本中,并把代碼保存為2-4.cpp。清單2-4顯示如何找出系統(tǒng)中正在運(yùn)行的所有進(jìn)程,如何利用OpenProcess()API函數(shù)來獲得每一個(gè)訪問進(jìn)程的進(jìn)一步信息。清單2-4利用句柄查出進(jìn)程的詳細(xì)信息//proclist項(xiàng)目#include<windows.h>#include<tlhelp32.h>#include<iostream>
//當(dāng)在用戶模式與內(nèi)核模式下都提供所耗時(shí)間時(shí),在內(nèi)核模式下進(jìn)行所耗時(shí)間的64位計(jì)算的幫助方法DWORDGetKernelModePercentage(constFILETIME&ftKernel,constFILETIME&ftUser){//將FILETIME結(jié)構(gòu)轉(zhuǎn)化為64位整數(shù)ULONGLONGqwKernel=(((ULONGLONG)ftKernel.dwHighDateTime)<<32)+ftKernel.dwLowDateTime;ULONGLONGqwUser=(((ULONGLONG)ftUser.dwHighDateTime)<<32)+ftUser.dwLowDateTime;
//將消耗時(shí)間相加,然后計(jì)算消耗在內(nèi)核模式下的時(shí)間百分比ULONGLONGqwTotal=qwKernel+qwUser;DWORDdwPct=(DWORD)(((ULONGLONG)100*qwKernel)/qwTotal);
return(dwPct);}
//以下是將當(dāng)前運(yùn)行進(jìn)程名和消耗在內(nèi)核模式下的時(shí)間百分?jǐn)?shù)都顯示出來的應(yīng)用程序voidmain(){//對當(dāng)前系統(tǒng)中運(yùn)行的進(jìn)程拍取“快照”HANDLEhSnapshot=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, //提取當(dāng)前進(jìn)程0); //如果是當(dāng)前進(jìn)程,就將其忽略//初始化進(jìn)程入口PROCESSENTRY32pe;::ZeroMemory(&pe,sizeof(pe));pe.dwSize=sizeof(pe);//按所有進(jìn)程循環(huán)BOOLbMore=::Process32First(hSnapshot,&pe);while(bMore){//打開用于讀取的進(jìn)程HANDLEhProcess=::OpenProcess(PROCESS_QUERY_INFORMATION, //指明要得到信息FALSE, //不必繼承這一句柄pe.th32ProcessID); //要打開的進(jìn)程if(hProcess!=NULL){//找出進(jìn)程的時(shí)間FILETIMEftCreation,ftExit,ftKernelMode,ftUserMode;::GetProcessTimes(hProcess, //所感興趣的進(jìn)程&ftCreation, //進(jìn)程的啟動時(shí)間(絕對的)&ftExit, //結(jié)束時(shí)間(如果有的話)&ftKernelMode, //在內(nèi)核模式下消耗的時(shí)間&ftUserMode); //在用戶模式下消耗的時(shí)間
//計(jì)算內(nèi)核模式消耗的時(shí)間百分比DWORDdwPctKernel=::GetKernelModePercentage(ftKernelMode, //在內(nèi)核模式上消耗的時(shí)間ftUserMode); //在用戶模式下消耗的時(shí)間
//向用戶顯示進(jìn)程的某些信息std::cout<<“ProcessID:”<<pe.th32ProcessID<<“,EXEfile:”<<pe.szExeFile<<“,%inkernelmode:”<<dwPctKernel<<std::endl;
//消除句柄::CloseHandle(hProcess);}
//轉(zhuǎn)向下一個(gè)進(jìn)程bMore=::Process32Next(hSnapshot,&pe);}}清單2-4程序首先利用Windowsxp的新特性,即工具幫助庫來獲得當(dāng)前運(yùn)行的所有進(jìn)程的快照。然后應(yīng)用程序進(jìn)入快照中的每一個(gè)進(jìn)程,得到其以PROCESSENTRY32結(jié)構(gòu)表示的屬性。這一結(jié)構(gòu)用來向OpenProcess()API函數(shù)提供進(jìn)程的ID。Windows跟蹤每一進(jìn)程的有關(guān)時(shí)間,示例中是通過打開的進(jìn)程句柄和GetProcessTimes()API來直詢得到有關(guān)時(shí)間的。接下來,一個(gè)定制的幫助函數(shù)取得了幾個(gè)返回的數(shù)值,然后計(jì)算進(jìn)程在內(nèi)核模式下消耗的時(shí)間占總時(shí)間的百分比。程序的其余部分比較簡單,只是將有關(guān)信息顯示給用戶,清除進(jìn)程句柄,然后繼續(xù)循環(huán),直到所有進(jìn)程都計(jì)算過為止。步驟4:編譯、運(yùn)行2-4.EXE文件,記錄運(yùn)行結(jié)果。
實(shí)驗(yàn)3Windowsxp進(jìn)程的“一生”背景知識Windows所創(chuàng)建的每個(gè)進(jìn)程都從調(diào)用CreateProcess()API函數(shù)開始,該函數(shù)的任務(wù)是在對象管理器子系統(tǒng)內(nèi)初始化進(jìn)程對象。每一進(jìn)程都以調(diào)用ExitProcess()或TerminateProcess()API函數(shù)終止。通常應(yīng)用程序的框架負(fù)責(zé)調(diào)用ExitProcess()函數(shù)。對于C++運(yùn)行庫來說,這一調(diào)用發(fā)生在應(yīng)用程序的main()函數(shù)返回之后。1.創(chuàng)建進(jìn)程CreateProcess()調(diào)用的核心參數(shù)是可執(zhí)行文件運(yùn)行時(shí)的文件名及其命令行。表3-1詳細(xì)地列出了每個(gè)參數(shù)的類型和名稱。表3-1CreateProcess()函數(shù)的參數(shù)參數(shù)名稱使用目的LPCTSTRlpApplivationName全部或部分地指明包括可執(zhí)行代碼的EXE文件的文件名LPCTSTRlpCommandLine向可執(zhí)行文件發(fā)送的參數(shù)LPSECURIITY_ATTRIBUTESlpProcessAttributes返回進(jìn)程句柄的安全屬性。主要指明這一句柄是否應(yīng)該由其他子進(jìn)程所繼承LPSECURIITY_ATTRIBUTESlpThreadAttributes返回進(jìn)程的主線程的句柄的安全屬性BOOLbInheritHandle一種標(biāo)志,告訴系統(tǒng)允許新進(jìn)程繼承創(chuàng)建者進(jìn)程的句柄DWORDdwCreationFlage特殊的創(chuàng)建標(biāo)志(如CREATE_SUSPENDED)的位標(biāo)記LPVOIDlpEnvironment向新進(jìn)程發(fā)送的一套環(huán)境變量;如為null值則發(fā)送調(diào)用者環(huán)境LPCTSTRlpCurrentDirectory新進(jìn)程的啟動目錄STARTUPINFOlpStartupInfoSTARTUPINFO結(jié)構(gòu),包括新進(jìn)程的輸入和輸出配置的詳情LPPROCESS_INFORMATIONlpProcessInformation調(diào)用的結(jié)果塊;發(fā)送新應(yīng)用程序的進(jìn)程和主線程的句柄和ID可以指定第一個(gè)參數(shù),即應(yīng)用程序的名稱,其中包括相對于當(dāng)前進(jìn)程的當(dāng)前目錄的全路徑或者利用搜索方法找到的路徑;lpCommandLine參數(shù)允許調(diào)用者向新應(yīng)用程序發(fā)送數(shù)據(jù);接下來的三個(gè)參數(shù)與進(jìn)程和它的主線程以及返回的指向該對象的句柄的安全性有關(guān)。然后是標(biāo)志參數(shù),用以在dwCreationFlags參數(shù)中指明系統(tǒng)應(yīng)該給予新進(jìn)程什么行為。經(jīng)常使用的標(biāo)志是CREATE_SUSPNDED,告訴主線程立刻暫停。當(dāng)準(zhǔn)備好時(shí),應(yīng)該使用ResumeThread()API來啟動進(jìn)程。另一個(gè)常用的標(biāo)志是CREATE_NEW_CONSOLE,告訴新進(jìn)程啟動自己的控制臺窗口,而不是利用父窗口。這一參數(shù)還允許設(shè)置進(jìn)程的優(yōu)先級,用以向系統(tǒng)指明,相對于系統(tǒng)中所有其他的活動進(jìn)程來說,給此進(jìn)程多少CPU時(shí)間。接著是CreateProcess()函數(shù)調(diào)用所需要的三個(gè)通常使用缺省值的參數(shù)。第一個(gè)參數(shù)是lpEnvironment參數(shù),指明為新進(jìn)程提供的環(huán)境;第二個(gè)參數(shù)是lpCurrentDirectory,可用于向主創(chuàng)進(jìn)程發(fā)送與缺省目錄不同的新進(jìn)程使用的特殊的當(dāng)前目錄;第三個(gè)參數(shù)是STARTUPINFO數(shù)據(jù)結(jié)構(gòu)所必需的,用于在必要時(shí)指明新應(yīng)用程序的主窗口的外觀。CreateProcess()的最后一個(gè)參數(shù)是用于新進(jìn)程對象及其主線程的句柄和ID的返回值緩沖區(qū)。以PROCESS_INFORMATION結(jié)構(gòu)中返回的句柄調(diào)用CloseHandle()API函數(shù)是重要的,因?yàn)槿绻粚⑦@些句柄關(guān)閉的話,有可能危及主創(chuàng)進(jìn)程終止之前的任何未釋放的資源。2.正在運(yùn)行的進(jìn)程如果一個(gè)進(jìn)程擁有至少一個(gè)執(zhí)行線程,則為正在系統(tǒng)中運(yùn)行的進(jìn)程。通常,這種進(jìn)程使用主線程來指示它的存在。當(dāng)主線程結(jié)束時(shí),調(diào)用ExitProcess()API函數(shù),通知系統(tǒng)終止它所擁有的所有正在運(yùn)行、準(zhǔn)備運(yùn)行或正在掛起的其他線程。當(dāng)進(jìn)程正在運(yùn)行時(shí),可以查看它的許多特性,其中少數(shù)特性也允許加以修改。首先可查看的進(jìn)程特性是系統(tǒng)進(jìn)程標(biāo)識符(PID),可利用GetCurrentProcessId()API函數(shù)來查看,與GetCurrentProcess()相似,對該函數(shù)的調(diào)用不能失敗,但返回的PID在整個(gè)系統(tǒng)中都可使用。其他的可顯示當(dāng)前進(jìn)程信息的API函數(shù)還有GetStartupInfo()和GetProcessShutdownParameters(),可給出進(jìn)程存活期內(nèi)的配置詳情。通常,一個(gè)進(jìn)程需要它的運(yùn)行期環(huán)境的信息。例如API函數(shù)GetModuleFileName()和GetCommandLine(),可以給出用在CreateProcess()中的參數(shù)以啟動應(yīng)用程序。在創(chuàng)建應(yīng)用程序時(shí)可使用的另一個(gè)API函數(shù)是IsDebuggerPresent()??衫肁PI函數(shù)GetGuiResources()來查看進(jìn)程的GUI資源。此函數(shù)既可返回指定進(jìn)程中的打開的GUI對象的數(shù)目,也可返回指定進(jìn)程中打開的USER對象的數(shù)目。進(jìn)程的其他性能信息可通過GetProcessIoCounters()、GetProcessPriorityBoost()、GetProcessTimes()和GetProcessWorkingSetSize()API得到。以上這幾個(gè)API函數(shù)都只需要具有PROCESS_QUERY_INFORMATION訪問權(quán)限的指向所感興趣進(jìn)程的句柄。另一個(gè)可用于進(jìn)程信息查詢的API函數(shù)是GetProcessVersion()。此函數(shù)只需感興趣進(jìn)程的PID(進(jìn)程標(biāo)識號)。本實(shí)驗(yàn)程序清單3-6中列出了這一API函數(shù)與GetVersionEx()的共同作用,可確定運(yùn)行進(jìn)程的系統(tǒng)的版本號。3.終止進(jìn)程所有進(jìn)程都是以調(diào)用ExitProcess()或者TerminateProcess()函數(shù)結(jié)束的。但最好使用前者而不要使用后者,因?yàn)檫M(jìn)程是在完成了它的所有的關(guān)閉“職責(zé)”之后以正常的終止方式來調(diào)用前者的。而外部進(jìn)程通常調(diào)用后者即突然終止進(jìn)程的進(jìn)行,由于關(guān)閉時(shí)的途徑不太正常,有可能引起錯(cuò)誤的行為。TerminateProcess()API函數(shù)只要打開帶有PROCESS_TERMINATE訪問權(quán)的進(jìn)程對象,就可以終止進(jìn)程,并向系統(tǒng)返回指定的代碼。這是一種“野蠻”的終止進(jìn)程的方式,但是有時(shí)卻是需要的。如果開發(fā)人員確實(shí)有機(jī)會來設(shè)計(jì)“謀殺”(終止別的進(jìn)程的進(jìn)程)和“受害”進(jìn)程(被終止的進(jìn)程)時(shí),應(yīng)該創(chuàng)建一個(gè)進(jìn)程間通訊的內(nèi)核對象——如一個(gè)互斥程序——這樣一來,“受害”進(jìn)程只在等待或周期性地測試它是否應(yīng)該終止。實(shí)驗(yàn)?zāi)康?、通過創(chuàng)建進(jìn)程、觀察正在運(yùn)行的進(jìn)程和終止進(jìn)程的程序設(shè)計(jì)和調(diào)試操作,進(jìn)一步熟悉操作系統(tǒng)的進(jìn)程概念,理解Windowsxp進(jìn)程的“一生”。2、通過閱讀和分析實(shí)驗(yàn)程序,學(xué)習(xí)創(chuàng)建進(jìn)程、觀察進(jìn)程和終止進(jìn)程的程序設(shè)計(jì)方法。實(shí)驗(yàn)內(nèi)容與步驟1.創(chuàng)建進(jìn)程本實(shí)驗(yàn)顯示了創(chuàng)建子進(jìn)程的基本框架。該程序只是再一次地啟動自身,顯示它的系統(tǒng)進(jìn)程ID和它在進(jìn)程列表中的位置。清單3-1創(chuàng)建子進(jìn)程//proccreate項(xiàng)目#include<windows.h>#include<iostream>#include<stdio.h>//創(chuàng)建傳遞過來的進(jìn)程的克隆過程并賦于其ID值voidStartClone(intnCloneID){//提取用于當(dāng)前可執(zhí)行文件的文件名TCHARszFilename[MAX_PATH];::GetModuleFileName(NULL,szFilename,MAX_PATH);//格式化用于子進(jìn)程的命令行并通知其EXE文件名和克隆IDTCHARszCmdLine[MAX_PATH]; ::sprintf(szCmdLine,"\"%s\"d%",szFilename,nCloneID); //用于子進(jìn)程的STARTUPINFO結(jié)構(gòu)STARTUPINFOsi;::ZeroMemory(reinterpret_cast<void*>(&si),sizeof(si));si.cb=sizeof(si); //必須是本結(jié)構(gòu)的大小//返回的用于子進(jìn)程的進(jìn)程信息PROCESS_INFORMATIONpi;//利用同樣的可執(zhí)行文件和命令行創(chuàng)建進(jìn)程,并賦于其子進(jìn)程的性質(zhì)BOOLbCreateOK=::CreateProcess(szFilename, //產(chǎn)生這個(gè)EXE的應(yīng)用程序的名稱szCmdLine, //告訴其行為像一個(gè)子進(jìn)程的標(biāo)志NULL, //缺省的進(jìn)程安全性NULL, //缺省的線程安全性FALSE, //不繼承句柄CREATE_NEW_CONSOLE, //使用新的控制臺NULL, //新的環(huán)境NULL, //當(dāng)前目錄&si, //啟動信息&pi); //返回的進(jìn)程信息//對子進(jìn)程釋放引用if(bCreateOK){::CloseHandle(pi.hProcess);::CloseHandle(pi.hThread);}}intmain(intargc,char*argv[]){//確定進(jìn)程在列表中的位置intnClone(0);if(argc>1){//從第二個(gè)參數(shù)中提取克隆ID::sscanf(argv[1],"%d",&nClone);}//顯示進(jìn)程位置std::cout<<"ProcessID:"<<::GetCurrentProcessId()<<",CloneID:"<<nClone<<std::endl;//檢查是否有創(chuàng)建子進(jìn)程的需要constintc_nCloneMax=25;if(nClone<c_nCloneMax){//發(fā)送新進(jìn)程的命令行和克隆號StartClone(++nClone);}//在終止之前暫停一下(l/2秒)::Sleep(500);return0;}按Ctrl+S鍵可暫停程序的執(zhí)行,按Ctrl+Pause(Break)鍵可終止程序的執(zhí)行。清單3-1展示的是一個(gè)簡單的使用CreateProcess()API函數(shù)的例子。首先形成簡單的命令行,提供當(dāng)前的EXE文件的指定文件名和代表生成克隆進(jìn)程的號碼。大多數(shù)參數(shù)都可取缺省值,但是創(chuàng)建標(biāo)志參數(shù)使用了_________標(biāo)志,指示新進(jìn)程分配它自己的控制臺,這使得運(yùn)行示例程序時(shí),在任務(wù)欄上產(chǎn)生許多活動標(biāo)記。然后該克隆進(jìn)程的創(chuàng)建方法關(guān)閉傳遞過來的句柄并返回main()函數(shù)。在關(guān)閉程序之前,每一進(jìn)程的執(zhí)行主線程暫停一下,以便讓用戶看到其中的至少一個(gè)窗口。2.正在運(yùn)行的進(jìn)程本實(shí)驗(yàn)的程序中列出了用于進(jìn)程信息查詢的API函數(shù)GetProcessVersion()與GetVersionEx()的共同作用,可確定運(yùn)行進(jìn)程的操作系統(tǒng)的版本號。清單3-2使用進(jìn)程和操作系統(tǒng)的版本信息//version項(xiàng)目#include<windows.h>#include<iostream>//利用進(jìn)程和操作系統(tǒng)的版本信息的簡單示例voidmain(){//提取這個(gè)進(jìn)程的ID號DWORDdwIdThis=::GetCurrentProcessId();//獲得這一進(jìn)程和報(bào)告所需的版本,也可以發(fā)送0以便指明這一進(jìn)程DWORDdwVerReq=::GetProcessVersion(dwIdThis);WORDwMajorReq=(WORD)(dwVerReq>16);WORDwMinorReq=(WORD)(dwVerReq&0xffff);std::cout<<"ProcessID:"<<dwIdThis<<",requiresOS:"<<wMajorReq<<wMinorReq<<std::endl;//設(shè)置版本信息的數(shù)據(jù)結(jié)構(gòu),以便保存操作系統(tǒng)的版本信息OSVERSIONINFOEXosvix;::ZeroMemory(&osvix,sizeof(osvix));osvix.dwOSVersionInfoSize=sizeof(osvix);//提取版本信息和報(bào)告::GetVersionEx(reinterpret_cast<LPOSVERSIONINFO>(&osvix));std::cout<<"RunningonOS:"<<osvix.dwMajorVersion<<"."<<osvix.dwMinorVersion<<std::endl;//如果是NTS(Windowsxp)系統(tǒng),則提高其優(yōu)先權(quán)if(osvix.dwPlatformId==VER_PLATFORM_WIN32_NT&&osvix.dwMajorVersion>=5){//改變優(yōu)先級::SetPriorityClass(::GetCurrentProcess(), //利用這一進(jìn)程HIGH_PRIORITY_CLASS); //改變?yōu)閔igh//報(bào)告給用戶std::cout<<"TaskManagershouldnowindicatethis""processishighpriority."<<std::endl;}}該程序表明了如何獲得當(dāng)前的PID和所需的進(jìn)程版本信息。為了運(yùn)行這一程序,系統(tǒng)處理了版本不兼容問題。接著,程序演示了如何使用GetVersionEx()API函數(shù)來提取OSVERSIONINFOEX結(jié)構(gòu)。這一數(shù)據(jù)塊中包括了操作系統(tǒng)的版本信息。其中,“OS:5.0”表示當(dāng)前運(yùn)行的操作系統(tǒng)是Windowsxp。代碼接著將當(dāng)前進(jìn)程的優(yōu)先級提高到比正常級別高。單擊Ctrl+Alt+Del鍵,進(jìn)入“Windows任務(wù)管理器”,在“應(yīng)用程序”選項(xiàng)卡中右鍵單擊“3-2”任務(wù),在快捷菜單中選擇“轉(zhuǎn)到進(jìn)程”命令。在“Windows任務(wù)管理器”的“進(jìn)程”選項(xiàng)卡中,與“3-2”任務(wù)對應(yīng)的進(jìn)程映像名稱是什么?右鍵單擊該進(jìn)程名,在快捷菜單中選擇“設(shè)置優(yōu)先級”命令,可以調(diào)整該進(jìn)程的優(yōu)先級,如設(shè)置為“高”后重新運(yùn)行3-2.exe程序,屏幕顯示有變化嗎?為什么?除了改變進(jìn)程的優(yōu)先級以外,還可以對正在運(yùn)行的進(jìn)程執(zhí)行幾項(xiàng)其他的操作,只要獲得其進(jìn)程句柄即可。SetProcessAffinityMask()API函數(shù)允許開發(fā)人員將線程映射到處理器上;SetProcessPriorityBoost()API可關(guān)閉前臺應(yīng)用程序優(yōu)先級的提升;而SetProcessWorkingSet()API可調(diào)節(jié)進(jìn)程可用的非頁面RAM的容量;還有一個(gè)只對當(dāng)前進(jìn)程可用的API函數(shù),即SetProcessShutdownParameters(),可告訴系統(tǒng)如何終止該進(jìn)程。3.終止進(jìn)程在清單3-3列出的程序中,先創(chuàng)建一個(gè)子進(jìn)程,然后指令它發(fā)出“自殺彈”互斥體去終止自身的運(yùn)行。清單3-3指令其子進(jìn)程來“殺掉”自己的父進(jìn)程//procterm項(xiàng)目#include<windows.h>#include<iostream>#include<stdio.h>staticLPCTSTRg_szMutexName="w2kdg.ProcTerm.mutex.Suicide";//創(chuàng)建當(dāng)前進(jìn)程的克隆進(jìn)程的簡單方法voidStartClone(){//提取當(dāng)前可執(zhí)行文件的文件名TCHARszFilename[MAX_PATH];::GetModuleFileName(NULL,szFilename,MAX_PATH);//格式化用于子進(jìn)程的命令行,指明它是一個(gè)EXE文件和子進(jìn)程TCHARszCmdLine[MAX_PATH];::sprintf(szCmdLine,"\"%s\"child",szFilename);//子進(jìn)程的啟動信息結(jié)構(gòu)STARTUPINFOsi;::ZeroMemory(reinterpret_cast<void*>(&si),sizeof(si));si.cb=sizeof(si); //應(yīng)當(dāng)是此結(jié)構(gòu)的大小//返回的用于子進(jìn)程的進(jìn)程信息PROCESS_INFORMATIONpi;//用同樣的可執(zhí)行文件名和命令行創(chuàng)建進(jìn)程,并指明它是一個(gè)子進(jìn)程BOOLbCreateOK=::CreateProcess(szFilename, //產(chǎn)生的應(yīng)用程序的名稱(本EXE文件)szCmdLine, //告訴我們這是一個(gè)子進(jìn)程的標(biāo)志NULL, //用于進(jìn)程的缺省的安全性NULL, //用于線程的缺省安全性FALSE, //不繼承句柄CREATE_NEW_CONSOLE, //創(chuàng)建新窗口NULL, //新環(huán)境NULL, //當(dāng)前目錄&si, //啟動信息結(jié)構(gòu)&pi); //返回的進(jìn)程信息//釋放指向子進(jìn)程的引用if(bCreateOK){::CloseHandle(pi.hProcess);::CloseHandle(pi.hThread);}}voidParent(){//創(chuàng)建“自殺”互斥程序體HANDLEhMutexSuicide=::CreateMutex(NULL, //缺省的安全性TRUE, //最初擁有的g_szMutexName); //為其命名if(hMutexSuicide!=NULL){//創(chuàng)建子進(jìn)程std::cout<<"Creatingthechildprocess."<<std::endl;::StartClone();//暫停::Sleep(5000);//指令子進(jìn)程“殺”掉自身std::cout<<"Tellingthechildprocesstoquit."<<std::endl;::ReleaseMutex(hMutexSuicide);//消除句柄::CloseHandle(hMutexSuicide);}}voidChild(){//打開“自殺”互斥體HANDLEhMutexSuicide=::OpenMutex(SYNCHRONIZE, //打開用于同步FALSE, //不需要向下傳遞g_szMutexName); //名稱if(hMutexSuicide!=NULL){//報(bào)告我們正在等待指令std::cout<<"Childwaitingforsuicideinstructions."<<std::endl;::WaitForSingleObject(hMutexSuicide,INFINITE);//準(zhǔn)備好終止,清除句柄std::cout<<"Childquiting."<<std::endl;::CloseHandle(hMutexSuicide);}}intmain(intargc,char*argv[]){//決定其行為是父進(jìn)程還是子進(jìn)程if(argc>1&&::strcmp(argv[1],"child")==0){Child();}else{Parent();}return0;}該程序說明了一個(gè)進(jìn)程從“生”到“死”的整個(gè)一生。第一次執(zhí)行時(shí),它創(chuàng)建一個(gè)子進(jìn)程,其行為如同“父親”。在創(chuàng)建子進(jìn)程之前,先創(chuàng)建一個(gè)互斥的內(nèi)核對象,其行為對于子進(jìn)程來說,如同一個(gè)“自殺彈”。當(dāng)創(chuàng)建子進(jìn)程時(shí),就打開了互斥體并在其他線程中進(jìn)行別的處理工作,同時(shí)等待著父進(jìn)程使用ReleaseMutex()API發(fā)出“死亡”信號。然后用Sleep()API調(diào)用來模擬父進(jìn)程處理其他工作,等完成時(shí),指令子進(jìn)程終止。當(dāng)調(diào)用ExitProcess()時(shí)要小心,進(jìn)程中的所有線程都被立刻通知停止。在設(shè)計(jì)應(yīng)用程序時(shí),必須讓主線程在正常的C++運(yùn)行期關(guān)閉(這是由編譯器提供的缺省行為)之后來調(diào)用這一函數(shù)。當(dāng)它轉(zhuǎn)向受信狀態(tài)時(shí),通??蓜?chuàng)建一個(gè)每個(gè)活動線程都可等待和停止的終止事件。在正常的終止操作中,進(jìn)程的每個(gè)工作線程都要終止,由主線程調(diào)用ExitProcess()。接著,管理層對進(jìn)程增加的所有對象釋放引用,并將用GetExitCodeProcess()建立的退出代碼從STILL_ACTIVE改變?yōu)樵贓xitProcess()調(diào)用中返回的值。最后,主線程對象也如同進(jìn)程對象一樣轉(zhuǎn)變?yōu)槭苄艩顟B(tài)。等到所有打開的句柄都關(guān)閉之后,管理層的對象管理器才銷毀進(jìn)程對象本身。還沒有一種函數(shù)可取得終止后的進(jìn)程對象為其參數(shù),從而使其“復(fù)活”。當(dāng)進(jìn)程對象引用一個(gè)終止了的對象時(shí),有好幾個(gè)API函數(shù)仍然是有用的。進(jìn)程可使用退出代碼將終止方式通知給調(diào)用GetExitCodeProcess()的其他進(jìn)程。同時(shí),GetProcessTimes()API函數(shù)可向主調(diào)者顯示進(jìn)程的終止時(shí)間。在熟悉清單3-3源代碼的基礎(chǔ)上,利用本實(shí)驗(yàn)介紹的API函數(shù)來嘗試改進(jìn)本程序(例如使用GetProcessTimes()API函數(shù))并運(yùn)行。
實(shí)驗(yàn)4Windowsxp線程同步背景知識Windowsxp提供的常用對象可分成三類:核心應(yīng)用服務(wù)、線程同步和線程間通訊。其中,開發(fā)人員可以使用線程同步對象來協(xié)調(diào)線程和進(jìn)程的工作,以使其共享信息并執(zhí)行任務(wù)。此類對象包括互鎖數(shù)據(jù)、臨界段、事件、互斥體和信號等。多線程編程中關(guān)鍵的一步是保護(hù)所有的共享資源,工具主要有互鎖函數(shù)、臨界段和互斥體等;另一個(gè)實(shí)質(zhì)性部分是協(xié)調(diào)線程使其完成應(yīng)用程序的任務(wù),為此,可利用內(nèi)核中的事件對象和信號。在進(jìn)程內(nèi)或進(jìn)程間實(shí)現(xiàn)線程同步的最方便的方法是使用事件對象,這一組內(nèi)核對象允許一個(gè)線程對其受信狀態(tài)進(jìn)行直接控制(見表4-1)。而互斥體則是另一個(gè)可命名且安全的內(nèi)核對象,其主要目的是引導(dǎo)對共享資源的訪問。擁有單一訪問資源的線程創(chuàng)建互斥體,所有想要訪問該資源的線程應(yīng)該在實(shí)際執(zhí)行操作之前獲得互斥體,而在訪問結(jié)束時(shí)立即釋放互斥體,以允許下一個(gè)等待線程獲得互斥體,然后接著進(jìn)行下去。與事件對象類似,互斥體容易創(chuàng)建、打開、使用并清除。利用CreateMutex()API可創(chuàng)建互斥體,創(chuàng)建時(shí)還可以指定一個(gè)初始的擁有權(quán)標(biāo)志,通過使用這個(gè)標(biāo)志,只有當(dāng)線程完成了資源的所有的初始化工作時(shí),才允許創(chuàng)建線程釋放互斥體。
表4-1用于管理事件對象的APIAPI名稱描述CreateEvent()在內(nèi)核中創(chuàng)建一個(gè)新的事件對象。此函數(shù)允許有安全性設(shè)置、手工還是自動重置的標(biāo)志以及初始時(shí)已接受還是未接受信號狀態(tài)的標(biāo)志OpenEvent()創(chuàng)建對已經(jīng)存在的事件對象的引用。此API函數(shù)需要名稱、繼承標(biāo)志和所需的訪問級別SetEvent()將手工重置事件轉(zhuǎn)化為已接受信號狀態(tài)ResetEvent()將手工重置事件轉(zhuǎn)化為非接受信號狀態(tài)PulseEvent()將自動重置事件對象轉(zhuǎn)化為已接受信號狀態(tài)。當(dāng)系統(tǒng)釋放所有的等待它的線程時(shí)此種轉(zhuǎn)化立即發(fā)生為了獲得互斥體,首先,想要訪問調(diào)用的線程可使用OpenMutex()API來獲得指向?qū)ο蟮木浔?;然后,線程將這個(gè)句柄提供給一個(gè)等待函數(shù)。當(dāng)內(nèi)核將互斥體對象發(fā)送給等待線程時(shí),就表明該線程獲得了互斥體的擁有權(quán)。當(dāng)線程獲得擁有權(quán)時(shí),線程控制了對共享資源的訪問——必須設(shè)法盡快地放棄互斥體。放棄共享資源時(shí)需要在該對象上調(diào)用ReleaseMute()API。然后系統(tǒng)負(fù)責(zé)將互斥體擁有權(quán)傳遞給下一個(gè)等待著的線程(由到達(dá)時(shí)間決定順序)。實(shí)驗(yàn)?zāi)康脑诒緦?shí)驗(yàn)中,通過對事件和互斥體對象的了解,來加深對Windowsxp線程同步的理解。1)回顧系統(tǒng)進(jìn)程、線程的有關(guān)概念,加深對Windowsxp線程的理解。2)了解
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 簽訂2025年硅藻泥墻面裝修合同
- 2025年企業(yè)與員工全年勞動合同策劃模板
- 股權(quán)轉(zhuǎn)讓合作合同范本
- 2025年雙邊貿(mào)易權(quán)益保障協(xié)議合同
- 勞動合同范本格式
- 2025年工業(yè)用水供需合同
- 2025年企業(yè)市場拓展合同
- 城市住宅購房合同細(xì)則
- 合作伙伴合同協(xié)議書范本修訂版
- 生產(chǎn)基地租賃合同條款
- 網(wǎng)絡(luò)與信息安全管理培訓(xùn)資料2024
- 茶葉抖音方案
- 道路交通安全法律法規(guī)課件
- 2024屆湖南長郡十八校第一次聯(lián)考讀后續(xù)寫分析-療愈伙伴:Buddy的使命與自閉癥兒童的希望 講義
- 人教版五年級數(shù)學(xué)下冊第四單元分層作業(yè)設(shè)計(jì)
- 班級小組合作的分組和建立課件
- 成功做直銷邀約篇課件
- 消防員緊急避險(xiǎn)技術(shù)培訓(xùn)課件
- 譯林版小學(xué)英語五年級下冊同步教案(全冊)
- 防火檢查站管理制度
- 《有趣的二進(jìn)制》課件
評論
0/150
提交評論