《操作系統(tǒng)》實驗指導(dǎo)書_第1頁
《操作系統(tǒng)》實驗指導(dǎo)書_第2頁
《操作系統(tǒng)》實驗指導(dǎo)書_第3頁
《操作系統(tǒng)》實驗指導(dǎo)書_第4頁
《操作系統(tǒng)》實驗指導(dǎo)書_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

付費下載

下載本文檔

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

文檔簡介

1、計算機科學(xué)與信息學(xué)院操作系統(tǒng)實驗指導(dǎo)書王道書編寫適用專業(yè): 信息安全、網(wǎng)絡(luò)工程貴州大學(xué)二OO九年十一月前言操作系統(tǒng)是一門理論性和時間性都很強的課程。要學(xué)好操作系統(tǒng)的設(shè)計原理,除了聽課、看書、做習(xí)題外,最好的方法就是在實踐中進行,包括使用操作系統(tǒng)、閱讀和分析已有操作系統(tǒng)的源代碼、自己設(shè)計小型系統(tǒng)/模塊或模擬算法等。本教材安排的實驗內(nèi)容按深度可分為五個層次,即:使用級、觀察級、系統(tǒng)管理級、源碼閱讀級和實現(xiàn)級。(1)使用級:是指如何使用操作系統(tǒng),包括對命令(以及菜單和shell)、系統(tǒng)調(diào)用和系統(tǒng)文件的使用。(2)觀察級:是指通過使用級的接口,從外部觀察操作系統(tǒng)的內(nèi)部工作過程和結(jié)構(gòu)。(3)系統(tǒng)管理級:

2、是指系統(tǒng)或設(shè)備的安裝、配置和性能調(diào)整。(4)源碼閱讀級:是指對現(xiàn)有操作系統(tǒng)部分內(nèi)核源代碼的閱讀。(5)實現(xiàn)級:是指編程模擬實現(xiàn)操作系統(tǒng)某些功能模塊。實驗的操作平臺是Red Hat Linux 9.0和Windows 2000 Professional,其中前者是主要的實驗平臺,因為源碼閱讀級等實驗都是在Linux平臺上進行的,當(dāng)然,在Linux上進行的實驗基本上也都可在UNIX平臺上直接進行。根據(jù)專業(yè)特點及自己的需要以及實驗條件等選擇相應(yīng)的實驗內(nèi)容。(目錄 )實驗一 Linux系統(tǒng)用戶接口和編程界面4實驗二 進程的創(chuàng)建6實驗三 進程的控制11實驗四 進程的管道通信15實驗五 進程調(diào)度實驗18實

3、驗報告的基本內(nèi)容及要求20貴州大學(xué)實驗報告21實驗一 Linux系統(tǒng)用戶接口和編程界面實驗學(xué)時:2實驗類型:(驗證)實驗要求:(必做)一、實驗?zāi)康?熟悉使用Linux字符界面、窗口系統(tǒng)的常用命令。2熟悉運用Linux常用的編程工具。3熟悉運用Linux的在線求助系統(tǒng)。4掌握在Linux操作系統(tǒng)環(huán)境上編輯、編譯、調(diào)試、運行一個C語言程序的全過程。二、實驗內(nèi)容1熟悉開機后登錄Linux系統(tǒng)和退出系統(tǒng)的過程;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編輯一個打印“Hello,I am a C program”字串的C語言程序,然后編譯并運行它,記下整個過程。熟悉gcc、gdb等編譯器、調(diào)試器的使用。 三、實驗原理、方法和手段Linux操作系統(tǒng)環(huán)境下完成相關(guān)命令的使用;四、實驗組織運行要求課堂上集中授課,學(xué)生獨立完成實驗。五、實驗條件PC機或工作站一臺;R

5、edHat9.0操作系統(tǒng);六、實驗步驟 按Linux安裝步驟完成;七、思考題Linux的命令與Windows命令有什么不同?八、實驗報告參見實驗報告要求;九、其它說明 課后可以在RedHat9.0虛擬機上并完成相關(guān)實驗。實驗二 進程的創(chuàng)建實驗學(xué)時:2實驗類型:(驗證)實驗要求:(必做)一、實驗?zāi)康?、掌握進程的概念,明確進程的含義2、認識并了解并發(fā)執(zhí)行的實質(zhì)二、實驗內(nèi)容1、編寫一段程序,使用系統(tǒng)調(diào)用fork( )創(chuàng)建兩個子進程。當(dāng)此程序運行時,在系統(tǒng)中有一個父進程和兩個子進程活動。讓每一個進程在屏幕上顯示一個字符:父進程顯示'a',子進程分別顯示字符'b'和字符

