




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、計(jì)算機(jī)科學(xué)與信息學(xué)院操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書(shū)王道書(shū)編寫(xiě)適用專(zhuān)業(yè): 信息安全、網(wǎng)絡(luò)工程貴州大學(xué)二OO九年十一月前言操作系統(tǒng)是一門(mén)理論性和時(shí)間性都很強(qiáng)的課程。要學(xué)好操作系統(tǒng)的設(shè)計(jì)原理,除了聽(tīng)課、看書(shū)、做習(xí)題外,最好的方法就是在實(shí)踐中進(jìn)行,包括使用操作系統(tǒng)、閱讀和分析已有操作系統(tǒng)的源代碼、自己設(shè)計(jì)小型系統(tǒng)/模塊或模擬算法等。本教材安排的實(shí)驗(yàn)內(nèi)容按深度可分為五個(gè)層次,即:使用級(jí)、觀察級(jí)、系統(tǒng)管理級(jí)、源碼閱讀級(jí)和實(shí)現(xiàn)級(jí)。(1)使用級(jí):是指如何使用操作系統(tǒng),包括對(duì)命令(以及菜單和shell)、系統(tǒng)調(diào)用和系統(tǒng)文件的使用。(2)觀察級(jí):是指通過(guò)使用級(jí)的接口,從外部觀察操作系統(tǒng)的內(nèi)部工作過(guò)程和結(jié)構(gòu)。(3)系統(tǒng)管理級(jí):
2、是指系統(tǒng)或設(shè)備的安裝、配置和性能調(diào)整。(4)源碼閱讀級(jí):是指對(duì)現(xiàn)有操作系統(tǒng)部分內(nèi)核源代碼的閱讀。(5)實(shí)現(xiàn)級(jí):是指編程模擬實(shí)現(xiàn)操作系統(tǒng)某些功能模塊。實(shí)驗(yàn)的操作平臺(tái)是Red Hat Linux 9.0和Windows 2000 Professional,其中前者是主要的實(shí)驗(yàn)平臺(tái),因?yàn)樵创a閱讀級(jí)等實(shí)驗(yàn)都是在Linux平臺(tái)上進(jìn)行的,當(dāng)然,在Linux上進(jìn)行的實(shí)驗(yàn)基本上也都可在UNIX平臺(tái)上直接進(jìn)行。根據(jù)專(zhuān)業(yè)特點(diǎn)及自己的需要以及實(shí)驗(yàn)條件等選擇相應(yīng)的實(shí)驗(yàn)內(nèi)容。(目錄 )實(shí)驗(yàn)一 Linux系統(tǒng)用戶接口和編程界面4實(shí)驗(yàn)二 進(jìn)程的創(chuàng)建6實(shí)驗(yàn)三 進(jìn)程的控制11實(shí)驗(yàn)四 進(jìn)程的管道通信15實(shí)驗(yàn)五 進(jìn)程調(diào)度實(shí)驗(yàn)18實(shí)
3、驗(yàn)報(bào)告的基本內(nèi)容及要求20貴州大學(xué)實(shí)驗(yàn)報(bào)告21實(shí)驗(yàn)一 Linux系統(tǒng)用戶接口和編程界面實(shí)驗(yàn)學(xué)時(shí):2實(shí)驗(yàn)類(lèi)型:(驗(yàn)證)實(shí)驗(yàn)要求:(必做)一、實(shí)驗(yàn)?zāi)康?熟悉使用Linux字符界面、窗口系統(tǒng)的常用命令。2熟悉運(yùn)用Linux常用的編程工具。3熟悉運(yùn)用Linux的在線求助系統(tǒng)。4掌握在Linux操作系統(tǒng)環(huán)境上編輯、編譯、調(diào)試、運(yùn)行一個(gè)C語(yǔ)言程序的全過(guò)程。二、實(shí)驗(yàn)內(nèi)容1熟悉開(kāi)機(jī)后登錄Linux系統(tǒng)和退出系統(tǒng)的過(guò)程;2熟悉Linux字符界面虛擬終端窗口和shell,以及圖形界面X-Window(如gnome或KDE):練習(xí)并掌握常用的Linux操作命令,如ls、cat、ps、df、find、grep、cd、
4、more、cp、rm、kill、at、vi、cc、man、help、control+d/c、等;熟悉常用shell的提示符;熟悉字符窗口與圖形界面之間的切換。3學(xué)習(xí)使用Linux的在線求助系統(tǒng),如man和help命令等。4掌握一種Linux的編輯器,特別是字符界面的vi工具的使用。5用vi編輯一個(gè)打印“Hello,I am a C program”字串的C語(yǔ)言程序,然后編譯并運(yùn)行它,記下整個(gè)過(guò)程。熟悉gcc、gdb等編譯器、調(diào)試器的使用。 三、實(shí)驗(yàn)原理、方法和手段Linux操作系統(tǒng)環(huán)境下完成相關(guān)命令的使用;四、實(shí)驗(yàn)組織運(yùn)行要求課堂上集中授課,學(xué)生獨(dú)立完成實(shí)驗(yàn)。五、實(shí)驗(yàn)條件PC機(jī)或工作站一臺(tái);R
5、edHat9.0操作系統(tǒng);六、實(shí)驗(yàn)步驟 按Linux安裝步驟完成;七、思考題Linux的命令與Windows命令有什么不同?八、實(shí)驗(yàn)報(bào)告參見(jiàn)實(shí)驗(yàn)報(bào)告要求;九、其它說(shuō)明 課后可以在RedHat9.0虛擬機(jī)上并完成相關(guān)實(shí)驗(yàn)。實(shí)驗(yàn)二 進(jìn)程的創(chuàng)建實(shí)驗(yàn)學(xué)時(shí):2實(shí)驗(yàn)類(lèi)型:(驗(yàn)證)實(shí)驗(yàn)要求:(必做)一、實(shí)驗(yàn)?zāi)康?、掌握進(jìn)程的概念,明確進(jìn)程的含義2、認(rèn)識(shí)并了解并發(fā)執(zhí)行的實(shí)質(zhì)二、實(shí)驗(yàn)內(nèi)容1、編寫(xiě)一段程序,使用系統(tǒng)調(diào)用fork( )創(chuàng)建兩個(gè)子進(jìn)程。當(dāng)此程序運(yùn)行時(shí),在系統(tǒng)中有一個(gè)父進(jìn)程和兩個(gè)子進(jìn)程活動(dòng)。讓每一個(gè)進(jìn)程在屏幕上顯示一個(gè)字符:父進(jìn)程顯示'a',子進(jìn)程分別顯示字符'b'和字符
6、'c'。試觀察記錄屏幕上的顯示結(jié)果,并分析原因。2、修改上述程序,每一個(gè)進(jìn)程循環(huán)顯示一句話。子進(jìn)程顯示'daughter '及'son ',父進(jìn)程顯示 'parent ',觀察結(jié)果,分析原因。三、實(shí)驗(yàn)原理、方法和手段實(shí)驗(yàn)手段:編程驗(yàn)證原理;四、實(shí)驗(yàn)組織運(yùn)行要求課堂集中授課參考程序和學(xué)生編程實(shí)現(xiàn)、并回答相關(guān)疑問(wèn);五、實(shí)驗(yàn)條件(1)閱讀LINUX的fork.c源碼文件,分析進(jìn)程的創(chuàng)建過(guò)程。(2)閱讀LINUX的sched.c源碼文件,加深對(duì)進(jìn)程管理概念的認(rèn)識(shí)。六、實(shí)驗(yàn)步驟一、進(jìn)程UNIX中,進(jìn)程既是一個(gè)獨(dú)立擁有資源的基本單位,又是一個(gè)
7、獨(dú)立調(diào)度的基本單位。一個(gè)進(jìn)程實(shí)體由若干個(gè)區(qū)(段)組成,包括程序區(qū)、數(shù)據(jù)區(qū)、棧區(qū)、共享存儲(chǔ)區(qū)等。每個(gè)區(qū)又分為若干頁(yè),每個(gè)進(jìn)程配置有唯一的進(jìn)程控制塊PCB,用于控制和管理進(jìn)程。PCB的數(shù)據(jù)結(jié)構(gòu)如下:1、進(jìn)程表項(xiàng)(Process Table Entry)。包括一些最常用的核心數(shù)據(jù):進(jìn)程標(biāo)識(shí)符PID、用戶標(biāo)識(shí)符UID、進(jìn)程狀態(tài)、事件描述符、進(jìn)程和U區(qū)在內(nèi)存或外存的地址、軟中斷信號(hào)、計(jì)時(shí)域、進(jìn)程的大小、偏置值nice、指向就緒隊(duì)列中下一個(gè)PCB的指針P_Link、指向U區(qū)進(jìn)程正文、數(shù)據(jù)及棧在內(nèi)存區(qū)域的指針。2、U區(qū)(U Area)。用于存放進(jìn)程表項(xiàng)的一些擴(kuò)充信息。每一個(gè)進(jìn)程都有一個(gè)私用的U區(qū),其中含有:
8、進(jìn)程表項(xiàng)指針、真正用戶標(biāo)識(shí)符u-ruid(read user ID)、有效用戶標(biāo)識(shí)符u-euid(effective user ID)、用戶文件描述符表、計(jì)時(shí)器、內(nèi)部I/O參數(shù)、限制字段、差錯(cuò)字段、返回值、信號(hào)處理數(shù)組。由于UNIX系統(tǒng)采用段頁(yè)式存儲(chǔ)管理,為了把段的起始虛地址變換為段在系統(tǒng)中的物理地址,便于實(shí)現(xiàn)區(qū)的共享,所以還有:3、系統(tǒng)區(qū)表項(xiàng)。以存放各個(gè)段在物理存儲(chǔ)器中的位置等信息。系統(tǒng)把一個(gè)進(jìn)程的虛地址空間劃分為若干個(gè)連續(xù)的邏輯區(qū),有正文區(qū)、數(shù)據(jù)區(qū)、棧區(qū)等。這些區(qū)是可被共享和保護(hù)的獨(dú)立實(shí)體,多個(gè)進(jìn)程可共享一個(gè)區(qū)。為了對(duì)區(qū)進(jìn)行管理,核心中設(shè)置一個(gè)系統(tǒng)區(qū)表,各表項(xiàng)中記錄了以下有關(guān)描述活動(dòng)區(qū)的信
9、息:區(qū)的類(lèi)型和大小、區(qū)的狀態(tài)、區(qū)在物理存儲(chǔ)器中的位置、引用計(jì)數(shù)、指向文件索引結(jié)點(diǎn)的指針。4、進(jìn)程區(qū)表系統(tǒng)為每個(gè)進(jìn)程配置了一張進(jìn)程區(qū)表。表中,每一項(xiàng)記錄一個(gè)區(qū)的起始虛地址及指向系統(tǒng)區(qū)表中對(duì)應(yīng)的區(qū)表項(xiàng)。核心通過(guò)查找進(jìn)程區(qū)表和系統(tǒng)區(qū)表,便可將區(qū)的邏輯地址變換為物理地址。二、進(jìn)程映像UNIX系統(tǒng)中,進(jìn)程是進(jìn)程映像的執(zhí)行過(guò)程,也就是正在執(zhí)行的進(jìn)程實(shí)體。它由三部分組成:1、用戶級(jí)上、下文。主要成分是用戶程序;2、寄存器上、下文。由CPU中的一些寄存器的內(nèi)容組成,如PC,PSW,SP及通用寄存器等;3、系統(tǒng)級(jí)上、下文。包括OS為管理進(jìn)程所用的信息,有靜態(tài)和動(dòng)態(tài)之分。三、所涉及的系統(tǒng)調(diào)用1、fork( ) 創(chuàng)
10、建一個(gè)新進(jìn)程。 系統(tǒng)調(diào)用格式: pid=fork( )參數(shù)定義:int fork( )fork( )返回值意義如下:0:在子進(jìn)程中,pid變量保存的fork( )返回值為0,表示當(dāng)前進(jìn)程是子進(jìn)程。>0:在父進(jìn)程中,pid變量保存的fork( )返回值為子進(jìn)程的id值(進(jìn)程唯一標(biāo)識(shí)符)。-1:創(chuàng)建失敗。如果fork( )調(diào)用成功,它向父進(jìn)程返回子進(jìn)程的PID,并向子進(jìn)程返回0,即fork( )被調(diào)用了一次,但返回了兩次。此時(shí)OS在內(nèi)存中建立一個(gè)新進(jìn)程,所建的新進(jìn)程是調(diào)用fork( )父進(jìn)程(parent process)的副本,稱(chēng)為子進(jìn)程(child process)。子進(jìn)程繼承了父進(jìn)程的
11、許多特性,并具有與父進(jìn)程完全相同的用戶級(jí)上下文。父進(jìn)程與子進(jìn)程并發(fā)執(zhí)行。核心為fork( )完成以下操作:(1)為新進(jìn)程分配一進(jìn)程表項(xiàng)和進(jìn)程標(biāo)識(shí)符進(jìn)入fork( )后,核心檢查系統(tǒng)是否有足夠的資源來(lái)建立一個(gè)新進(jìn)程。若資源不足,則fork( )系統(tǒng)調(diào)用失??;否則,核心為新進(jìn)程分配一進(jìn)程表項(xiàng)和唯一的進(jìn)程標(biāo)識(shí)符。(2)檢查同時(shí)運(yùn)行的進(jìn)程數(shù)目超過(guò)預(yù)先規(guī)定的最大數(shù)目時(shí),fork( )系統(tǒng)調(diào)用失敗。(3)拷貝進(jìn)程表項(xiàng)中的數(shù)據(jù)將父進(jìn)程的當(dāng)前目錄和所有已打開(kāi)的數(shù)據(jù)拷貝到子進(jìn)程表項(xiàng)中,并置進(jìn)程的狀態(tài)為“創(chuàng)建”狀態(tài)。(4)子進(jìn)程繼承父進(jìn)程的所有文件對(duì)父進(jìn)程當(dāng)前目錄和所有已打開(kāi)的文件表項(xiàng)中的引用計(jì)數(shù)加1。(5)為子
12、進(jìn)程創(chuàng)建進(jìn)程上、下文進(jìn)程創(chuàng)建結(jié)束,設(shè)子進(jìn)程狀態(tài)為“內(nèi)存中就緒”并返回子進(jìn)程的標(biāo)識(shí)符。(6)子進(jìn)程執(zhí)行雖然父進(jìn)程與子進(jìn)程程序完全相同,但每個(gè)進(jìn)程都有自己的程序計(jì)數(shù)器PC(注意子進(jìn)程的PC開(kāi)始位置),然后根據(jù)pid變量保存的fork( )返回值的不同,執(zhí)行了不同的分支語(yǔ)句。例:.pid=fork( );if (! pid) printf("I'm the child process!n");else if (pid>0) printf("I'm the parent process! n"); else printf("For
13、k fail!n");PC fork( )調(diào)用前PC fork( )調(diào)用后PC.pid=fork( );if (! pid) printf("I'm the child process!n");else if (pid>0) printf("I'm the parent process!n "); else printf("Fork fail!n");.pid=fork( );if (! pid) printf("I'm the child process!n");else
14、if (pid>0) printf("I'm the parent process!n "); else printf("Fork fail!n");四、參考程序1、#include <stdio.h>main( )int p1,p2;while(p1=fork( )= = -1); /*創(chuàng)建子進(jìn)程p1*/if (p1= =0) putchar('b'); else while(p2=fork( )= = -1); /*創(chuàng)建子進(jìn)程p2*/if(p2= =0) putchar('c'); else
15、putchar('a'); 2、#include <stdio.h>main( )int p1,p2,i;while(p1=fork( )= = -1); /*創(chuàng)建子進(jìn)程p1*/if (p1= =0) for(i=0;i<10;i+)printf("daughter %dn",i);else while(p2=fork( )= = -1); /*創(chuàng)建子進(jìn)程p2*/if(p2= =0) for(i=0;i<10;i+) printf("son %dn",i);else for(i=0;i<10;i+) prin
16、tf("parent %dn",i);五、運(yùn)行結(jié)果1、bca,bac, abc ,都有可能。2、parentsondaughter.daughter.或 parentsonparentdaughter等七、思考題(1)系統(tǒng)是怎樣創(chuàng)建進(jìn)程的?(2)當(dāng)首次調(diào)用新創(chuàng)建進(jìn)程時(shí),其入口在哪里?八、實(shí)驗(yàn)報(bào)告要求在指導(dǎo)書(shū)中明確學(xué)生實(shí)驗(yàn)報(bào)告的內(nèi)容及具體要求,主要包括實(shí)驗(yàn)預(yù)習(xí)、實(shí)驗(yàn)記錄和實(shí)驗(yàn)報(bào)告三部分,基本內(nèi)容詳見(jiàn)附件6。九、其它說(shuō)明除strace 外,也可用ltrace -f -i -S ./executable-file-name查看以上程序執(zhí)行過(guò)程。1、從進(jìn)程并發(fā)執(zhí)行來(lái)看,各種情況都有
17、可能。上面的三個(gè)進(jìn)程沒(méi)有同步措施,所以父進(jìn)程與子進(jìn)程的輸出內(nèi)容會(huì)疊加在一起。輸出次序帶有隨機(jī)性。2、由于函數(shù)printf( )在輸出字符串時(shí)不會(huì)被中斷,因此,字符串內(nèi)部字符順序輸出不變。但由于進(jìn)程并發(fā)執(zhí)行的調(diào)度順序和父子進(jìn)程搶占處理機(jī)問(wèn)題,輸出字符串的順序和先后隨著執(zhí)行的不同而發(fā)生變化。這與打印單字符的結(jié)果相同。補(bǔ)充:進(jìn)程樹(shù)在UNIX系統(tǒng)中,只有0進(jìn)程是在系統(tǒng)引導(dǎo)時(shí)被創(chuàng)建的,在系統(tǒng)初啟時(shí)由0進(jìn)程創(chuàng)建1進(jìn)程,以后0進(jìn)程變成對(duì)換進(jìn)程,1進(jìn)程成為系統(tǒng)中的始祖進(jìn)程。UNIX利用fork( )為每個(gè)終端創(chuàng)建一個(gè)子進(jìn)程為用戶服務(wù),如等待用戶登錄、執(zhí)行SHELL命令解釋程序等,每個(gè)終端進(jìn)程又可利用fork(
18、 )來(lái)創(chuàng)建其子進(jìn)程,從而形成一棵進(jìn)程樹(shù)??梢哉f(shuō),系統(tǒng)中除0進(jìn)程外的所有進(jìn)程都是用fork( )創(chuàng)建的。實(shí)驗(yàn)三 進(jìn)程的控制實(shí)驗(yàn)學(xué)時(shí):2實(shí)驗(yàn)類(lèi)型:(驗(yàn)證)實(shí)驗(yàn)要求:(必做)一、實(shí)驗(yàn)?zāi)康?、掌握進(jìn)程另外的創(chuàng)建方法2、熟悉進(jìn)程的睡眠、同步、撤消等進(jìn)程控制方法二、實(shí)驗(yàn)內(nèi)容1、用fork( )創(chuàng)建一個(gè)進(jìn)程,再調(diào)用exec( )用新的程序替換該子進(jìn)程的內(nèi)容2、利用wait( )來(lái)控制進(jìn)程執(zhí)行順序三、實(shí)驗(yàn)原理、方法和手段實(shí)驗(yàn)手段:編程驗(yàn)證原理;四、實(shí)驗(yàn)組織運(yùn)行要求課堂集中授課參考程序和學(xué)生編程實(shí)現(xiàn)、并回答相關(guān)疑問(wèn);五、實(shí)驗(yàn)條件 PC機(jī)或工作站一臺(tái);RedHat9.0操作系統(tǒng);六、實(shí)驗(yàn)步驟一、所涉及的系統(tǒng)調(diào)用在
19、UNIX/LINUX中fork( )是一個(gè)非常有用的系統(tǒng)調(diào)用,但在UNIX/LINUX中建立進(jìn)程除了fork( )之外,也可用與fork( ) 配合使用的exec( )。1、exec( )系列系統(tǒng)調(diào)用exec( )系列,也可用于新程序的運(yùn)行。fork( )只是將父進(jìn)程的用戶級(jí)上下文拷貝到新進(jìn)程中,而exec( )系列可以將一個(gè)可執(zhí)行的二進(jìn)制文件覆蓋在新進(jìn)程的用戶級(jí)上下文的存儲(chǔ)空間上,以更改新進(jìn)程的用戶級(jí)上下文。exec( )系列中的系統(tǒng)調(diào)用都完成相同的功能,它們把一個(gè)新程序裝入內(nèi)存,來(lái)改變調(diào)用進(jìn)程的執(zhí)行代碼,從而形成新進(jìn)程。如果exec( )調(diào)用成功,調(diào)用進(jìn)程將被覆蓋,然后從新程序的入口開(kāi)始執(zhí)
20、行,這樣就產(chǎn)生了一個(gè)新進(jìn)程,新進(jìn)程的進(jìn)程標(biāo)識(shí)符id 與調(diào)用進(jìn)程相同。exec( )沒(méi)有建立一個(gè)與調(diào)用進(jìn)程并發(fā)的子進(jìn)程,而是用新進(jìn)程取代了原來(lái)進(jìn)程。所以exec( )調(diào)用成功后,沒(méi)有任何數(shù)據(jù)返回,這與fork( )不同。exec( )系列系統(tǒng)調(diào)用在UNIX系統(tǒng)庫(kù)unistd.h中,共有execl、execlp、execle、execv、execvp五個(gè),其基本功能相同,只是以不同的方式來(lái)給出參數(shù)。一種是直接給出參數(shù)的指針,如:int execl(path,arg0,arg1,.argn,0);char *path,*arg0,*arg1,.,*argn;另一種是給出指向參數(shù)表的指針,如:int
21、execv(path,argv);char *path,*argv ;具體使用可參考有關(guān)書(shū)。2、exec( )和fork( )聯(lián)合使用系統(tǒng)調(diào)用exec和fork( )聯(lián)合使用能為程序開(kāi)發(fā)提供有力支持。用fork( )建立子進(jìn)程,然后在子進(jìn)程中使用exec( ),這樣就實(shí)現(xiàn)了父進(jìn)程與一個(gè)與它完全不同子進(jìn)程的并發(fā)執(zhí)行。一般,wait、exec聯(lián)合使用的模型為:int status; .if (fork( )= =0) .; execl(.); .; wait(&status);3、wait( )等待子進(jìn)程運(yùn)行結(jié)束。如果子進(jìn)程沒(méi)有完成,父進(jìn)程一直等待。wait( )將調(diào)用進(jìn)程掛起,直至其子進(jìn)
22、程因暫停或終止而發(fā)來(lái)軟中斷信號(hào)為止。如果在wait( )前已有子進(jìn)程暫?;蚪K止,則調(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)了各種各樣的問(wèn)題;高8位則帶回了exit( )的返回值。exit( )返回值由系統(tǒng)給出。核心對(duì)wait( )作以下處理:(1)首先查找調(diào)用進(jìn)程是否有子進(jìn)程,若無(wú),則返回出錯(cuò)碼;(2)若找到一處于“僵死狀態(tài)”的子進(jìn)程,則將子進(jìn)程的執(zhí)行時(shí)間加到父進(jìn)程的執(zhí)行時(shí)間上,并釋放子進(jìn)程的進(jìn)程表項(xiàng);(3)若未找到處于“僵死狀態(tài)”的子進(jìn)
23、程,則調(diào)用進(jìn)程便在可被中斷的優(yōu)先級(jí)上睡眠,等待其子進(jìn)程發(fā)來(lái)軟中斷信號(hào)時(shí)被喚醒。4、exit( )終止進(jìn)程的執(zhí)行。系統(tǒng)調(diào)用格式: void exit(status) int status;其中,status是返回給父進(jìn)程的一個(gè)整數(shù),以備查考。為了及時(shí)回收進(jìn)程所占用的資源并減少父進(jìn)程的干預(yù),UNIX/LINUX利用exit( )來(lái)實(shí)現(xiàn)進(jìn)程的自我終止,通常父進(jìn)程在創(chuàng)建子進(jìn)程時(shí),應(yīng)在進(jìn)程的末尾安排一條exit( ),使子進(jìn)程自我終止。exit(0)表示進(jìn)程正常終止,exit(1)表示進(jìn)程運(yùn)行有錯(cuò),異常終止。如果調(diào)用進(jìn)程在執(zhí)行exit( )時(shí),其父進(jìn)程正在等待它的終止,則父進(jìn)程可立即得到其返回的整數(shù)。核
24、心須為exit( )完成以下操作:(1)關(guān)閉軟中斷(2)回收資源(3)寫(xiě)記帳信息(4)置進(jìn)程為“僵死狀態(tài)” 二、參考程序#include<stdio.h>#include<unistd.h>main( ) int pid; pid=fork( ); /*創(chuàng)建子進(jìn)程*/switch(pid) case -1: /*創(chuàng)建失敗*/ printf("fork fail!n"); exit(1); case 0: /*子進(jìn)程*/ execl("/bin/ls","ls","-1","-col
25、or",NULL); printf("exec fail!n"); exit(1); default: /*父進(jìn)程*/ wait(NULL); /*同步*/ printf("ls completed !n"); exit(0); 三、運(yùn)行結(jié)果執(zhí)行命令ls -l -color ,(按倒序)列出當(dāng)前目錄下所有文件和子目錄;ls completed!七、思考題什么是進(jìn)程同步?wait( )是如何實(shí)現(xiàn)進(jìn)程同步的?八、實(shí)驗(yàn)報(bào)告九、其它說(shuō)明程序在調(diào)用fork( )建立一個(gè)子進(jìn)程后,馬上調(diào)用wait( ),使父進(jìn)程在子進(jìn)程結(jié)束之前,一直處于睡眠狀態(tài)。子進(jìn)程用
26、exec( )裝入命令ls ,exec( )后,子進(jìn)程的代碼被ls的代碼取代,這時(shí)子進(jìn)程的PC指向ls的第1條語(yǔ)句,開(kāi)始執(zhí)行l(wèi)s的命令代碼。注意在這里wait( )給我們提供了一種實(shí)現(xiàn)進(jìn)程同步的簡(jiǎn)單方法。實(shí)驗(yàn)四 進(jìn)程的管道通信實(shí)驗(yàn)學(xué)時(shí):2實(shí)驗(yàn)類(lèi)型:(驗(yàn)證)實(shí)驗(yàn)要求:(必做)一、實(shí)驗(yàn)?zāi)康?、了解什么是管道2、熟悉UNIX/LINUX支持的管道通信方式二、實(shí)驗(yàn)內(nèi)容編寫(xiě)程序?qū)崿F(xiàn)進(jìn)程的管道通信。用系統(tǒng)調(diào)用pipe( )建立一管道,二個(gè)子進(jìn)程P1和P2分別向管道各寫(xiě)一句話: Child 1 is sending a message! Child 2 is sending a message!父進(jìn)程從管道
27、中讀出二個(gè)來(lái)自子進(jìn)程的信息并顯示(要求先接收P1,后P2)。三、實(shí)驗(yàn)原理、方法和手段實(shí)驗(yàn)手段:編程驗(yàn)證原理;四、實(shí)驗(yàn)組織運(yùn)行要求課堂集中授課參考程序和學(xué)生編程實(shí)現(xiàn)、并回答相關(guān)疑問(wèn);五、實(shí)驗(yàn)條件 PC機(jī)或工作站一臺(tái);RedHat9.0操作系統(tǒng);六、實(shí)驗(yàn)步驟一、什么是管道UNIX系統(tǒng)在OS的發(fā)展上,最重要的貢獻(xiàn)之一便是該系統(tǒng)首創(chuàng)了管道(pipe)。這也是UNIX系統(tǒng)的一大特色。所謂管道,是指能夠連接一個(gè)寫(xiě)進(jìn)程和一個(gè)讀進(jìn)程的、并允許它們以生產(chǎn)者消費(fèi)者方式進(jìn)行通信的一個(gè)共享文件,又稱(chēng)為pipe文件。由寫(xiě)進(jìn)程從管道的寫(xiě)入端(句柄1)將數(shù)據(jù)寫(xiě)入管道,而讀進(jìn)程則從管道的讀出端(句柄0)讀出數(shù)據(jù)。句柄fd0句
28、柄fd1 讀出端寫(xiě)入端二、管道的類(lèi)型:1、有名管道一個(gè)可以在文件系統(tǒng)中長(zhǎng)期存在的、具有路徑名的文件。用系統(tǒng)調(diào)用mknod( )建立。它克服無(wú)名管道使用上的局限性,可讓更多的進(jìn)程也能利用管道進(jìn)行通信。因而其它進(jìn)程可以知道它的存在,并能利用路徑名來(lái)訪問(wèn)該文件。對(duì)有名管道的訪問(wèn)方式與訪問(wèn)其他文件一樣,需先用open( )打開(kāi)。2、無(wú)名管道一個(gè)臨時(shí)文件。利用pipe( )建立起來(lái)的無(wú)名文件(無(wú)路徑名)。只用該系統(tǒng)調(diào)用所返回的文件描述符來(lái)標(biāo)識(shí)該文件,故只有調(diào)用pipe( )的進(jìn)程及其子孫進(jìn)程才能識(shí)別此文件描述符,才能利用該文件(管道)進(jìn)行通信。當(dāng)這些進(jìn)程不再使用此管道時(shí),核心收回其索引結(jié)點(diǎn)。二種管道的讀
29、寫(xiě)方式是相同的,本文只講無(wú)名管道。3、pipe文件的建立分配磁盤(pán)和內(nèi)存索引結(jié)點(diǎn)、為讀進(jìn)程分配文件表項(xiàng)、為寫(xiě)進(jìn)程分配文件表項(xiàng)、分配用戶文件描述符4、讀/寫(xiě)進(jìn)程互斥內(nèi)核為地址設(shè)置一個(gè)讀指針和一個(gè)寫(xiě)指針,按先進(jìn)先出順序讀、寫(xiě)。為使讀、寫(xiě)進(jìn)程互斥地訪問(wèn)pipe文件,需使各進(jìn)程互斥地訪問(wèn)pipe文件索引結(jié)點(diǎn)中的直接地址項(xiàng)。因此,每次進(jìn)程在訪問(wèn)pipe文件前,都需檢查該索引文件是否已被上鎖。若是,進(jìn)程便睡眠等待,否則,將其上鎖,進(jìn)行讀/寫(xiě)。操作結(jié)束后解鎖,并喚醒因該索引結(jié)點(diǎn)上鎖而睡眠的進(jìn)程。三、所涉及的系統(tǒng)調(diào)用 1、pipe( )建立一無(wú)名管道。系統(tǒng)調(diào)用格式 pipe(filedes)參數(shù)定義int pi
30、pe(filedes);int filedes2;其中,filedes1是寫(xiě)入端,filedes0是讀出端。該函數(shù)使用頭文件如下:#include <unistd.h>#inlcude <signal.h>#include <stdio.h> 2、read( ) 系統(tǒng)調(diào)用格式 read(fd,buf,nbyte) 功能:從fd所指示的文件中讀出nbyte個(gè)字節(jié)的數(shù)據(jù),并將它們送至由指針buf所指示的緩沖區(qū)中。如該文件被加鎖,等待,直到鎖打開(kāi)為止。 參數(shù)定義 int read(fd,buf,nbyte); int fd; char *buf; unsigned
31、 nbyte; 3、write( )系統(tǒng)調(diào)用格式 read(fd,buf,nbyte)功能:把nbyte 個(gè)字節(jié)的數(shù)據(jù),從buf所指向的緩沖區(qū)寫(xiě)到由fd所指向的文件中。如文件加鎖,暫停寫(xiě)入,直至開(kāi)鎖。參數(shù)定義同read( )。四、參考程序#include <unistd.h>#include <signal.h>#include <stdio.h>int pid1,pid2; main( ) int fd2;char outpipe100,inpipe100;pipe(fd); /*創(chuàng)建一個(gè)管道*/while (pid1=fork( )= =-1);if(p
32、id1= =0) lockf(fd1,1,0); sprintf(outpipe,"child 1 process is sending message!"); /*把串放入數(shù)組outpipe中*/ write(fd1,outpipe,50); /*向管道寫(xiě)長(zhǎng)為50字節(jié)的串*/ sleep(5); /*自我阻塞5秒*/ lockf(fd1,0,0); exit(0); else while(pid2=fork( )= =-1); if(pid2= =0) lockf(fd1,1,0); /*互斥*/ sprintf(outpipe,"child 2 process
33、 is sending message!"); write(fd1,outpipe,50); sleep(5); lockf(fd1,0,0); exit(0); else wait(0); /*同步*/ read(fd0,inpipe,50); /*從管道中讀長(zhǎng)為50字節(jié)的串*/ printf("%sn",inpipe); wait(0); read(fd0,inpipe,50); printf("%sn",inpipe); exit(0); 五、運(yùn)行結(jié)果 延遲5秒后顯示child 1 process is sending message! 再延遲5秒 child 2 process is sending message!七、思考題1、程序中的sleep(5)起
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 礦山場(chǎng)地承包合作協(xié)議
- 大學(xué)論文考試題庫(kù)及答案
- 美術(shù)課件創(chuàng)意畫(huà)小學(xué)生
- 美術(shù)兒童雕塑課件
- 民航安全生產(chǎn)法律法規(guī)的內(nèi)容
- 美術(shù)兒童素描課件
- 食品安全生產(chǎn)許可證在哪個(gè)部門(mén)辦理
- 食堂安全管理方案
- 美國(guó)景點(diǎn)介紹課件
- 2025至2030中國(guó)聚對(duì)苯二甲酸乙二酯樹(shù)脂行業(yè)項(xiàng)目調(diào)研及市場(chǎng)前景預(yù)測(cè)評(píng)估報(bào)告
- 管理學(xué)基礎(chǔ)期末考試試題及答案
- 2025至2030中國(guó)覆銅板行業(yè)項(xiàng)目調(diào)研及市場(chǎng)前景預(yù)測(cè)評(píng)估報(bào)告
- 北京市海淀區(qū)第二十中學(xué)2025屆英語(yǔ)七下期末教學(xué)質(zhì)量檢測(cè)試題含答案
- 全國(guó)二卷2025年高考數(shù)學(xué)真題含解析
- 護(hù)理靜脈留置針課件
- 2025年事業(yè)單位醫(yī)療衛(wèi)生類(lèi)招聘考試《綜合應(yīng)用能力(E類(lèi))醫(yī)學(xué)技術(shù)》試卷真題及詳細(xì)解析
- 護(hù)理急診急救培訓(xùn)課件
- 2025年衛(wèi)生系統(tǒng)招聘考試(公共基礎(chǔ)知識(shí))新版真題卷(附詳細(xì)解析)
- (網(wǎng)絡(luò)收集版)2025年新課標(biāo)全國(guó)一卷數(shù)學(xué)高考真題含答案
- 2025包頭輕工職業(yè)技術(shù)學(xué)院工作人員招聘考試真題
- 超聲科專(zhuān)業(yè)管理制度
評(píng)論
0/150
提交評(píng)論