操作系統(tǒng)試驗三進程的管道通信_第1頁
操作系統(tǒng)試驗三進程的管道通信_第2頁
操作系統(tǒng)試驗三進程的管道通信_第3頁
操作系統(tǒng)試驗三進程的管道通信_第4頁
操作系統(tǒng)試驗三進程的管道通信_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、實驗三 進程的管道通信一、實驗目的:( 1 )加深對進程概念的理解,明確進程和程序的區(qū)別;( 2)學習進程創(chuàng)建的過程,進一步認識并發(fā)執(zhí)行的實質(zhì);( 3)分析進程爭用資源的現(xiàn)象,學習解決進程互斥的方法;( 4)學習解決進程同步的方法;( 5)掌握Linux 系統(tǒng)進程間通過管道通信的具體實現(xiàn)方法。二、實驗內(nèi)容及要求:( 1 )使用系統(tǒng)調(diào)用pipe() 建立一條管道線,兩個子進程分別向管道寫一句話(寫的內(nèi)容自己定,但要有該進程的一些信息);( 2)父進程從管道中讀出來自兩個子進程的消息,顯示在屏幕上;( 3)要求:父進程首先接收子進程p1 發(fā)來的消息,然后再接收子進程 p2 發(fā)來的消息;( 4)兩個

2、子進程要并發(fā)執(zhí)行;( 5)實現(xiàn)管道的互斥使用。當一個子進程正在對管道進行寫操作時,另一個欲寫入管道的子進程必須等待。使用系統(tǒng)調(diào)用lockf(fd1,1,0)實現(xiàn)對管道的加鎖操作,用lockf(fd1,0,0) 解除對管道的鎖定;( 6)實現(xiàn)父子進程的同步,當父進程試圖從一空管道中讀取數(shù)據(jù)時,便進入等待狀態(tài),直到子進程將數(shù)據(jù)寫入管道返回后,才將其喚醒。三、實現(xiàn):相關的系統(tǒng)調(diào)用fork() 用于創(chuàng)一個子進程。格式: int fork();返回值:在子進程中返回0;在父進程中返回所創(chuàng)建的子進程的ID 值;當返回-1 時,創(chuàng)建失敗。wait() 常用來控制父進程與子進程的同步。在父進程中調(diào)用wait(

3、),則父進程被阻塞,進入等待隊列,等待子進程結束。當子進程結束時,父進程從wait()返回繼續(xù)執(zhí)行原來的程序。返回值:大于0 時,為子進程的ID 值;等于 -1 時,調(diào)用失敗。exit() 是進程結束時最常調(diào)用的。格式:void exit( int status); 其中, status 為進程結束狀態(tài)。pipe() 用于創(chuàng)建一個管道格式:pipe(int fd);其中fd是一個由兩個數(shù)組元素fd和fd1組成的整型數(shù)組,fd是管道的讀端口,用于從管道讀出數(shù)據(jù),fd1是管道的寫端口,用于向管道寫入數(shù)據(jù)。返回值: 0 調(diào)用成功;-1 調(diào)用失敗。sleep() 使調(diào)用進程睡眠若干時間,之后喚醒。格式

