




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、目 錄實驗一 系統(tǒng)功能調(diào)用2實驗二 熟悉Linux環(huán)境5實驗三 shell腳本14實驗四 進(jìn)程控制18實驗五 進(jìn)程間通信22(一) 信號量機(jī)制實驗22實驗五 進(jìn)程間通信28(二) 進(jìn)程的管道通信實驗28實驗五 進(jìn)程間通信32(三) 消息的發(fā)送與接收實驗32實驗五 進(jìn)程間通信38(四) 共享存儲區(qū)通信38實驗六 死鎖避免的算法38實驗七 存儲管理38 1. 常用頁面置換算法38 2動態(tài)分區(qū)分配算法38實驗八 文件操作38實驗一 系統(tǒng)功能調(diào)用【實驗?zāi)康摹?熟悉操作系統(tǒng)的系統(tǒng)功能調(diào)用。2掌握用C語言實現(xiàn)系統(tǒng)功能調(diào)用的方法和步驟。3掌握利用10H號功能調(diào)用(BIOS的顯示I/O功能調(diào)用)來實現(xiàn)對屏幕的
2、操作與控制?!绢A(yù)習(xí)內(nèi)容】1預(yù)習(xí)DOS、BIOS系統(tǒng)功能調(diào)用。2預(yù)習(xí)C語言實現(xiàn)系統(tǒng)功能調(diào)用的方法?!緦嶒瀮?nèi)容】1在屏幕的指定區(qū)域內(nèi)顯示字符串。(必做題)2在屏幕的指定區(qū)域內(nèi)畫框,在框內(nèi)顯示字符串。(提高題)3. 在屏幕的指定區(qū)域內(nèi)動畫顯示字符串。(附加題)【實驗報告】1列出調(diào)試通過程序的清單,并加注釋。2給出必要的程序設(shè)計思路和方法(或列出流程圖)。3總結(jié)上機(jī)調(diào)試過程中所遇到的問題和解決方法及感想。【實驗相關(guān)資料】int86(0X10, &r, &r)函數(shù):對BIOS調(diào)用的標(biāo)準(zhǔn)函數(shù)其中0X10是BIOS調(diào)用類型號(相當(dāng)于INT n調(diào)用的中斷類型號n),是10H號中斷調(diào)用,是一個顯
3、示I/O調(diào)用。BIOS借助此中斷產(chǎn)生的功能調(diào)用控制PC機(jī)屏幕上的文本和圖形。通過給AH 寄存器設(shè)置適當(dāng)?shù)闹颠x擇想要的功能調(diào)用,然后發(fā)中斷10H。 第一個&r是指向聯(lián)合類型REGS的指針,用于接收調(diào)用的功能號及其它一些指定的入口參數(shù),以便傳給相應(yīng)寄存器。第二個&r是指向聯(lián)合類型REGS的指針,用于接收功能調(diào)用后的返回值,即出口參數(shù)。在dos.h中REGS定義如下:struct WORDREGSunsigned int ax,bx,cx,dx,si,di,cflag,flags;struct BYTEGEGS unsigned int al,ah,bl,bh,cl,ch,dl,dh
4、;union REGSstruct WORDREGS x;struct BYTEGEGS h;10H號中斷調(diào)用下所包含的部分功能調(diào)用:AH 功能調(diào)用 00H 置顯示方式 01H 置光標(biāo)類型 02H 置光標(biāo)位置 06H 當(dāng)前顯示頁上滾 07H 當(dāng)前顯示頁下滾 09H 寫字符和屬性02H功能調(diào)用:入口參數(shù):AH=02H DH 光標(biāo)的行位置(行數(shù)),0行是頂行,24行是底行。 DL 光標(biāo)的列位置(列數(shù)),0列是最左邊一列。 BH 光標(biāo)顯示頁數(shù),40列方式,可用0到7,80列方式,可用0到3。 出口參數(shù):無06H號功能調(diào)用:入口參數(shù):AH=06H AL 指明滾動的文本行數(shù)。如放置0,則整個窗口為空白。
5、 CH 指明窗口左上角的行位置(從0到24)。 CL 指明窗口左上角的列位置(從0到79,80列)。 DH 指明窗口右下角的行位置(從0到24)。DL 指明窗口右下角的列位置(從0到79,80列)。BH 指明加到窗口底部的空行顯示屬性。對于彩色/圖形適配器,屬性字節(jié)如下所示:位 說 明7 置“1”用于字符閃爍,置“0”字符不閃爍。6-4 背景色。可用的是:6 5 4 顏色0 0 0 黑0 0 1 藍(lán)0 1 0 綠0 1 1 青1 0 0 紅1 0 1 絳1 1 0 褐1 1 1 淺灰3 前景字符的亮度,置“1”高亮度,置“0”正常亮度。2-0 前景色。可使用的彩色與背景色相同。出口參數(shù):屏幕上
6、窗口適當(dāng)?shù)厣蠞L。09H號功能調(diào)用:入口參數(shù):AH=09H BH 在文本方式中,此寄存器指明正在寫的顯示頁。在40列方式中,可以用0到7頁,在80列方式中,可用0到3頁。在圖形方式中總是0。 AL 放要寫字符的ASCII碼。 BL 在文本方式中,為寫字符的屬性。 CX 將字符和屬性寫到屏幕上的次數(shù)。出口參數(shù):一個字符或多個字符顯示在屏幕上。清屏子程序:void cls(void) union REGS r; r.h.ah=6;/*子功能號*/ r.h.al=0; r.h.ch=0;/*左上角坐標(biāo)*/ r.h.cl=0; r.h.dh=24;/*右下角坐標(biāo)*/ r.h.dl=79; r.h.bh=
7、7;/*7表示黑色*/ int86(0x10,&r,&r);/*系統(tǒng)功能調(diào)用*/ 定位子程序:void locate(int x, int y) union REGS r; r.h.ah=2;/*子功能號*/ r.h.dh=x;/*定位點坐標(biāo)*/r.h.dl=y;r.h.bh=0;int86(0x10,&r,&r);在指定位置寫參數(shù):void writech(int x , int y, char ch ,int attr) union REGS r; locate(x ,y); r.h.ah=9; r.h.bh=0; r.h.al=ch;r.h.bl=attr
8、r.x.cx=1;int86(0x10,&r,&r);屏幕畫框可以用制表符來畫。其主要方法是不斷調(diào)用writech函數(shù),在指定區(qū)域周圍顯示制表符,從而勾勒出一個窗口的輪廓。制表符 ASCII碼 218 191 192217179196內(nèi)容一參考程序:#include<stdio.h>#include<dos.h>#include<stdlib.h>#define SCR 0x10void cls(void)union REGS r;r.h.ah=6;r.h.al=0;r.h.cl=0;r.h.ch=0;r.h.dh=24;r.h.dl=79;
9、r.h.bh=7;int86(SCR,&r,&r);void locate(int x,int y)union REGS r;r.h.ah=2;r.h.dh=x;r.h.dl=y;r.h.bh=0;int86(SCR,&r,&r);void writech(int x,int y,char ch,int attrib)union REGS r;locate(x,y);r.h.ah=9;r.h.bh=0;r.h.al=ch;r.h.bl=attrib;r.x.cx=1;int86(SCR,&r,&r);int main() int i,x=10,y
10、=10; cls(); for(i=0;i<26;i+) writech(x,y+i,65+i,7); getch(); return(0);實驗二 熟悉Ubuntu環(huán)境【實驗?zāi)康摹?了解Ubuntu系統(tǒng)基本操作方法,學(xué)會獨立使用該系統(tǒng)。2熟悉Ubuntu下如何編輯、編譯和運行一個C語言程序。3學(xué)會利用gcc、gdb編譯、調(diào)試C程序。【預(yù)習(xí)內(nèi)容】1預(yù)習(xí)Ubuntu下各種應(yīng)用程序的使用。2預(yù)習(xí)常用的SHELL命令。3預(yù)習(xí)vim編輯器和emacs編輯器使用方法。4預(yù)習(xí)Ubuntu下C程序編輯、編譯和運行過程?!緦嶒瀮?nèi)容】一、登陸LinuxLinux開機(jī),選擇 進(jìn)入,再選擇Ubuntu登陸窗口
11、,輸入用戶名: students ,輸入密碼: 111111 ,進(jìn)入Ubuntu圖形桌面環(huán)境。二、熟悉Ubuntu圖形桌面環(huán)境桌面包含上方的菜單欄和下方的任務(wù)欄。菜單欄包含“應(yīng)用程序菜單”、“位置”、“系統(tǒng)”。通過主菜單可訪問應(yīng)用程序。(1) “應(yīng)用程序”菜單“應(yīng)用程序”菜單包含“辦公”、“附件”、“互聯(lián)網(wǎng)”、“圖形”、“游戲”等?!稗k公”包含了文字處理及電子表格等應(yīng)用程序?!案郊毕掳恕八阉鞴ぞ摺薄ⅰ坝嬎闫鳌?、“文本編輯器”和“終端”等應(yīng)用程序。(2)“位置”菜單“位置”菜單包含“主文件夾”、“桌面”等信息。(3)“系統(tǒng)”菜單“系統(tǒng)”菜單包含“首選項”和“系統(tǒng)管理”等信息。(4)啟動終端
12、模擬器GNOME終端模擬器用一個窗口來模擬字符終端的行為。終端常常被稱為命令行或者 shell,Linux 中絕大部分工作都可以用命令行完成。要啟動一個終端,可以選擇 應(yīng)用程序 附件 終端。 三、練習(xí)常用的Shell命令。(重點)當(dāng)用戶登錄到字符界面系統(tǒng)或使用終端模擬窗口時,就是在和稱為shell的命令解釋程序進(jìn)行通信。當(dāng)用戶在鍵盤上輸入一條命令時,shell程序?qū)γ钸M(jìn)行解釋并完成相應(yīng)的動作。這種動作可能是執(zhí)行用戶的應(yīng)用程序,或者是調(diào)用一個編輯器、GNU/Linux實用程序或其他標(biāo)準(zhǔn)程序,或者是一條錯誤信息,告訴用戶輸入了錯誤的命令。1目錄操作mkdir abc 創(chuàng)建一個目錄abccd a
13、bc 將工作目錄改變到abccd 改變當(dāng)前目錄到主目錄ls 列出當(dāng)前目錄的內(nèi)容ls -l 輸出當(dāng)前目錄內(nèi)容的長列表,每個目錄或文件占一行pwd 顯示當(dāng)前目錄的全路徑2文件顯示實用程序cat mx.c 顯示mx.c文件內(nèi)容more mx.c 分屏顯示mx.c內(nèi)容tail mx.c 顯示文件后幾行cat file1 file2 連接file1 和file2head filename 顯示文件filename的開始10行wc filename 統(tǒng)計文件filename中的行數(shù)、單詞數(shù)和字符數(shù)od 文件 查看非文本文件3文件管理實用程序cp file1 file2 將文件1復(fù)制到文件2mv file1
14、 file2 將文件重命名為file2rm filename 刪除文件filenamerm -i filename 請求用戶確認(rèn)刪除4數(shù)據(jù)操作實用程序 tty 顯示當(dāng)前終端的路徑和文件名 who 顯示當(dāng)前登錄用戶的列表 sort filename 顯示文件filename中的行的排序結(jié)果 spell filename 檢查文件filename中的拼寫錯誤5其他實用程序 date 輸出系統(tǒng)日期和時間 cal 顯示本月的日歷。cal 2002 顯示2002年的日歷 clear 清除終端屏幕 history 顯示你以前執(zhí)行過的命令的列表 man 顯示實用程序的有用信息,并提供該實用程序的基本用法 e
15、cho 讀取參數(shù)并把它寫到輸出四、目錄和文件系統(tǒng)Linux 和 Unix 文件系統(tǒng)被組織成一個有層次的樹形結(jié)構(gòu)。文件系統(tǒng)的最上層是 /,或稱為 根目錄。在 Unix 和 Linux 的設(shè)計理念中,一切皆為文件包括硬盤、分區(qū)和可插拔介質(zhì)。這就意味著所有其它文件和目錄(包括其它硬盤和分區(qū))都位于根目錄中。 例如:/home/jebediah/cheeses.odt 給出了正確的完整路徑,它指向 cheeses.odt 文件,而該文件位于 jebediah 目錄下,該目錄又位于 home 目錄,最後,home 目錄又位于根(/) 目錄下。 在根 (/) 目錄下,有一組重要的系統(tǒng)目錄,在大部分 Lin
16、ux 發(fā)行版里都通用。直接位于根 (/) 目錄下的常見目錄列表如下: · /bin - 重要的二進(jìn)制 (binary) 應(yīng)用程序 · /boot - 啟動 (boot) 配置文件 · /dev - 設(shè)備 (device) 文件 · /etc - 配置文件、啟動腳本等 (etc) · /home - 本地用戶主 (home) 目錄 · /lib - 系統(tǒng)庫 (libraries) 文件 · /lost+found - 在根 (/) 目錄下提供一個遺失+查找(lost+found) 系統(tǒng) · /media - 掛載可移
17、動介質(zhì) (media),諸如 CD、數(shù)碼相機(jī)等 · /mnt - 掛載 (mounted) 文件系統(tǒng) · /opt - 提供一個供可選的 (optional) 應(yīng)用程序安裝目錄 · /proc - 特殊的動態(tài)目錄,用以維護(hù)系統(tǒng)信息和狀態(tài),包括當(dāng)前運行中進(jìn)程 (processes) 信息。 · /root - root (root) 用戶主文件夾,讀作“slash-root” · /sbin - 重要的系統(tǒng)二進(jìn)制 (system binaries) 文件 · /sys - 系統(tǒng) (system) 文件 · /tmp - 臨時(
18、temporary)文件 · /usr - 包含絕大部分所有用戶(users)都能訪問的應(yīng)用程序和文件 · /var - 經(jīng)常變化的(variable)文件,諸如日志或數(shù)據(jù)庫等 五打開PROC目錄了解系統(tǒng)配置把/proc作為當(dāng)前目錄,就可使用ls命令列出它的內(nèi)容。 /proc 文件系統(tǒng)是一種內(nèi)核和內(nèi)核模塊用來向進(jìn)程 (process) 發(fā)送信息的機(jī)制 。這個偽文件系統(tǒng)讓你可以和內(nèi)核內(nèi)部數(shù)據(jù)結(jié)構(gòu)進(jìn)行交互,獲取有關(guān)進(jìn)程的有用信息,在運行中改變設(shè)置 (通過改變內(nèi)核參數(shù))。 與其他文件系統(tǒng)不同,/proc 存在于內(nèi)存之中而不是硬盤上。1察看 /proc 的文件/proc 的文件可以
19、用于訪問有關(guān)內(nèi)核的狀態(tài)、計算機(jī)的屬性、正在運行的進(jìn)程的狀態(tài)等信息。大部分 /proc 中的文件和目錄提供系統(tǒng)物理環(huán)境最新的信息。盡管 /proc 中的文件是虛擬的,但它們?nèi)钥梢允褂萌魏挝募庉嬈骰蛳?#39;more', 'less'或 'cat'這樣的程序來查看。2得到有用的系統(tǒng)/內(nèi)核信息/proc 文件系統(tǒng)可以被用于收集有用的關(guān)于系統(tǒng)和運行中的內(nèi)核的信息。下面是一些重要的文件: · /proc/cpuinfo - CPU 的信息 (型號, 家族, 緩存大小等) · /proc/meminfo - 物理內(nèi)存、交換空間等的信息
20、83; /proc/mounts - 已加載的文件系統(tǒng)的列表 · /proc/devices - 可用設(shè)備的列表 · /proc/filesystems - 被支持的文件系統(tǒng) · /proc/modules - 已加載的模塊 · /proc/version - 內(nèi)核版本 · /proc/cmdline - 系統(tǒng)啟動時輸入的內(nèi)核命令行參數(shù) proc 中的文件遠(yuǎn)不止上面列出的這么多。想要進(jìn)一步了解的讀者可以對 /proc 的每一個文件都'more'一下 。3有關(guān)運行中的進(jìn)程的信息/proc 文件系統(tǒng)可以用于獲取運行中的進(jìn)程的信息。在
21、 /proc 中有一些編號的子目錄。每個編號的目錄對應(yīng)一個進(jìn)程 id (PID)。這樣,每一個運行中的進(jìn)程 /proc 中都有一個用它的 PID 命名的目錄。這些子目錄中包含可以提供有關(guān)進(jìn)程的狀態(tài)和環(huán)境的重要細(xì)節(jié)信息的文件。/proc 文件系統(tǒng)提供了一個基于文件的 Linux 內(nèi)部接口。它可以用于確定系統(tǒng)的各種不同設(shè)備和進(jìn)程的狀態(tài)。對他們進(jìn)行配置。因而,理解和應(yīng)用有關(guān)這個文件系統(tǒng)的知識是理解你的 Linux 系統(tǒng)的關(guān)鍵。六、熟悉vim編輯器在編寫文本或計算機(jī)程序時,需要創(chuàng)建文件、插入新行、重新排列行、修改內(nèi)容等,計算機(jī)文本編輯器就是用來完成這些工作的。Vim編輯器的兩種操作模式是命令模式和輸入
22、模式(如圖2所示)。當(dāng)vim處于命令模式時,可以輸入vim命令。例如,可以刪除文本并從vim中退出。在輸入模式下,vim將把用戶所輸入的任何內(nèi)容都當(dāng)作文本信息,并將它們顯示在屏幕上。vi的工作模式見圖2所示。插入、添加、打開、替換或更改命令模式輸入模式最后一行模式ESC冒號(:)回車圖2 vi編輯器下的模式命令模式在輸入模式下,按ESC可切換到命令模式。命令模式下,可選用下列指令離開vi:命令作 用:q!離開vi,并放棄剛在緩沖區(qū)內(nèi)編輯的內(nèi)容:wq將緩沖區(qū)內(nèi)的資料寫入當(dāng)前文件中,并離開vi:ZZ同wq:x同wq:w將緩沖區(qū)內(nèi)的資料寫入當(dāng)前文件中,但并不離開vi:q離開vi,若文件被修改過,則要
23、被要求確認(rèn)是否放棄修改的內(nèi)容,此指令可與:w配合使用命令模式下光標(biāo)的移動 :命 令作 用h或左箭頭左移一個字符J下移一個字符k上移一個字符l右移一個字符0移至該行的首$移至該行的末移至該行的第一個字符處H移至窗口的第一列M移至窗口中間那一列L移至窗口的最后一列G移至該文件的最后一列W, W下一個單詞 (W 忽略標(biāo)點)b, B上一個單詞 (B 忽略標(biāo)點)+移至下一列的第一個字符處-移至上一列的第一個字符處(移至該句首)移至該句末移至該段首移至該段末nG移至該文件的第n列輸入模式輸入以下命令即可進(jìn)入vi輸入模式:命 令作 用a(append) 在光標(biāo)之后加入資料A 在該行之末加入資料i(inser
24、t)在光標(biāo)之前加入資料I 在該行之首加入資料o(open)新增一行于該行之下,供輸入資料用O新增一行于該行之上,供輸入資料用Dd刪除當(dāng)前光標(biāo)所在行X刪除當(dāng)前光標(biāo)字符X刪除當(dāng)前光標(biāo)之前字符U撤消·重做F查找s 替換,例如:將文件中的所有"FOX"換成"duck",用":%s/FOX/duck/g"ESC離開輸入模式啟動vim命令:命令作用vim filename從第一行開始編輯filename文件vim +filename從最后一行開始編輯filename文件vim -r filename在系統(tǒng)崩潰之后恢復(fù)filename文件
25、vim -R filename以只讀方式編輯filename文件更多用法見 info vi。vim 下程序錄入過程:$ vim aaa.c 進(jìn)入vim命令模式 i 進(jìn)入輸入模式輸入 C源程序(或文本) ESC 回到命令模式 ZZ 保存文件并推出vim CAT aaa.c 顯示aaa.c 文件內(nèi)容七、熟悉gcc編譯器GNU/Linux中通常使用的C編譯器是GNU gcc。編譯器把源程序編譯生成目標(biāo)代碼的任務(wù)分為以下4步: a. 預(yù)處理,把預(yù)處理命令掃描處理完畢; b. 編譯,把預(yù)處理后的結(jié)果編譯成匯編或者目標(biāo)模塊; c. 匯編,把編譯出來的結(jié)果匯編成具體CPU上的目標(biāo)代碼模塊; d. 連接,把多
26、個目標(biāo)代碼模塊連接生成一個大的目標(biāo)模塊; 1使用語法:gcc option | filename . 其中 option 為 gcc 使用時的選項,而 filename 為 gcc要處理的文件。 2GCC選項 GCC的選項有很多類,這類選項控制著GCC程序的運行,以達(dá)到特定的編譯目的。 全局選項(OVERALL OPTIONS) 全局開關(guān)用來控制在“GCC功能介紹”中的GCC的4個步驟的運行,在缺省的情況下,這4個步驟都是要執(zhí)行的,但是當(dāng)給定一些全局開關(guān)后,這些步驟就會在 某一步停止執(zhí)行,這產(chǎn)生中間結(jié)果,例如可能你只是需
27、要中間生成的預(yù)處理的結(jié)果或者是匯編文件(比如你的目的是為了看某個CPU上的匯編語言怎么寫)。 x language 對于源文件是用什么語言編寫的,可以通過文件名的后綴來標(biāo)示,也可以用這開關(guān)。指定輸入文件是什么語言編寫的,language 可以是如下的內(nèi)容 a. c b. objective-c c. c-header d. c+ e.cpp-output f.assembler g.assembler-with-cpp x none 把-x開關(guān)都給關(guān)掉了。 c 編譯成把源文件目標(biāo)代碼,不做連接的動作。 S
28、 把源文件編譯成匯編代碼,不做匯編和連接的動作。 E 只把源文件進(jìn)行預(yù)處理之后的結(jié)果輸出來。不做編譯,匯編,連接的動作。 o file (常用)指明輸出文件名是file。 v 把整個編譯過程的輸出信息都給打印出來。 pipe 由于gcc的工作分為好幾步才完成,所以需要在過程中生成臨時文件,使用-pipe就是用管道替換臨時文件。 語言相關(guān)選項(Language Options) 用來處理和語言相關(guān)的選項。 ansi 這個開關(guān)讓GCC編譯器把所有的GNU的編譯器特性都給關(guān)掉,讓你的程序可以和ansi標(biāo)準(zhǔn)兼容。 include file
29、 在編譯之前,把file包含進(jìn)去,相當(dāng)于在所有編譯的源文件最前面加入了一個#include <file>語句, C 同-E參數(shù)配合使用。讓預(yù)處理后的結(jié)果,把注釋保留,讓人能夠比較好讀它。 連接開關(guān)(Linker Options) 用來控制連接過程的開關(guān)選項。 llibrary 連接庫文件開關(guān)。例如-lugl,則是把程序同libugl.a文件進(jìn)行連接。 lobjc 這個開關(guān)用在面向?qū)ο蟮腃語言文件的庫文件處理中。 nost
30、artfiles 在連接的時候不把系統(tǒng)相關(guān)的啟動代碼連接進(jìn)來。 nostdlib 在連接的時候不把系統(tǒng)相關(guān)的啟動文件和系統(tǒng)相關(guān)的庫連接進(jìn)來。 static 在一些系統(tǒng)上支持動態(tài)連接,這個開關(guān)則不允許動態(tài)連接。 shared 生成可共享的被其他程序連接的目標(biāo)模塊。 目錄相關(guān)開關(guān)(Directory Options) 用于定義與目錄操作相關(guān)的開關(guān)。 Ldir 搜尋庫文件(*
31、.a)的路徑。 調(diào)試開關(guān)(Debugging Options) g 把調(diào)試開關(guān)打開,讓編譯的目標(biāo)文件有調(diào)試信息。 V version 用來告訴編譯器使用它的多少版本的功能,version參數(shù)用來表示版本。 八、掌握Ubuntu下C程序編輯運行過程(重點)Ubuntu下編寫C程序要經(jīng)過以下幾個步驟:啟動常用的編輯器,鍵入C源程序代碼。例如,點擊應(yīng)用程序/附件/文本編輯器,進(jìn)入編輯環(huán)境,輸入C源程序,保存并命名為hello.c# include <stdio.h>void main(void)Printf(“Hello world!n”);編譯源程
32、序點擊應(yīng)用程序/附件/終端,進(jìn)入命令行。用gcc編譯器對C源程序進(jìn)行編譯,以生成一個可執(zhí)行文件。方法:gcc -o hello.out hello.c 運行可執(zhí)行文件 ·/hello.out 注:命令行中 -o選項表示要求編譯器輸出可執(zhí)行文件名為hello.out文件,hello.c是源程序文件?!緦嶒瀳蟾妗?舉例列出常用的shell命令使用方法。2通過實例總結(jié)上機(jī)調(diào)試C語言程序的過程及此次上機(jī)的感想。實驗三 shell腳本【實驗?zāi)康摹?、了解和熟悉創(chuàng)建并使用腳本的步驟。2、熟悉bash的控制結(jié)構(gòu)。3、學(xué)會簡單的shell編程。【實驗內(nèi)容】1、 創(chuàng)建一個簡單的列目錄和日期的shell
33、腳本并運行之。步驟:輸入下列命令,創(chuàng)建一個新文件: cat >new_scrip輸入下列行: echo “Your files are” ls echo “today is” date按回車鍵將光標(biāo)移到一個新行,按Ctrl+D鍵保存并退出。檢查文件內(nèi)容,確保它是正確的: cat new_script運行腳本,輸入它的文件名: new_script該腳本不運行。輸入下列命令,顯示文件的權(quán)限:ls l new _script權(quán)限表明該文件不是可執(zhí)行。要通過簡單調(diào)用文件名來運行腳本,必須有權(quán)限。輸入下列命令,使new_script變成可執(zhí)行文件。 chmod +x new_script要查看新
34、的權(quán)限,輸入: ls l現(xiàn)在擁有文件的讀、寫和執(zhí)行權(quán)限。輸入新腳本的名字以執(zhí)行它: new_script所有輸入到文件的命令都執(zhí)行,并輸出到屏幕上。如果接收到錯誤信息,比如: command not found輸入下列命令:./new_script該命令行通知shell到哪里尋找shell腳本new_script,即您的當(dāng)前目錄“.”。2、 用Shell語言編制一Shell程序,該程序在用戶輸入年、月之后,自動打印數(shù)出該年該月的日歷。<參考程序>echo “Please input the month:”read monthecho “Please input the year:”
35、read yearcal $month $year3、 編程提示用戶輸入兩個單詞,并將其讀入,然后比較這兩個單詞,如果兩個單詞相同則顯示“Match”,并顯示“End of program”,如果不同則顯示“End of program”。Iftest-commandthencommandTurefiFalse<參考程序> $ cat > if1echo n “word 1:”read word1echo n “word 2:”read word2if test “$word1” = “$word2” then echo “Match”fiecho “End of progr
36、am.”<程序說明>ifthen控制結(jié)構(gòu)的語法是:if test_command圖3.1 ifthen流程圖 then commandsfi其中test_command為test “$word1” = “$word2”, test是一個內(nèi)置命令,如果它的第一個參數(shù)和第三個參數(shù)存在第二個參數(shù)所指定的關(guān)系,那么test將返回ture。Shell將執(zhí)行then和fi之間的命令。否則執(zhí)行fi后面語句。、修改上述程序,編程提示用戶輸入兩個單詞,并將其讀入,然后比較這兩個單詞,如果兩個單詞相同顯示“Match”,不同則顯示“Not match”,最后顯示“End of program”。<
37、;編程提示>請使用ifthenelse控制結(jié)構(gòu)。、編程使用case結(jié)構(gòu)創(chuàng)建一個簡單的菜單,屏幕顯示菜單:a. Current date and timeb. User currently logged inc. Name of the working directoryd. Contents of the working directoryEnter a,b,c or d:根據(jù)用戶輸入選項做相應(yīng)操作。<參考程序>echo e “nCOMMAND MENUn”echo “ a. Current date and time”echo “ b. User currently log
38、ged in”echo “ c. Name of the working directory”echo “ d. Contents of the working directoryn”echo n “Enter a,b,c or d:”read answerechocase “$answer” ina)date;b)who;c)pwd;d)ls;*)Echo “There is no selection : $answer”;esac6、修改上題,使用戶可以連續(xù)選擇直到想退出時才退出。7、編程使用select結(jié)構(gòu)生成一個菜單如下:1)apple3)blueberry5)orange 7)STO
39、P2) banana4)kiwi6)watermelonChoose your favorite fruit from these possibilities: 用戶輸入所選項,如 1 顯示:You chose apple as you favorite.That is choice number 1. <參考程序>#!/bin/bashps3=“Chose your favorite fruit from these possibilities:”select FRUIT in apple banana blueberry kiwi orange watermelon STOP
40、doif $FRUIT = STOP then echo “Thanks for playing!”breakfiecho “You chose $FRUIT as you favorite.”echo “That is choice number $REPLY.”echodone<程序說明>select 結(jié)構(gòu)的語法如下:select varnamein argdo commandsdoneREPLY是鍵盤變量?!舅伎碱}】1、什么選項通知rm、cp和mv在刪除或覆蓋文件前得到用戶的確認(rèn)?2、如何確認(rèn)自己在主目錄中?然后再主目錄中創(chuàng)建一個名為Dannty的目錄,再進(jìn)入到Danny目錄
41、,并確認(rèn)你的位置?3、命令echo$PATH的輸出是什么?4、下列命令的運行結(jié)果是什么?who | grep $USERgrep $HOME file1【實驗報告】1列出調(diào)試通過程序的清單,并加注釋。2回答思考題。3總結(jié)上機(jī)調(diào)試過程中所遇到的問題和解決方法及感想?!緦嶒炏嚓P(guān)資料】創(chuàng)建并使用腳本的步驟:創(chuàng)建shell命令文件。使用chmod命令使文件可執(zhí)行。通過輸入腳本文件名執(zhí)行文件。 在執(zhí)行腳本時,shell讀取腳本并按其指示執(zhí)行。它逐行執(zhí)行腳本,就像這些行是從鍵盤輸入的一樣。腳本中所有的實用程序都執(zhí)行。實驗四 進(jìn)程控制【實驗?zāi)康摹?、掌握進(jìn)程的概念,明確進(jìn)程和程序的區(qū)別。2、認(rèn)識和了解并發(fā)執(zhí)
42、行的實質(zhì)。3、分析進(jìn)程爭用資源的現(xiàn)象,學(xué)習(xí)解決進(jìn)程互斥的方法。【實驗內(nèi)容】1、進(jìn)程的創(chuàng)建(必做題) 編寫一段程序,使用系統(tǒng)調(diào)用fork( )創(chuàng)建兩個子進(jìn)程,在系統(tǒng)中有一個父進(jìn)程和兩個子進(jìn)程活動。讓每個進(jìn)程在屏幕上顯示一個字符;父進(jìn)程顯示字符“a”,子進(jìn)程分別顯示字符“b” 和“c”。試觀察記錄屏幕上的顯示結(jié)果,并分析原因。 <參考程序> # include<stdio.h> main() int p1, p2; while(p1=fork()= = -1); if(p1= =0) putchar(b); else while(p2=fork()= =-1); if(p2
43、= =0) putchar(c); else putchar( a); 2、 修改已編寫的程序,將每個進(jìn)程的輸出由單個字符改為一句話,再觀察程序執(zhí)行時屏幕上出現(xiàn)的現(xiàn)象,并分析其原因。(必做題)<參考程序># include<stdio.h>main() int p1, p2, i; while(p1=fork()= = -1); if(p1= =0) for(i=0;i<500;i+) printf(“child%dn”,i); else while(p2=fork()= =-1); If(p2= =0) for(i=0;i<500;i+) printf(“
44、son%dn”,i); else for(i=0;i<500;i+) printf(“daughter%dn”,i); 3、編寫程序創(chuàng)建進(jìn)程樹如圖1和圖2所示,在每個進(jìn)程中顯示當(dāng)前進(jìn)程識別碼和父進(jìn)程識別碼。(必做題)a父進(jìn)程子進(jìn)程圖1 進(jìn)程樹bcdadbce圖2 進(jìn)程樹【思考題】1、系統(tǒng)是怎樣創(chuàng)建進(jìn)程的?2、當(dāng)首次調(diào)用新創(chuàng)建進(jìn)程時,其入口在哪里?3、當(dāng)前運行的程序(主進(jìn)程)的父進(jìn)程是什么?【實驗報告】1、列出調(diào)試通過程序的清單,分析運行結(jié)果。2、給出必要的程序設(shè)計思路和方法(或列出流程圖)。3、回答思考題。4、總結(jié)上機(jī)調(diào)試過程中所遇到的問題和解決方法及感想。【實驗相關(guān)資料】一、進(jìn)程概念1
45、進(jìn)程 UNIX中,進(jìn)程既是一個獨立擁有資源的基本單位,又是一個獨立調(diào)度的基本單位。一個進(jìn)程實體由若干個區(qū)(段)組成,包括程序區(qū)、數(shù)據(jù)區(qū)、棧區(qū)、共享存儲區(qū)等。每個區(qū)又分為若干頁,每個進(jìn)程配置有唯一的進(jìn)程控制塊PCB,用于控制和管理進(jìn)程。PCB的數(shù)據(jù)結(jié)構(gòu)如下: 進(jìn)程表項(Process Table Entry)。 包括一些最常用的核心數(shù)據(jù),如: 進(jìn)程標(biāo)識符PID、用戶標(biāo)識符UID、進(jìn)程狀態(tài)、事件描述符、進(jìn)程和U區(qū)在內(nèi)存或外存的地址、軟中斷信號、計時域、進(jìn)程的大小、偏置值nice、指向就緒隊列中下一個PCB的指針P_Link、指向U區(qū)進(jìn)程正文、數(shù)據(jù)及棧在內(nèi)存區(qū)域的指針。 U區(qū)(U Area)。 用于
46、存放進(jìn)程表項的一些擴(kuò)充信息。每一個進(jìn)程都有一個私用的U區(qū),其中含有:進(jìn)程表項指針、真正用戶標(biāo)識符u-ruid(read user ID)、有效用戶標(biāo)識符u-euid(effective user ID)、用戶文件描述符表、計時器、內(nèi)部I/O參數(shù)、限制字段、差錯字段、返回值、信號處理數(shù)組。 由于UNIX系統(tǒng)采用段頁式存儲管理,為了把段的起始虛地址變換為段在系統(tǒng)中的物理地址,便于實現(xiàn)區(qū)的共享,所以還有: 系統(tǒng)區(qū)表項。 以存放各個段在物理存儲器中的位置等信息。系統(tǒng)把一個進(jìn)程的虛地址空間劃分為若干個連續(xù)的邏輯區(qū),有正文區(qū)、數(shù)據(jù)區(qū)、棧區(qū)等。這些區(qū)是可被共享和保護(hù)的獨立實體,多個進(jìn)程可共享一個區(qū)。為了對區(qū)
47、進(jìn)行管理,核心中設(shè)置一個系統(tǒng)區(qū)表,各表項中記錄了以下有關(guān)描述活動區(qū)的信息:區(qū)的類型和大小、區(qū)的狀態(tài)、區(qū)在物理存儲器中的位置、引用計數(shù)、指向文件索引結(jié)點的指針。 進(jìn)程區(qū)表 系統(tǒng)為每個進(jìn)程配置了一張進(jìn)程區(qū)表。表中,每一項記錄一個區(qū)的起始虛地址及指向系統(tǒng)區(qū)表中對應(yīng)的區(qū)表項。核心通過查找進(jìn)程區(qū)表和系統(tǒng)區(qū)表,便可將區(qū)的邏輯地址變換為物理地址。2 進(jìn)程映像 UNIX系統(tǒng)中,進(jìn)程是進(jìn)程映像的執(zhí)行過程,也就是正在執(zhí)行的進(jìn)程實體。它由三部分組成: 用戶級上、下文。主要成分是用戶程序; 寄存器上、下文。由CPU中的一些寄存器的內(nèi)容組成,如PC,PSW,SP及通用寄存器等; 系統(tǒng)級上、下文。包括OS為管理進(jìn)程所用的
48、信息,有靜態(tài)和動態(tài)之分。3進(jìn)程樹 在UNIX系統(tǒng)中,只有0進(jìn)程是在系統(tǒng)引導(dǎo)時被創(chuàng)建的,在系統(tǒng)初啟時由0進(jìn)程創(chuàng)建1進(jìn)程,以后0進(jìn)程變成對換進(jìn)程,1進(jìn)程成為系統(tǒng)中的始祖進(jìn)程。UNIX利用fork( )為每個終端創(chuàng)建一個子進(jìn)程為用戶服務(wù),如等待用戶登錄、執(zhí)行SHELL命令解釋程序等,每個終端進(jìn)程又可利用fork( )來創(chuàng)建其子進(jìn)程,從而形成一棵進(jìn)程樹??梢哉f,系統(tǒng)中除0進(jìn)程外的所有進(jìn)程都是用fork( )創(chuàng)建的。二、所涉及的中斷調(diào)用1、fork( ) 創(chuàng)建一個新的子進(jìn)程。其子進(jìn)程會復(fù)制父進(jìn)程的數(shù)據(jù)與堆棧空間,并繼承父進(jìn)程的用戶代碼、組代碼、環(huán)境變量、已打開的文件代碼、工作目錄和資源限制。系統(tǒng)調(diào)用格式
49、: int fork() 如果Fork成功則在父進(jìn)程會返回新建立的子進(jìn)程代碼(PID),而在新建立的子進(jìn)程中則返回0。如果fork失敗則直接返回-1。2、wait( ) 等待子進(jìn)程運行結(jié)束。如果子進(jìn)程沒有完成,父進(jìn)程一直等待。wait( )將調(diào)用進(jìn)程掛起,直至其子進(jìn)程因暫?;蚪K止而發(fā)來軟中斷信號為止。如果在wait( )前已有子進(jìn)程暫停或終止,則調(diào)用進(jìn)程做適當(dāng)處理后便返回。系統(tǒng)調(diào)用格式:int wait(status)int *status; 其中,status是用戶空間的地址。它的低8位反應(yīng)子進(jìn)程狀態(tài),為0表示子進(jìn)程正常結(jié)束,非0則表示出現(xiàn)了各種各樣的問題;高8位則帶回了exit( )的返回
50、值。exit( )返回值由系統(tǒng)給出。核心對wait( )作以下處理:(1)首先查找調(diào)用進(jìn)程是否有子進(jìn)程,若無,則返回出錯碼;(2)若找到一處于“僵死狀態(tài)”的子進(jìn)程,則將子進(jìn)程的執(zhí)行時間加到父進(jìn)程的執(zhí)行時間上,并釋放子進(jìn)程的進(jìn)程表項;(3)若未找到處于“僵死狀態(tài)”的子進(jìn)程,則調(diào)用進(jìn)程便在可被中斷的優(yōu)先級上睡眠,等待其子進(jìn)程發(fā)來軟中斷信號時被喚醒。3、exit( )終止進(jìn)程的執(zhí)行。系統(tǒng)調(diào)用格式: void exit(status) int status; 其中,status是返回給父進(jìn)程的一個整數(shù),以備查考。為了及時回收進(jìn)程所占用的資源并減少父進(jìn)程的干預(yù),UNIX/LINUX利用exit( )來實
51、現(xiàn)進(jìn)程的自我終止,通常父進(jìn)程在創(chuàng)建子進(jìn)程時,應(yīng)在進(jìn)程的末尾安排一條exit( ),使子進(jìn)程自我終止。exit(0)表示進(jìn)程正常終止,exit(1)表示進(jìn)程運行有錯,異常終止。 如果調(diào)用進(jìn)程在執(zhí)行exit( )時,其父進(jìn)程正在等待它的終止,則父進(jìn)程可立即得到其返回的整數(shù)。核心須為exit( )完成以下操作:(1)關(guān)閉軟中斷(2)回收資源(3)寫記帳信息(4)置進(jìn)程為“僵死狀態(tài)”實驗五 進(jìn)程間通信 UNIX/LINUX系統(tǒng)的進(jìn)程間通信機(jī)構(gòu)(IPC)允許在任意進(jìn)程間大批量地交換數(shù)據(jù)。本實驗的目的是了解和熟悉LINUX支持的信號量機(jī)制、管道機(jī)制、消息通信機(jī)制及共享存儲區(qū)機(jī)制。(一)信號量機(jī)制實驗【實驗?zāi)康摹?、了解什么是信號。2、熟悉LINUX系統(tǒng)中進(jìn)程之間軟中斷通信的基本原理。【實驗內(nèi)容】1、編寫一段程序
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 哈薩克斯坦辦學(xué)協(xié)議書
- 摩托車銷售代理協(xié)議書
- 搬用工員工合同協(xié)議書
- 繼承公證協(xié)議書
- 聯(lián)盟銷售協(xié)議書
- 廣告牌安裝安全協(xié)議書
- 籃球教練協(xié)議書
- 商場手扶梯使用協(xié)議書
- 深圳稅務(wù)聯(lián)盟鏈協(xié)議書
- 液化氣施工合同協(xié)議書
- 《離散數(shù)學(xué)》題庫答案
- 2025國家開放大學(xué)《員工勞動關(guān)系管理》形考任務(wù)1234答案
- 2025年包鋼集團(tuán)公司招聘筆試參考題庫含答案解析
- 雷電預(yù)警信息接收和響應(yīng)制度
- 道路運輸經(jīng)營安全生產(chǎn)管理制度范本
- 企業(yè)標(biāo)準(zhǔn)化管理手冊(完整版)
- 航空航天概論(課堂PPT)
- 新改版教科版六年級下冊科學(xué)全冊知識點歸納 (超全)
- 七年級第一節(jié)語文課(課堂PPT)
- 絞車對拉安全運輸技術(shù)措施
- PKPM中那七個比的詳細(xì)出處及調(diào)整
評論
0/150
提交評論