6、'c'。試觀察記錄屏幕上的顯示結(jié)果,并分析原因。2、修改上述程序,每一個進程循環(huán)顯示一句話。子進程顯示'daughter '及'son ',父進程顯示 'parent ',觀察結(jié)果,分析原因。三、實驗原理、方法和手段實驗手段:編程驗證原理;四、實驗組織運行要求課堂集中授課參考程序和學(xué)生編程實現(xiàn)、并回答相關(guān)疑問;五、實驗條件(1)閱讀LINUX的fork.c源碼文件,分析進程的創(chuàng)建過程。(2)閱讀LINUX的sched.c源碼文件,加深對進程管理概念的認識。六、實驗步驟一、進程UNIX中,進程既是一個獨立擁有資源的基本單位,又是一個

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

8、進程表項指針、真正用戶標(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ū)的共享,所以還有:3、系統(tǒng)區(qū)表項。以存放各個段在物理存儲器中的位置等信息。系統(tǒng)把一個進程的虛地址空間劃分為若干個連續(xù)的邏輯區(qū),有正文區(qū)、數(shù)據(jù)區(qū)、棧區(qū)等。這些區(qū)是可被共享和保護的獨立實體,多個進程可共享一個區(qū)。為了對區(qū)進行管理,核心中設(shè)置一個系統(tǒng)區(qū)表,各表項中記錄了以下有關(guān)描述活動區(qū)的信

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

10、建一個新進程。 系統(tǒng)調(diào)用格式: pid=fork( )參數(shù)定義:int fork( )fork( )返回值意義如下:0:在子進程中,pid變量保存的fork( )返回值為0,表示當(dāng)前進程是子進程。>0:在父進程中,pid變量保存的fork( )返回值為子進程的id值(進程唯一標(biāo)識符)。-1:創(chuàng)建失敗。如果fork( )調(diào)用成功,它向父進程返回子進程的PID,并向子進程返回0,即fork( )被調(diào)用了一次,但返回了兩次。此時OS在內(nèi)存中建立一個新進程,所建的新進程是調(diào)用fork( )父進程(parent process)的副本,稱為子進程(child process)。子進程繼承了父進程的

11、許多特性,并具有與父進程完全相同的用戶級上下文。父進程與子進程并發(fā)執(zhí)行。核心為fork( )完成以下操作:(1)為新進程分配一進程表項和進程標(biāo)識符進入fork( )后,核心檢查系統(tǒng)是否有足夠的資源來建立一個新進程。若資源不足,則fork( )系統(tǒng)調(diào)用失??;否則,核心為新進程分配一進程表項和唯一的進程標(biāo)識符。(2)檢查同時運行的進程數(shù)目超過預(yù)先規(guī)定的最大數(shù)目時,fork( )系統(tǒng)調(diào)用失敗。(3)拷貝進程表項中的數(shù)據(jù)將父進程的當(dāng)前目錄和所有已打開的數(shù)據(jù)拷貝到子進程表項中,并置進程的狀態(tài)為“創(chuàng)建”狀態(tài)。(4)子進程繼承父進程的所有文件對父進程當(dāng)前目錄和所有已打開的文件表項中的引用計數(shù)加1。(5)為子

