操作系統(tǒng)原理實驗指導書(新版)_第1頁
操作系統(tǒng)原理實驗指導書(新版)_第2頁
操作系統(tǒng)原理實驗指導書(新版)_第3頁
操作系統(tǒng)原理實驗指導書(新版)_第4頁
操作系統(tǒng)原理實驗指導書(新版)_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、操作系統(tǒng)原理實驗指導書苗暹 王曉東目 錄實驗一 系統(tǒng)功能調用1實驗二 熟悉Linux環(huán)境6實驗三 進程控制15實驗四 進程間通信18(一) 信號實驗18(二) 進程的管道通信實驗24實驗五 文件操作28實驗一 系統(tǒng)功能調用【實驗目的】1熟悉操作系統(tǒng)的系統(tǒng)功能調用。2掌握用C語言實現(xiàn)系統(tǒng)功能調用的方法和步驟。3掌握利用10H號功能調用(BIOS的顯示I/O功能調用)來實現(xiàn)對屏幕的操作與控制。【預習內容】1預習DOS、BIOS系統(tǒng)功能調用。2預習C語言實現(xiàn)系統(tǒng)功能調用的方法。【實驗內容】1在屏幕的指定區(qū)域內顯示字符串。(必做題)2在屏幕的指定區(qū)域內畫框,在框內顯示字符串。(提高題)3. 在屏幕的指

2、定區(qū)域內動畫顯示字符串。(附加題)【實驗報告】1列出調試通過程序的清單,并加注釋。2給出必要的程序設計思路和方法。3總結上機調試過程中所遇到的問題和解決方法及感想?!緦嶒炏嚓P資料】int86(0X10, &r, &r)函數(shù):對BIOS調用的標準函數(shù)其中0X10是BIOS調用類型號(相當于INT n調用的中斷類型號n),是10H號中斷調用,是一個顯示I/O調用。BIOS借助此中斷產生的功能調用控制PC機屏幕上的文本和圖形。通過給AH 寄存器設置適當?shù)闹颠x擇想要的功能調用,然后發(fā)中斷10H。 第一個&r是指向聯(lián)合類型REGS的指針,用于接收調用的功能號及其它一些指定的入口參數(shù),以便傳給相應寄存器。