4、:sleep(int t);其中t為睡眠時間。lockf() 用于對互斥資源加鎖和解鎖。在本實驗中該調(diào)用的格式為:lockf(fd1,1,0) ; /* 表示對管道的寫入端口加鎖。lockf(fd1,0,0) ; /* 表示對管道的寫入端口解鎖。write(fd1,String,Length) 將字符串String 的內(nèi)容寫入管道的寫入read(fd0,String,Length) 從 管 道 的 讀 入 口 讀 出 信 息 放 入 字 符 串String 中。程序流程圖父進程新站化創(chuàng)建智道創(chuàng)捏干進播Pt府指百道消縣圖1父進程流程圖四、運行結果及說明圖2子進程P1流程圖 f os_tst3pi

5、dl=3315pldl=OPid2=3318 -二pid2=0Pid3=3317 二三七The Child process 2 ic sendirig message> 二三The Chi Id process 1 sending 同ess日ge!pid3=O"'The Child process3is sendir9 message IThis isthechild2process's晚wage!This isthechild3pracexs'smessage IThis isthechild1process'snescage!Process

6、returned 0 (0x0) execution time i 3*002 sPress ENTER to continue*Ag os_tst3pidl=2969pidl=OThe Chi Id process 1 is sending message!Pid2=2970Pid2-0Pid3=2971The Chi Id process 2 is sending message I pid3=0The Chi Id process3is sending message IThis isthechild1processesmessage!This isthechild2process

7、9;smessage!This isthechild3process'smessage!Process returned 0 (0x0) execution time : 3*004 sPress ENTER to continue.五、源代碼#include <stdio.h>#include <sys/types.h>#include <stdlib.h>#include <sys/stat.h>#include <fcntl.h>#include <error.h>#include <wait.h>

8、;#include <unistd.h>int main( )int pid1,pid2,pid3;int fd2;char outpipe60,inpipe60;pipe(fd);/ 創(chuàng)建一個管道while (pid1=fork( )=-1);printf("pid1=%dn",pid1);if(pid1=0)printf("The Child process 1 is sending message!n");lockf(fd1,1,0);/ 互斥sprintf(outpipe,"This is the child 1 proce

9、ss's message!n");write(fd1,outpipe,60);sleep(1);/ 自我阻塞1 秒 ,讓出機會執(zhí)行下一個進程,增加并發(fā)lockf(fd1,0,0);exit(0);elsewhile(pid2=fork( )=-1);printf("pid2=%dn",pid2);if(pid2=0)printf("The Child process 2 is sending message!n");lockf(fd1,1,0);sprintf(outpipe,"This is the child 2 proc

10、ess's message!n");write(fd1,outpipe,60);sleep(1);lockf(fd1,0,0);elsewhile(pid3=fork( )=-1);printf("pid3=%dn",pid3);if(pid3=0)printf("The Child process 3 is sending message!n");lockf(fd1,1,0);sprintf(outpipe,"This is the child 3 process's message!n");write(f

11、d1,outpipe,60);sleep(1);lockf(fd1,0,0);exit(0);elsewait(0);/ 同步read(fd0,inpipe,60);printf("n%s",inpipe);wait(0);read(fd0,inpipe,60);printf("%sn",inpipe);wait(0);read(fd0,inpipe,60);printf("%sn",inpipe);exit(0);return 0;六、回答問題( 1 )指出父進程與兩個子進程并發(fā)執(zhí)行的順序,并說明原因。子進程先執(zhí)行,然后父進程才執(zhí)行

12、。這是由進程的同步機制決定的,因為只有子進程向管道中寫入信息后,父進程才能讀??;否則父進程自己調(diào)用wait() 系統(tǒng)調(diào)用將自己阻塞 ,將處理機交由子進程。( 2)若不對管道加以互斥控制,會有什么后果?管道進行互斥控制,是為防止兩個子進程對管道資源進行爭奪而產(chǎn)生信息丟失或覆蓋。如果不加控制,那么可能一個子進程寫入的信息還沒來得及被父進程讀出,另一個子進程又先寫入信息,那么之前的進程寫入的信息將被覆蓋,父進程也就讀不到之前進程傳遞來的信息了。( 3)說明你是如何實現(xiàn)父子進程之間的同步的。1、父進程讀出之前確定管道中有數(shù)據(jù),否則阻塞自己。這一點很容一般到,通過系統(tǒng)調(diào)用wait()函數(shù),即可以實現(xiàn),當子進程結束時父進程才執(zhí)行,那么此時管道中肯定已經(jīng)有子進程寫入的數(shù)據(jù)了。2、子進程在寫入之前要確定管道中的數(shù)據(jù)已經(jīng)被父進程讀出,否則不能寫入或者阻塞自己。3、這可以通過進程

溫馨提示

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

評論

0/150

提交評論