12、進程創(chuàng)建進程上、下文進程創(chuàng)建結(jié)束,設(shè)子進程狀態(tài)為“內(nèi)存中就緒”并返回子進程的標(biāo)識符。(6)子進程執(zhí)行雖然父進程與子進程程序完全相同,但每個進程都有自己的程序計數(shù)器PC(注意子進程的PC開始位置),然后根據(jù)pid變量保存的fork( )返回值的不同,執(zhí)行了不同的分支語句。例:.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)建子進程p1*/if (p1= =0) putchar('b'); else while(p2=fork( )= = -1); /*創(chuàng)建子進程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)建子進程p1*/if (p1= =0) for(i=0;i<10;i+)printf("daughter %dn",i);else while(p2=fork( )= = -1); /*創(chuàng)建子進程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);五、運行結(jié)果1、bca,bac, abc ,都有可能。2、parentsondaughter.daughter.或 parentsonparentdaughter等七、思考題(1)系統(tǒng)是怎樣創(chuàng)建進程的?(2)當(dāng)首次調(diào)用新創(chuàng)建進程時,其入口在哪里?八、實驗報告要求在指導(dǎo)書中明確學(xué)生實驗報告的內(nèi)容及具體要求,主要包括實驗預(yù)習(xí)、實驗記錄和實驗報告三部分,基本內(nèi)容詳見附件6。九、其它說明除strace 外,也可用ltrace -f -i -S ./executable-file-name查看以上程序執(zhí)行過程。1、從進程并發(fā)執(zhí)行來看,各種情況都有

17、可能。上面的三個進程沒有同步措施,所以父進程與子進程的輸出內(nèi)容會疊加在一起。輸出次序帶有隨機性。2、由于函數(shù)printf( )在輸出字符串時不會被中斷,因此,字符串內(nèi)部字符順序輸出不變。但由于進程并發(fā)執(zhí)行的調(diào)度順序和父子進程搶占處理機問題,輸出字符串的順序和先后隨著執(zhí)行的不同而發(fā)生變化。這與打印單字符的結(jié)果相同。補充:進程樹在UNIX系統(tǒng)中,只有0進程是在系統(tǒng)引導(dǎo)時被創(chuàng)建的,在系統(tǒng)初啟時由0進程創(chuàng)建1進程,以后0進程變成對換進程,1進程成為系統(tǒng)中的始祖進程。UNIX利用fork( )為每個終端創(chuàng)建一個子進程為用戶服務(wù),如等待用戶登錄、執(zhí)行SHELL命令解釋程序等,每個終端進程又可利用fork(

18、 )來創(chuàng)建其子進程,從而形成一棵進程樹??梢哉f,系統(tǒng)中除0進程外的所有進程都是用fork( )創(chuàng)建的。實驗三 進程的控制實驗學(xué)時:2實驗類型:(驗證)實驗要求:(必做)一、實驗?zāi)康?、掌握進程另外的創(chuàng)建方法2、熟悉進程的睡眠、同步、撤消等進程控制方法二、實驗內(nèi)容1、用fork( )創(chuàng)建一個進程,再調(diào)用exec( )用新的程序替換該子進程的內(nèi)容2、利用wait( )來控制進程執(zhí)行順序三、實驗原理、方法和手段實驗手段:編程驗證原理;四、實驗組織運行要求課堂集中授課參考程序和學(xué)生編程實現(xiàn)、并回答相關(guān)疑問;五、實驗條件 PC機或工作站一臺;RedHat9.0操作系統(tǒng);六、實驗步驟一、所涉及的系統(tǒng)調(diào)用在

19、UNIX/LINUX中fork( )是一個非常有用的系統(tǒng)調(diào)用,但在UNIX/LINUX中建立進程除了fork( )之外,也可用與fork( ) 配合使用的exec( )。1、exec( )系列系統(tǒng)調(diào)用exec( )系列,也可用于新程序的運行。fork( )只是將父進程的用戶級上下文拷貝到新進程中,而exec( )系列可以將一個可執(zhí)行的二進制文件覆蓋在新進程的用戶級上下文的存儲空間上,以更改新進程的用戶級上下文。exec( )系列中的系統(tǒng)調(diào)用都完成相同的功能,它們把一個新程序裝入內(nèi)存,來改變調(diào)用進程的執(zhí)行代碼,從而形成新進程。如果exec( )調(diào)用成功,調(diào)用進程將被覆蓋,然后從新程序的入口開始執(zhí)

20、行,這樣就產(chǎn)生了一個新進程,新進程的進程標(biāo)識符id 與調(diào)用進程相同。exec( )沒有建立一個與調(diào)用進程并發(fā)的子進程,而是用新進程取代了原來進程。所以exec( )調(diào)用成功后,沒有任何數(shù)據(jù)返回,這與fork( )不同。exec( )系列系統(tǒng)調(diào)用在UNIX系統(tǒng)庫unistd.h中,共有execl、execlp、execle、execv、execvp五個,其基本功能相同,只是以不同的方式來給出參數(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)書。2、exec( )和fork( )聯(lián)合使用系統(tǒng)調(diào)用exec和fork( )聯(lián)合使用能為程序開發(fā)提供有力支持。用fork( )建立子進程,然后在子進程中使用exec( ),這樣就實現(xiàn)了父進程與一個與它完全不同子進程的并發(fā)執(zhí)行。一般,wait、exec聯(lián)合使用的模型為:int status; .if (fork( )= =0) .; execl(.); .; wait(&status);3、wait( )等待子進程運行結(jié)束。如果子進程沒有完成,父進程一直等待。wait( )將調(diào)用進程掛起,直至其子進

22、程因暫?;蚪K止而發(fā)來軟中斷信號為止。如果在wait( )前已有子進程暫停或終止,則調(diào)用進程做適當(dāng)處理后便返回。系統(tǒng)調(diào)用格式:int wait(status)int *status;其中,status是用戶空間的地址。它的低8位反應(yīng)子進程狀態(tài),為0表示子進程正常結(jié)束,非0則表示出現(xiàn)了各種各樣的問題;高8位則帶回了exit( )的返回值。exit( )返回值由系統(tǒng)給出。核心對wait( )作以下處理:(1)首先查找調(diào)用進程是否有子進程,若無,則返回出錯碼;(2)若找到一處于“僵死狀態(tài)”的子進程,則將子進程的執(zhí)行時間加到父進程的執(zhí)行時間上,并釋放子進程的進程表項;(3)若未找到處于“僵死狀態(tài)”的子進

23、程,則調(diào)用進程便在可被中斷的優(yōu)先級上睡眠,等待其子進程發(fā)來軟中斷信號時被喚醒。4、exit( )終止進程的執(zhí)行。系統(tǒng)調(diào)用格式: void exit(status) int status;其中,status是返回給父進程的一個整數(shù),以備查考。為了及時回收進程所占用的資源并減少父進程的干預(yù),UNIX/LINUX利用exit( )來實現(xiàn)進程的自我終止,通常父進程在創(chuàng)建子進程時,應(yīng)在進程的末尾安排一條exit( ),使子進程自我終止。exit(0)表示進程正常終止,exit(1)表示進程運行有錯,異常終止。如果調(diào)用進程在執(zhí)行exit( )時,其父進程正在等待它的終止,則父進程可立即得到其返回的整數(shù)。核

24、心須為exit( )完成以下操作:(1)關(guān)閉軟中斷(2)回收資源(3)寫記帳信息(4)置進程為“僵死狀態(tài)” 二、參考程序#include<stdio.h>#include<unistd.h>main( ) int pid; pid=fork( ); /*創(chuàng)建子進程*/switch(pid) case -1: /*創(chuàng)建失敗*/ printf("fork fail!n"); exit(1); case 0: /*子進程*/ execl("/bin/ls","ls","-1","-col

25、or",NULL); printf("exec fail!n"); exit(1); default: /*父進程*/ wait(NULL); /*同步*/ printf("ls completed !n"); exit(0); 三、運行結(jié)果執(zhí)行命令ls -l -color ,(按倒序)列出當(dāng)前目錄下所有文件和子目錄;ls completed!七、思考題什么是進程同步?wait( )是如何實現(xiàn)進程同步的?八、實驗報告九、其它說明程序在調(diào)用fork( )建立一個子進程后,馬上調(diào)用wait( ),使父進程在子進程結(jié)束之前,一直處于睡眠狀態(tài)。子進程用

26、exec( )裝入命令ls ,exec( )后,子進程的代碼被ls的代碼取代,這時子進程的PC指向ls的第1條語句,開始執(zhí)行l(wèi)s的命令代碼。注意在這里wait( )給我們提供了一種實現(xiàn)進程同步的簡單方法。實驗四 進程的管道通信實驗學(xué)時:2實驗類型:(驗證)實驗要求:(必做)一、實驗?zāi)康?、了解什么是管道2、熟悉UNIX/LINUX支持的管道通信方式二、實驗內(nèi)容編寫程序?qū)崿F(xiàn)進程的管道通信。用系統(tǒng)調(diào)用pipe( )建立一管道,二個子進程P1和P2分別向管道各寫一句話: Child 1 is sending a message! Child 2 is sending a message!父進程從管道