3、第二個&r是指向聯(lián)合類型REGS的指針,用于接收功能調用后的返回值,即出口參數(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;union REGSstruct WORDREGS x;struct BYTEGEGS h;10H號中斷調用下所包含的部分功能調用:AH 功能調用 00H 置顯示方式 01H 置光標類型 02H 置光標位置 06H 當前顯示頁上滾 07H 當前顯示頁下滾 09H 寫

4、字符和屬性02H功能調用:入口參數(shù):AH=02H DH 光標的行位置(行數(shù)),0行是頂行,24行是底行。 DL 光標的列位置(列數(shù)),0列是最左邊一列。 BH 光標顯示頁數(shù),40列方式,可用0到7,80列方式,可用0到3。 出口參數(shù):無06H號功能調用:入口參數(shù):AH=06H AL 指明滾動的文本行數(shù)。如放置0,則整個窗口為空白。 CH 指明窗口左上角的行位置(從0到24)。 CL 指明窗口左上角的列位置(從0到79,80列)。 DH 指明窗口右下角的行位置(從0到24)。DL 指明窗口右下角的列位置(從0到79,80列)。BH 指明加到窗口底部的空行顯示屬性。對于彩色/圖形適配器,屬性字節(jié)如

5、下所示:位 說 明7 置“1”用于字符閃爍,置“0”字符不閃爍。6-4 背景色??捎玫氖牵? 5 4 顏色0 0 0 黑0 0 1 藍0 1 0 綠0 1 1 青1 0 0 紅1 0 1 絳1 1 0 褐1 1 1 淺灰3-0 前景色??捎玫氖牵?3 2 1 0 顏色 3 2 1 0 顏色 0 0 0 0 黑 1 0 0 0 灰 0 0 0 1 藍 1 0 0 1 淺藍 0 0 1 0 綠 1 0 1 0 淺綠 0 0 1 1 青 1 0 1 1 淺青 0 1 0 0 紅 1 1 0 0 淺紅 0 1 0 1 品紅 1 1 0 1 淺品紅 0 1 1 0 棕 1 1 1 0 黃 0 1 1 1

6、 灰白 1 1 1 1 白出口參數(shù):屏幕上窗口適當?shù)厣蠞L。09H號功能調用:入口參數(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;/*左上角坐標*/ r.h.cl=0; r.h.dh=24;/*右下角坐標

7、*/ r.h.dl=79; r.h.bh=7;/*7表示黑色*/ int86(0x10,&r,&r);/*系統(tǒng)功能調用*/ 定位子程序: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(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

8、=attrr.x.cx=1;int86(0x10,&r,&r);屏幕畫框可以用制表符來畫。其主要方法是不斷調用writech函數(shù),在指定區(qū)域周圍顯示制表符,從而勾勒出一個窗口的輪廓。下表是常用的制表符和對應的ascii碼:制表符ASCII碼制表符ASCII碼218191196179192217 顯示屏通常劃分為行和列的一個二維系統(tǒng),適配器就在行列組成的網(wǎng)格位置上顯示字符。ABCDZ9910101112353611YX屏幕坐標圖如下所示:注:屏幕以25行80列的格式來顯示字符,即0-24行,0-79列。內容一參考程序:#include#include#include#define SCR 0x1

9、0void 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;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

10、.bl=attrib;r.x.cx=1;int86(SCR,&r,&r);int main() int i,x=10,y=10; cls(); for(i=0;i26;i+) writech(x,y+i,65+i,7); getch(); return(0);實驗二 熟悉Ubuntu環(huán)境【實驗目的】1了解Ubuntu系統(tǒng)基本操作方法,學會獨立使用該系統(tǒng)。2熟悉Ubuntu下如何編輯、編譯和運行一個C語言程序。3學會利用gcc、gdb編譯、調試C程序。【預習內容】1預習Ubuntu下各種應用程序的使用。2預習常用的SHELL命令。3預習vim編輯器和emacs編輯器使用方法。4預習Ubuntu下

11、C程序編輯、編譯和運行過程?!緦嶒瀮热荨恳弧⒌顷慙inuxLinux開機,選擇 進入,再選擇Ubuntu登陸窗口,輸入用戶名: students ,輸入密碼: 111111 ,進入Ubuntu圖形桌面環(huán)境。二、熟悉Ubuntu圖形桌面環(huán)境桌面包含上方的菜單欄和下方的任務欄。菜單欄包含“應用程序菜單”、“位置”、“系統(tǒng)”。通過主菜單可訪問應用程序。(1) “應用程序”菜單“應用程序”菜單包含“辦公”、“附件”、“互聯(lián)網(wǎng)”、“圖形”、“游戲”等?!稗k公”包含了文字處理及電子表格等應用程序?!案郊毕掳恕八阉鞴ぞ摺薄ⅰ坝嬎闫鳌?、“文本編輯器”和“終端”等應用程序。(2)“位置”菜單“位置”菜單包

12、含“主文件夾”、“桌面”等信息。(3)“系統(tǒng)”菜單“系統(tǒng)”菜單包含“首選項”和“系統(tǒng)管理”等信息。(4)啟動終端模擬器GNOME終端模擬器用一個窗口來模擬字符終端的行為。終端常常被稱為命令行或者 shell,Linux 中絕大部分工作都可以用命令行完成。要啟動一個終端,可以選擇 應用程序 附件 終端。 三、目錄和文件系統(tǒng)Linux 和 Unix 文件系統(tǒng)被組織成一個有層次的樹形結構。文件系統(tǒng)的最上層是 /,或稱為 根目錄。在 Unix 和 Linux 的設計理念中,一切皆為文件包括硬盤、分區(qū)和可插拔介質。這就意味著所有其它文件和目錄(包括其它硬盤和分區(qū))都位于根目錄中。 例如:/home/st

13、udent/sy1.c 給出了正確的完整路徑,它指向 sy1.c 文件,而該文件位于 student 目錄下,該目錄又位于 home 目錄,最後,home 目錄又位于根(/) 目錄下。 在根 (/) 目錄下,有一組重要的系統(tǒng)目錄,在大部分 Linux 發(fā)行版里都通用。直接位于根 (/) 目錄下的常見目錄列表如下: /bin - 重要的二進制 (binary) 應用程序 /boot - 啟動 (boot) 配置文件 /dev - 設備 (device) 文件 /etc - 配置文件、啟動腳本等 (etc) /home - 本地用戶主 (home) 目錄 /lib - 系統(tǒng)庫 (libraries

14、) 文件 /lost+found - 在根 (/) 目錄下提供一個遺失+查找(lost+found) 系統(tǒng) /media - 掛載可移動介質 (media),諸如 CD、數(shù)碼相機等 /mnt - 掛載 (mounted) 文件系統(tǒng) /opt - 提供一個供可選的 (optional) 應用程序安裝目錄 /proc - 特殊的動態(tài)目錄,用以維護系統(tǒng)信息和狀態(tài),包括當前運行中進程 (processes) 信息。 /root - root (root) 用戶主文件夾,讀作“slash-root” /sbin - 重要的系統(tǒng)二進制 (system binaries) 文件 /sys - 系統(tǒng) (sys

15、tem) 文件 /tmp - 臨時(temporary)文件 /usr - 包含絕大部分所有用戶(users)都能訪問的應用程序和文件 /var - 經(jīng)常變化的(variable)文件,諸如日志或數(shù)據(jù)庫等 四、打開PROC目錄了解系統(tǒng)配置把/proc作為當前目錄,就可使用ls命令列出它的內容。 /proc 文件系統(tǒng)是一種內核和內核模塊用來向進程 (process) 發(fā)送信息的機制 。這個偽文件系統(tǒng)讓你可以和內核內部數(shù)據(jù)結構進行交互,獲取有關進程的有用信息,在運行中改變設置 (通過改變內核參數(shù))。 與其他文件系統(tǒng)不同,/proc 存在于內存之中而不是硬盤上。1察看 /proc 的文件/proc

16、的文件可以用于訪問有關內核的狀態(tài)、計算機的屬性、正在運行的進程的狀態(tài)等信息。大部分 /proc 中的文件和目錄提供系統(tǒng)物理環(huán)境最新的信息。盡管 /proc 中的文件是虛擬的,但它們仍可以使用任何文件編輯器或像more, less或 cat這樣的程序來查看。2得到有用的系統(tǒng)/內核信息/proc 文件系統(tǒng)可以被用于收集有用的關于系統(tǒng)和運行中的內核的信息。下面是一些重要的文件: /proc/cpuinfo - CPU 的信息 (型號, 家族, 緩存大小等) /proc/meminfo - 物理內存、交換空間等的信息 /proc/mounts - 已加載的文件系統(tǒng)的列表 /proc/devices -

17、 可用設備的列表 /proc/filesystems - 被支持的文件系統(tǒng) /proc/modules - 已加載的模塊 /proc/version - 內核版本 /proc/cmdline - 系統(tǒng)啟動時輸入的內核命令行參數(shù) proc 中的文件遠不止上面列出的這么多。想要進一步了解的讀者可以對 /proc 的每一個文件都more一下 。3有關運行中的進程的信息/proc 文件系統(tǒng)可以用于獲取運行中的進程的信息。在 /proc 中有一些編號的子目錄。每個編號的目錄對應一個進程 id (PID)。這樣,每一個運行中的進程 /proc 中都有一個用它的 PID 命名的目錄。這些子目錄中包含可以提供

18、有關進程的狀態(tài)和環(huán)境的重要細節(jié)信息的文件。/proc 文件系統(tǒng)提供了一個基于文件的 Linux 內部接口。它可以用于確定系統(tǒng)的各種不同設備和進程的狀態(tài)。對他們進行配置。因而,理解和應用有關這個文件系統(tǒng)的知識是理解你的 Linux 系統(tǒng)的關鍵。五、文件權限Linux 系統(tǒng)上的所有文件都有權限,以允許或者阻止其它用戶查閱、修改或者執(zhí)行。超級用戶“root”則可以訪問系統(tǒng)上的任意文件。每個文件都有訪問限制、用戶限制以及隸屬于某個用戶/組(owner/group)。 所有文件皆有如下三組權限加以保護,按重要性依次排列: 用戶(user) :適用于該文件的所有者 組(group) :適用于該文件所屬的組

19、 其他(other) :適用于所有其他用戶 上述三組權限信息的每一組都包含了實際權限。這些權限信息,連同它們對文件和目錄具有的不同含義,概述如下: 讀(read) :允許顯示/打開該文件 可以顯示目錄內容 寫(write) :可以編輯或刪除該文件 可以更改目錄內容 可執(zhí)行(execute) :可執(zhí)行文件可以作為程序運行 可以進入該目錄 要查看和編輯文件或目錄的權限,請打開 位置 主文件夾 并在文件或者目錄上單擊右鍵。然後選擇 屬性。授權信息就在 權限標簽頁中,如果您是該文件的所有者,您可以編輯所有的授權等級。例如:ls l普通文件:-rw-r-r- 1 bin bin 2208 May 28

20、1987 /etc/rc 目錄文件:drwxr-xr-x 2 bin bin 240 Nov 13 1987 dos 特殊文件:brw-r-xr-x 3 bin bin 2,7 Jan 12 15:07 /dev/fd0 c-w-w-w- 2 bin bin 6,0,Jan 11 13:37 /dev/Lp存取權 所 同 其 有 組 他 者 用 用 戶 用chmod改變文件或目錄的存取權限:格式:chmod 誰 操作符 許可權 文件名(或目錄名) a + r g w - x o s u = t u g o其中,a:代表all,即所有的用戶; g:代表group,即小組用戶; o:代表other

21、s,即一般用戶; u:代表user,即文件的所有者;+:代表增加許可權;-:代表刪除許可權;=:代表賦予指定的許可權。例如:$chmod u+w display 完成對u用戶增加對文件display的寫權限。注:上述命令是由文件所有者或超級用戶進行修改。六、練習常用的Shell命令。(重點)當用戶登錄到字符界面系統(tǒng)或使用終端模擬窗口時,就是在和稱為shell的命令解釋程序進行通信。當用戶在鍵盤上輸入一條命令時,shell程序將對命令進行解釋并完成相應的動作。這種動作可能是執(zhí)行用戶的應用程序,或者是調用一個編輯器、GNU/Linux實用程序或其他標準程序,或者是一條錯誤信息,告訴用戶輸入了錯誤的

22、命令。1目錄操作mkdir abc 創(chuàng)建一個目錄abccd abc 將工作目錄改變到abccd 改變當前目錄到主目錄ls 列出當前目錄的內容ls -l 輸出當前目錄內容的長列表,每個目錄或文件占一行pwd 顯示當前目錄的全路徑2文件顯示實用程序cat mx.c 顯示mx.c文件內容more mx.c 分屏顯示mx.c內容tail mx.c 顯示文件后幾行cat file1 file2 連接file1 和file2head filename 顯示文件filename的開始10行wc filename 統(tǒng)計文件filename中的行數(shù)、單詞數(shù)和字符數(shù)od 文件 查看非文本文件3文件管理實用程序cp

23、 file1 file2 將文件1復制到文件2mv file1 file2 將文件重命名為file2rm filename 刪除文件filenamerm -i filename 請求用戶確認刪除4數(shù)據(jù)操作實用程序 tty 顯示當前終端的路徑和文件名 who 顯示當前登錄用戶的列表 sort filename 顯示文件filename中的行的排序結果 spell filename 檢查文件filename中的拼寫錯誤5其他實用程序 date 輸出系統(tǒng)日期和時間 cal 顯示本月的日歷。cal 2002 顯示2002年的日歷 clear 清除終端屏幕 history 顯示你以前執(zhí)行過的命令的列表

24、man 顯示實用程序的有用信息,并提供該實用程序的基本用法 echo 讀取參數(shù)并把它寫到輸出七、熟悉vim編輯器在編寫文本或計算機程序時,需要創(chuàng)建文件、插入新行、重新排列行、修改內容等,計算機文本編輯器就是用來完成這些工作的。Vim編輯器的兩種操作模式是命令模式和輸入模式(如圖2所示)。當vim處于命令模式時,可以輸入vim命令。例如,可以刪除文本并從vim中退出。在輸入模式下,vim將把用戶所輸入的任何內容都當作文本信息,并將它們顯示在屏幕上。vi的工作模式見圖2所示。插入、添加、打開、替換或更改命令模式輸入模式最后一行模式ESC冒號(:)回車圖2 vi編輯器下的模式命令模式在輸入模式下,按

25、ESC可切換到命令模式。命令模式下,可選用下列指令離開vi:命令作 用:q!離開vi,并放棄剛在緩沖區(qū)內編輯的內容:wq將緩沖區(qū)內的資料寫入當前文件中,并離開vi:ZZ同wq:x同wq:w將緩沖區(qū)內的資料寫入當前文件中,但并不離開vi:q離開vi,若文件被修改過,則要被要求確認是否放棄修改的內容,此指令可與:w配合使用命令模式下光標的移動 :命 令作 用h或左箭頭左移一個字符J下移一個字符k上移一個字符l右移一個字符0移至該行的首$移至該行的末移至該行的第一個字符處H移至窗口的第一列M移至窗口中間那一列L移至窗口的最后一列G移至該文件的最后一列W, W下一個單詞 (W 忽略標點)b, B上一個

26、單詞 (B 忽略標點)+移至下一列的第一個字符處-移至上一列的第一個字符處(移至該句首)移至該句末移至該段首移至該段末nG移至該文件的第n列輸入模式輸入以下命令即可進入vi輸入模式:命 令作 用a(append) 在光標之后加入資料A 在該行之末加入資料i(insert)在光標之前加入資料I 在該行之首加入資料o(open)新增一行于該行之下,供輸入資料用O新增一行于該行之上,供輸入資料用Dd刪除當前光標所在行X刪除當前光標字符X刪除當前光標之前字符U撤消重做F查找s 替換,例如:將文件中的所有FOX換成duck,用:%s/FOX/duck/gESC離開輸入模式啟動vim命令:命令作用vim

27、filename從第一行開始編輯filename文件vim +filename從最后一行開始編輯filename文件vim -r filename在系統(tǒng)崩潰之后恢復filename文件vim -R filename以只讀方式編輯filename文件更多用法見 info vi。vim 下程序錄入過程:$ vim aaa.c 進入vim命令模式 i 進入輸入模式輸入 C源程序(或文本) ESC 回到命令模式 ZZ 保存文件并推出vim CAT aaa.c 顯示aaa.c 文件內容八、熟悉gcc編譯器GNU/Linux中通常使用的C編譯器是GNU gcc。編譯器把源程序編譯生成目標代碼的任務分為以下

28、4步: a. 預處理,把預處理命令掃描處理完畢; b. 編譯,把預處理后的結果編譯成匯編或者目標模塊; c. 匯編,把編譯出來的結果匯編成具體CPU上的目標代碼模塊; d. 連接,把多個目標代碼模塊連接生成一個大的目標模塊; 1使用語法:gcc option | filename . 其中 option 為 gcc 使用時的選項,而 filename 為 gcc要處理的文件。 2GCC選項 GCC的選項有很多類,這類選項控制著GCC程序的運行,以達到特定的編譯目的。 全局選項(OVERALL OPTIONS) 全局開關用來控制在“GCC功能介紹”中的GCC的4個步驟的運行,在缺省的情況下,這4

29、個步驟都是要執(zhí)行的,但是當給定一些全局開關后,這些步驟就會在 某一步停止執(zhí)行,這產生中間結果,例如可能你只是需要中間生成的預處理的結果或者是匯編文件(比如你的目的是為了看某個CPU上的匯編語言怎么寫)。 x language 對于源文件是用什么語言編寫的,可以通過文件名的后綴來標示,也可以用這開關。指定輸入文件是什么語言編寫的,language 可以是如下的內容 a. c b. objective-c c. c-header d. c+ e.cpp-output f.assembler g.assembler-with-cpp x none 把-x開關都給關掉了。 c 編譯成把源文件目標代碼,

30、不做連接的動作。 S 把源文件編譯成匯編代碼,不做匯編和連接的動作。 E 只把源文件進行預處理之后的結果輸出來。不做編譯,匯編,連接的動作。 o file (常用)指明輸出文件名是file。 v 把整個編譯過程的輸出信息都給打印出來。 pipe 由于gcc的工作分為好幾步才完成,所以需要在過程中生成臨時文件,使用-pipe就是用管道替換臨時文件。 語言相關選項(Language Options) 用來處理和語言相關的選項。 ansi 這個開關讓GCC編譯器把所有的GNU的編譯器特性都給關掉,讓你的程序可以和ansi標準兼容。 include file 在編譯之前,把file包含進去,相當于在所

31、有編譯的源文件最前面加入了一個#include 語句, C 同-E參數(shù)配合使用。讓預處理后的結果,把注釋保留,讓人能夠比較好讀它。 連接開關(Linker Options) 用來控制連接過程的開關選項。 llibrary 連接庫文件開關。例如-lugl,則是把程序同libugl.a文件進行連接。 lobjc 這個開關用在面向對象的C語言文件的庫文件處理中。 nostartfiles 在連接的時候不把系統(tǒng)相關的啟動代碼連接進來。 nostdlib 在連接的時候不把系統(tǒng)相關的啟動文件和系統(tǒng)相關的庫連接進來。 static 在一些系統(tǒng)上支持動態(tài)連接,這個開關則不允許動態(tài)連接。 shared 生成可共

32、享的被其他程序連接的目標模塊。 目錄相關開關(Directory Options) 用于定義與目錄操作相關的開關。 Ldir 搜尋庫文件(*.a)的路徑。 調試開關(Debugging Options) g 把調試開關打開,讓編譯的目標文件有調試信息。 V version 用來告訴編譯器使用它的多少版本的功能,version參數(shù)用來表示版本。 九、掌握Ubuntu下C程序編輯運行過程(重點)Ubuntu下編寫C程序要經(jīng)過以下幾個步驟:啟動常用的編輯器,鍵入C源程序代碼。例如,點擊應用程序/附件/文本編輯器,進入編輯環(huán)境,輸入C源程序,保存并命名為hello.c# include void ma

33、in(void)Printf(“Hello world!n”);編譯源程序點擊應用程序/附件/終端,進入命令行。用gcc編譯器對C源程序進行編譯,以生成一個可執(zhí)行文件。方法:gcc -o hello.out hello.c 運行可執(zhí)行文件 /hello.out 注:命令行中 -o選項表示要求編譯器輸出可執(zhí)行文件名為hello.out文件,hello.c是源程序文件。【實驗報告】1舉例列出常用的shell命令使用方法。2通過實例總結上機調試C語言程序的過程及此次上機的感想。實驗三 進程控制【實驗目的】1、掌握進程的概念,明確進程和程序的區(qū)別。2、認識和了解并發(fā)執(zhí)行的實質。3、分析進程爭用資源的現(xiàn)

34、象,學習解決進程互斥的方法?!緦嶒瀮热荨?、進程的創(chuàng)建 編寫一段程序,使用系統(tǒng)調用fork( )創(chuàng)建兩個子進程,在系統(tǒng)中有一個父進程和兩個子進程活動。讓每個進程在屏幕上顯示一個字符;父進程顯示字符“a”,子進程分別顯示字符“b” 和“c”。試觀察記錄屏幕上的顯示結果。 a父進程子進程圖1 內容一進程樹bc # include main() int p1, p2; while(p1=fork()= = -1); if(p1= =0) putchar(b); else while(p2=fork()= =-1); if(p2= =0) putchar(c); else putchar( a); 2

35、、 修改上述程序,在每個進程中顯示當前進程識別碼和父進程識別碼,再觀察記錄程序執(zhí)行時屏幕上出現(xiàn)結果,并分析原因。(必做題)3、編寫程序創(chuàng)建進程樹如圖2、3所示,在每個進程中顯示當前進程識別碼和父進程識別碼。(必做題)a父進程子進程圖2 進程樹bcda父進程子進程圖3 進程樹bcd【思考題】1、Linux系統(tǒng)是如何創(chuàng)建進程的?2、當前運行的程序(主進程)的父進程是什么?【實驗報告】1、列出調試通過程序的清單,分析運行結果。2、給出必要的程序設計思路和方法(或列出流程圖)。3、回答思考題。4、總結上機調試過程中所遇到的問題和解決方法及感想?!緦嶒炏嚓P資料】一、進程概念1進程 UNIX中,進程既是一

36、個獨立擁有資源的基本單位,又是一個獨立調度的基本單位。一個進程實體由若干個區(qū)(段)組成,包括程序區(qū)、數(shù)據(jù)區(qū)、棧區(qū)、共享存儲區(qū)等。每個區(qū)又分為若干頁,每個進程配置有唯一的進程控制塊PCB,用于控制和管理進程。PCB的數(shù)據(jù)結構如下: 進程表項(Process Table Entry)。 包括一些最常用的核心數(shù)據(jù),如: 進程標識符PID、用戶標識符UID、進程狀態(tài)、事件描述符、進程和U區(qū)在內存或外存的地址、軟中斷信號、計時域、進程的大小、偏置值nice、指向就緒隊列中下一個PCB的指針P_Link、指向U區(qū)進程正文、數(shù)據(jù)及棧在內存區(qū)域的指針。 U區(qū)(U Area)。 用于存放進程表項的一些擴充信息。

37、每一個進程都有一個私用的U區(qū),其中含有:進程表項指針、真正用戶標識符u-ruid(read user ID)、有效用戶標識符u-euid(effective user ID)、用戶文件描述符表、計時器、內部I/O參數(shù)、限制字段、差錯字段、返回值、信號處理數(shù)組。 由于UNIX系統(tǒng)采用段頁式存儲管理,為了把段的起始虛地址變換為段在系統(tǒng)中的物理地址,便于實現(xiàn)區(qū)的共享,所以還有: 系統(tǒng)區(qū)表項。 以存放各個段在物理存儲器中的位置等信息。系統(tǒng)把一個進程的虛地址空間劃分為若干個連續(xù)的邏輯區(qū),有正文區(qū)、數(shù)據(jù)區(qū)、棧區(qū)等。這些區(qū)是可被共享和保護的獨立實體,多個進程可共享一個區(qū)。為了對區(qū)進行管理,核心中設置一個系統(tǒng)

38、區(qū)表,各表項中記錄了以下有關描述活動區(qū)的信息:區(qū)的類型和大小、區(qū)的狀態(tài)、區(qū)在物理存儲器中的位置、引用計數(shù)、指向文件索引結點的指針。 進程區(qū)表 系統(tǒng)為每個進程配置了一張進程區(qū)表。表中,每一項記錄一個區(qū)的起始虛地址及指向系統(tǒng)區(qū)表中對應的區(qū)表項。核心通過查找進程區(qū)表和系統(tǒng)區(qū)表,便可將區(qū)的邏輯地址變換為物理地址。2 進程映像 UNIX系統(tǒng)中,進程是進程映像的執(zhí)行過程,也就是正在執(zhí)行的進程實體。它由三部分組成: 用戶級上、下文。主要成分是用戶程序; 寄存器上、下文。由CPU中的一些寄存器的內容組成,如PC,PSW,SP及通用寄存器等; 系統(tǒng)級上、下文。包括OS為管理進程所用的信息,有靜態(tài)和動態(tài)之分。3進

39、程樹 在UNIX系統(tǒng)中,只有0進程是在系統(tǒng)引導時被創(chuàng)建的,在系統(tǒng)初啟時由0進程創(chuàng)建1進程,以后0進程變成對換進程,1進程成為系統(tǒng)中的始祖進程。UNIX利用fork( )為每個終端創(chuàng)建一個子進程為用戶服務,如等待用戶登錄、執(zhí)行SHELL命令解釋程序等,每個終端進程又可利用fork( )來創(chuàng)建其子進程,從而形成一棵進程樹??梢哉f,系統(tǒng)中除0進程外的所有進程都是用fork( )創(chuàng)建的。二、所涉及的中斷調用1、fork( ) 創(chuàng)建一個新的子進程。其子進程會復制父進程的數(shù)據(jù)與堆??臻g,并繼承父進程的用戶代碼、組代碼、環(huán)境變量、已打開的文件代碼、工作目錄和資源限制。系統(tǒng)調用格式: int fork()如果

40、Fork成功則在父進程會返回新建立的子進程代碼(PID),而在新建立的子進程中則返回0。如果fork失敗則直接返回-1。2、getpid()取得目前進程的識別碼,許多程序利用取到的此值來建立臨時文件,以避免臨時文件相同帶來的問題。系統(tǒng)調用格式: int getpid()例如:#include main() printf(“pid=%dn”,getpid();3、 getppid取得目前進程的父進程識別碼。系統(tǒng)調用格式: int getppid() 例如:#include void main() printf(“My parents pid=%dn”,getppid();實驗四 進程間通信 UN

41、IX/LINUX系統(tǒng)的進程間通信機構(IPC)允許在任意進程間大批量地交換數(shù)據(jù)。本實驗的目的是了解和熟悉LINUX支持的信號機制、管道機制、消息通信機制及共享存儲區(qū)機制。(一)信號機制實驗【實驗目的】1、了解什么是信號。2、熟悉LINUX系統(tǒng)中進程之間軟中斷通信的基本原理。【實驗內容】1、編寫一段程序,使用系統(tǒng)調用fork( )創(chuàng)建兩個子進程,再用系統(tǒng)調用signal( )讓父進 程捕捉鍵盤上來的中斷信號(即按ctrl+c鍵),當捕捉到中斷信號后,父進程用系統(tǒng)調用kill( )向兩個子進程發(fā)出信號,子進程捕捉到信號后,分別輸出下列信息后終止: Child process 1 is killed

42、 by parent!Child process 2 is killed by parent!父進程等待兩個子進程終止后,輸出以下信息后終止: Parent process is killed! #include#include#include#include#include#includeint wait_mark;void waiting(),stop();void main() int p1, p2;signal(SIGINT,stop);while(p1=fork()=-1);if(p10)/*在父進程中*/ while(p2=fork()= =-1); If(p20)/*在父進程中*

43、/ wait_mark=1; waiting(); kill(p1,10); kill(p2,12); wait( ); wait( ); printf(“parent process is killed!n”); exit(0); else/*在子進程2中*/ wait_mark=1;signal(12,stop);waiting();lockf(1,1,0);printf(“child process 2 is killed by parent!n”);lockf(1,0,0);exit(0); else/*在子進程1中*/ wait_mark=1; signal(10,stop); wa

44、iting(); lockf(1,1,0); printf(“child process 1 is killed by parent!n”); lockf(1,0,0); exit(0);void waiting() while(wait_mark!=0);void stop() wait_mark=0;實驗要求:、運行程序并分析結果。、該程序段前面部分用了兩個wait(0),為什么?、該程序段中每個進程退出時都用了語句exit(0),為什么?2、修改上面的程序,增加語句signal(SIGINT,SIG_IGN),再觀察程序執(zhí)行時屏幕上出現(xiàn)的現(xiàn)象,并分析其原因。# include# incl

45、ude# include# include#include#includeint wait_mark;void stop();void waiting();int main() int p1, p2; signal(SIGINT,stop); signal(SIGINT,SIG_IGN); while(p1=fork()=-1); if(p10) while(p2=fork()=-1); if(p20) wait_mark=1; waiting(); kill(p1,10); kill(p2,12); wait(); wait(); printf(parent process is kille

46、d!n); exit(0); else wait_mark=1; signal(12,stop); signal(12,SIG_IGN); waiting(); lockf(1,1,0); printf(child process 2 is killed by parent!n); lockf(1,0,0); exit(0); else wait_mark=1; signal(10,stop); signal(10,SIG_IGN); waiting(); lockf(1,1,0); printf(child process 1 is killed by parent!n); lockf(1,0,0); exit(0); return 0; void wai

溫馨提示

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

評論

0/150

提交評論