27、中讀出二個來自子進程的信息并顯示(要求先接收P1,后P2)。三、實驗原理、方法和手段實驗手段:編程驗證原理;四、實驗組織運行要求課堂集中授課參考程序和學(xué)生編程實現(xiàn)、并回答相關(guān)疑問;五、實驗條件 PC機或工作站一臺;RedHat9.0操作系統(tǒng);六、實驗步驟一、什么是管道UNIX系統(tǒng)在OS的發(fā)展上,最重要的貢獻之一便是該系統(tǒng)首創(chuàng)了管道(pipe)。這也是UNIX系統(tǒng)的一大特色。所謂管道,是指能夠連接一個寫進程和一個讀進程的、并允許它們以生產(chǎn)者消費者方式進行通信的一個共享文件,又稱為pipe文件。由寫進程從管道的寫入端(句柄1)將數(shù)據(jù)寫入管道,而讀進程則從管道的讀出端(句柄0)讀出數(shù)據(jù)。句柄fd0句

28、柄fd1 讀出端寫入端二、管道的類型:1、有名管道一個可以在文件系統(tǒng)中長期存在的、具有路徑名的文件。用系統(tǒng)調(diào)用mknod( )建立。它克服無名管道使用上的局限性,可讓更多的進程也能利用管道進行通信。因而其它進程可以知道它的存在,并能利用路徑名來訪問該文件。對有名管道的訪問方式與訪問其他文件一樣,需先用open( )打開。2、無名管道一個臨時文件。利用pipe( )建立起來的無名文件(無路徑名)。只用該系統(tǒng)調(diào)用所返回的文件描述符來標(biāo)識該文件,故只有調(diào)用pipe( )的進程及其子孫進程才能識別此文件描述符,才能利用該文件(管道)進行通信。當(dāng)這些進程不再使用此管道時,核心收回其索引結(jié)點。二種管道的讀

29、寫方式是相同的,本文只講無名管道。3、pipe文件的建立分配磁盤和內(nèi)存索引結(jié)點、為讀進程分配文件表項、為寫進程分配文件表項、分配用戶文件描述符4、讀/寫進程互斥內(nèi)核為地址設(shè)置一個讀指針和一個寫指針,按先進先出順序讀、寫。為使讀、寫進程互斥地訪問pipe文件,需使各進程互斥地訪問pipe文件索引結(jié)點中的直接地址項。因此,每次進程在訪問pipe文件前,都需檢查該索引文件是否已被上鎖。若是,進程便睡眠等待,否則,將其上鎖,進行讀/寫。操作結(jié)束后解鎖,并喚醒因該索引結(jié)點上鎖而睡眠的進程。三、所涉及的系統(tǒng)調(diào)用 1、pipe( )建立一無名管道。系統(tǒng)調(diào)用格式 pipe(filedes)參數(shù)定義int pi

30、pe(filedes);int filedes2;其中,filedes1是寫入端,filedes0是讀出端。該函數(shù)使用頭文件如下:#include <unistd.h>#inlcude <signal.h>#include <stdio.h> 2、read( ) 系統(tǒng)調(diào)用格式 read(fd,buf,nbyte) 功能:從fd所指示的文件中讀出nbyte個字節(jié)的數(shù)據(jù),并將它們送至由指針buf所指示的緩沖區(qū)中。如該文件被加鎖,等待,直到鎖打開為止。 參數(shù)定義 int read(fd,buf,nbyte); int fd; char *buf; unsigned

31、 nbyte; 3、write( )系統(tǒng)調(diào)用格式 read(fd,buf,nbyte)功能:把nbyte 個字節(jié)的數(shù)據(jù),從buf所指向的緩沖區(qū)寫到由fd所指向的文件中。如文件加鎖,暫停寫入,直至開鎖。參數(shù)定義同read( )。四、參考程序#include <unistd.h>#include <signal.h>#include <stdio.h>int pid1,pid2; main( ) int fd2;char outpipe100,inpipe100;pipe(fd); /*創(chuàng)建一個管道*/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); /*向管道寫長為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); /*從管道中讀長為50字節(jié)的串*/ printf("%sn",inpipe); wait(0); read(fd0,inpipe,50); printf("%sn",inpipe); exit(0); 五、運行結(jié)果 延遲5秒后顯示child 1 process is sending message! 再延遲5秒 child 2 process is sending message!七、思考題1、程序中的sleep(5)起

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論