操作系統(tǒng)試驗(yàn)_試驗(yàn)1分析解析_第1頁
操作系統(tǒng)試驗(yàn)_試驗(yàn)1分析解析_第2頁
操作系統(tǒng)試驗(yàn)_試驗(yàn)1分析解析_第3頁
操作系統(tǒng)試驗(yàn)_試驗(yàn)1分析解析_第4頁
操作系統(tǒng)試驗(yàn)_試驗(yàn)1分析解析_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、廣州大學(xué)學(xué)生實(shí)驗(yàn)報(bào)告開課學(xué)院及實(shí)驗(yàn)室:計(jì)算機(jī)科學(xué)與工程實(shí)驗(yàn)室2015年11月11日實(shí)驗(yàn)課程名稱操作系統(tǒng)成績實(shí)驗(yàn)項(xiàng)目名稱進(jìn)程管理與進(jìn)程通信指導(dǎo)老師陳康民(*報(bào)告只能為文字和圖片,老師評(píng)語將添加到此處,學(xué)生請(qǐng)勿作答*)進(jìn)程管理(一)進(jìn)程的創(chuàng)建實(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、編寫一段程序,使用系統(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'和字符'c'。試觀察記錄屏幕上的顯示結(jié)果,并分析原因。2

2、、修改上述程序,每一個(gè)進(jìn)程循環(huán)顯示一句話。子進(jìn)程顯示'daughter/及'son。父進(jìn)程顯示parent。觀察結(jié)果,分析原因。三、實(shí)驗(yàn)步驟1、編寫一段程序,使用系統(tǒng)調(diào)用fork()創(chuàng)建兩個(gè)子進(jìn)程。代碼:#include<stdio.h>main()(intp1,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');elseputchar('a');)

3、運(yùn)行結(jié)果:課懺(操作樂3t)$Jtbcxxxxxx-empty:/Downloads/linuxbcxxxxxx-emptv:/Do*nloads/linuK實(shí)裝課件(操作系統(tǒng))$bcxxxxxx-enptv:/Downloads/linuK實(shí)讀件(隹作系統(tǒng))$bcxx)c)otx-empty/Download”linu)(實(shí)脂謨件(康作系統(tǒng))$bcxxxxxx-iipty:/。6«01口3(13/11.1111又實(shí)驗(yàn)課件(盤作系統(tǒng))$btxxxxxx-Binptr/DownI口ads/linux賣裝謂柞(痙作系統(tǒng))$cbxxxxxx-enpty:-/Downloads/1inuxC

4、961X1(榛作系統(tǒng))$bcxxxxxx-empty/D8mlQads/linu)(實(shí)驗(yàn)jj侔(稼作系統(tǒng))$bcxxxKxx-enpty:/DownlDad5/linux實(shí)溫課件(揍作系統(tǒng))$1)0熄其k-£1叩七¥:一/080103(1£/1:111“實(shí)夏正侔(隹作系垃)$bexxxxxx-erapty:*/Downloads/linux實(shí)暨讀侔(住作家拉)$bcxxxxxx-empty/)Q*nloacls/linux實(shí)溫評(píng)竹(接作家統(tǒng))$bex3cxicxx-eiipty:-/Downloads/linux實(shí)萋課件(接作系St)$bca,bac,abc,都有

5、可能。2、修改上述程序,每一個(gè)進(jìn)程循環(huán)顯示一句話。子進(jìn)程顯示'daughter/及'son父進(jìn)程顯示parent。觀察結(jié)果,分析原因。代碼:#include<stdio.h>main()(intp1,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",

6、i);elsefor(i=0;i<10;i+)printf("parent%dn",i);)結(jié)果::xxexxx-empty:/Downloads/linux實(shí)蛉課件(操作系統(tǒng))$./tparent0parent1parent2parent3parent4parent5laughter0parent6parent7parent8電rent9laughter1>on0laughter2laughter3laughter4laughter5ton1laughter6ton2laughter7>on3laughter8;on4laughter9;on5ton6t

7、on7ton8;on9MX®KX)(-e(npty:,oads/1inux實(shí)愴課件(操作系學(xué)充)$./t心rent0iarent1larent2tarent3farent4iarent5iarent6iarent1iarent8iarent9laughter0laughter1laughter2laughter3laughter4laughter5laughter6laughter7laughter8laughter9;on0;on1;on2;on3;on4ion5ion60n1on3on9parentsondaughter.daughter.或parentsonparentdaug

8、hter等四、分析原因除strace外,也可用Itrace-f-i-S./executable-file-name查看以上程序執(zhí)行過程。1、從進(jìn)程并發(fā)執(zhí)行來看,各種情況都有可能。上面的三個(gè)進(jìn)程沒有同步措施,所以父進(jìn)程與子進(jìn)程的輸出內(nèi)容會(huì)疊加在一起。輸出次序帶有隨機(jī)性。2、由于函數(shù)printf()在輸出字符串時(shí)不會(huì)被中斷,因此,字符串內(nèi)部字符順序輸出不變。但由于進(jìn)程并發(fā)執(zhí)行的調(diào)度順序和父子進(jìn)程搶占處理機(jī)問題,輸出字符串的順序和先后隨著執(zhí)行的不同而發(fā)生變化。這與打印單字符的結(jié)果相同。五、思考題(1)系統(tǒng)是怎樣創(chuàng)建進(jìn)程的?linux系統(tǒng)創(chuàng)建進(jìn)程都是用fork()系統(tǒng)調(diào)用創(chuàng)建子進(jìn)程。Init程序以/e

9、tc/inittab為腳本文件來創(chuàng)建系統(tǒng)的新進(jìn)程的。新進(jìn)程還克以創(chuàng)建新進(jìn)程。創(chuàng)建新進(jìn)程是通過克隆老進(jìn)程或當(dāng)前進(jìn)程來創(chuàng)建的。新進(jìn)程的創(chuàng)建實(shí)用系統(tǒng)調(diào)用sys_fork()或sys_clone(),并且在內(nèi)核模式下完成。在系統(tǒng)調(diào)用結(jié)束時(shí),系統(tǒng)從物理內(nèi)存中分配一個(gè)心的task_struct()數(shù)據(jù)結(jié)構(gòu)和進(jìn)程堆棧,同時(shí)獲得一個(gè)唯一的標(biāo)示此進(jìn)程的標(biāo)識(shí)符。通過FORK函數(shù)調(diào)用促使內(nèi)核創(chuàng)建一個(gè)新的進(jìn)程,該進(jìn)程是調(diào)用進(jìn)程的一個(gè)精確的副本。新創(chuàng)建的進(jìn)程為子進(jìn)程,調(diào)用的FORK進(jìn)程為父進(jìn)程,而且創(chuàng)建出來的是兩個(gè)副本,即,兩個(gè)進(jìn)程,但他們互不干擾。(2)當(dāng)首次調(diào)用新創(chuàng)建進(jìn)程時(shí),其入口在哪里?首次創(chuàng)建進(jìn)程時(shí),入口在進(jìn)程

10、1那里。(二)進(jì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()來控制進(jìn)程執(zhí)行順序二、參考程序#include<stdio.h>#include<unistd.h>main()intpid;pid=fork();/*創(chuàng)建子進(jìn)程*/switch(pid)case-1:/*創(chuàng)建失敗*/printf("forkfail!n");exit(1);case0:/*子進(jìn)程*/execl("/bin/

11、ls","ls","-1","-color",NULL);printf("execfail!n");exit(1);default:/*父進(jìn)程*/wait(NULL);/*同步*/printf("lscompleted!n");exit(0);四、運(yùn)行結(jié)果12:4612:4612:3921:3112:4621:3121:3116:5016:5016:4916:4917:41:/DownlQdd“l(fā)inuK實(shí)整課件(操作系統(tǒng))$月月月月月月月月月月月月1-1xx®xxx-emp

12、ty、用量1056rw*rw-r一一1Tw-rw-r-1rw-rw-r1rwxrwxr-x1rw-rw-r一一1rw-rw-r-1rw-rw-r一一1rw-rw-r-1Tw-rw-r-1rw-rw-r-1rw-rw-r-1rw-rw-r-1scompleted!XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX296962109443732488760965113763601280012800128001280027187233101031010333310實(shí)臉提交方法,doc附錄.由c操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書.6口仁QS實(shí)驗(yàn)進(jìn)度.jpg1.LLc13的。2014_張華一操作系

13、統(tǒng)實(shí)驗(yàn).實(shí)驗(yàn)5.d口130延02初4_張華一操作系統(tǒng)實(shí)驗(yàn).實(shí)驗(yàn)4.dQ14_張華一操作系統(tǒng)實(shí)驗(yàn).實(shí)臆1do130陰02014_張華一操作系統(tǒng)實(shí)驗(yàn)一實(shí)驗(yàn)乙如1300002014_張華一操作素統(tǒng)實(shí)驗(yàn).實(shí)驗(yàn)1.do五、思考(1)可執(zhí)行文件加載時(shí)進(jìn)行了哪些處理?解:可執(zhí)行文件加載時(shí)首先是創(chuàng)建一個(gè)新進(jìn)程的fork系統(tǒng)調(diào)用,然后用于實(shí)現(xiàn)進(jìn)程自我終止的exit系統(tǒng)調(diào)用;改變進(jìn)程原有代碼的exec系統(tǒng)調(diào)用;用于將調(diào)用進(jìn)程掛起并等待子進(jìn)程終止的wait系統(tǒng)調(diào)用;獲得進(jìn)程標(biāo)識(shí)符的getpid系統(tǒng)調(diào)用等處理過程。(2)什么是進(jìn)程同步?wait()是如何實(shí)現(xiàn)進(jìn)程同步的?解:進(jìn)程同步是指對(duì)多個(gè)相關(guān)進(jìn)程在執(zhí)行次序上進(jìn)行協(xié)

14、調(diào),以使并發(fā)執(zhí)行的主進(jìn)程之間有效地共享資源和相互合作,從而使程序的執(zhí)行具有可在現(xiàn)行。首先程序在調(diào)用fork()機(jī)那里了一個(gè)子進(jìn)程后,馬上調(diào)用wait(),使父進(jìn)程在子進(jìn)程調(diào)用之前一直處于睡眠狀態(tài),這樣就使子進(jìn)程先運(yùn)行,子進(jìn)程運(yùn)行exec()裝入命令后,然后調(diào)用wait(0),使子進(jìn)程和父進(jìn)程并發(fā)執(zhí)行,實(shí)現(xiàn)進(jìn)程同步。(三)進(jìn)程互斥實(shí)驗(yàn)實(shí)驗(yàn)?zāi)康?、進(jìn)一步認(rèn)識(shí)并發(fā)執(zhí)行的實(shí)質(zhì)2、分析進(jìn)程競爭資源的現(xiàn)象,學(xué)習(xí)解決進(jìn)程互斥的方法實(shí)驗(yàn)內(nèi)容1、修改實(shí)驗(yàn)(一)中的程序2,用lockf()來給每一個(gè)進(jìn)程加鎖,以實(shí)現(xiàn)進(jìn)程之間的互斥2、觀察并分析出現(xiàn)的現(xiàn)象#include<stdio.h>#include

15、<unistd.h>main()intp1,p2,i;while(p1=fork()=-1);/*創(chuàng)建子進(jìn)程p1*/if(p1=0)(lockf(1,1,0);/*加鎖,這里第一個(gè)參數(shù)為stdout(標(biāo)準(zhǔn)輸出設(shè)備的描述符)*/for(i=0;i<10;i+)printf("daughter%dn",i);lockf(1,0,0);/*解鎖*/else(while(p2=fork()=-1);/*創(chuàng)建子進(jìn)程p2*/if(p2=0)(lockf(1,1,0);/*加鎖*/for(i=0;i<10;i+)printf("son%dn",

16、i);lockf(1,0,0);/*解鎖*/else(lockf(1,1,0);/*加鎖*/for(i=0;i<10;i+)printf("parent%dn",i);lockf(1,0,0);/*解鎖*/運(yùn)行結(jié)果xxxxx-empty:/Downloads/linux買提保忤(操作jfeSt)$./tarent0arent1arent2arent3arent4arent5arent6arent7arent8arent9on0on1on2on3on4on5on6on7on8on9aughter0aughter1aughter2aughter3aughter4aught

17、er5aughter6aughter7aughter8aughter9xxxgxxx-empty:/DownlQads/linux實(shí)驗(yàn)課件(掾作系統(tǒng))$./tparent0parent1parent2parent3parent4parent5parent6parent7parent8parent9daughter0daughter1daughter2daughter3daughter4daughter5daughter6daughter7daughter8daughter9son0son1son2son3son4son5son6son1son8son9parentsondaughter.dau

18、ghter.或parentsonparentdaughter大致與未上鎖的輸出結(jié)果相同,也是隨著執(zhí)行時(shí)間不同,輸出結(jié)果的順序有所不同。四、分析原因上述程序執(zhí)行時(shí),不同進(jìn)程之間不存在共享臨界資源(其中打印機(jī)的互斥性已由操作系統(tǒng)保證)問題,所以加鎖與不加鎖效果相同。(四)守護(hù)進(jìn)程實(shí)驗(yàn)寫一個(gè)使用守護(hù)進(jìn)程(daemon)的程序,來實(shí)現(xiàn):1,創(chuàng)建一個(gè)日志文件/var/log/Mydaemon.log2,每分鐘都向其中寫入一個(gè)時(shí)間戳(使用time_t的格式)注意:要root權(quán)限才能在/var/log創(chuàng)建文件。守護(hù)神程序:#include<stdio.h>#include<time.h&g

19、t;#include<unistd.h>main()time_tt;/建立time_t格式變量FILE*fp;建立文件fp=fopen("/var/log/Mydaemon.log","a");/打開文件pid_tpid;/守護(hù)神pid=fork();if(pid>0)printf("Daemononduty!n");exit(0);elseif(pid<0)printf("Can'tfork!n");exit(-1);while(1)if(fp>=0)sleep(60);等待

20、一分鐘再往文件中寫入時(shí)間戳printf("Daemononduty!n");t=time(0);fprintf(fp,"Thecurrenttimeis%sn",asctime(localtime(&t);fclose(fp);/關(guān)閉文件運(yùn)行結(jié)果lot©最近使用的0主文件夾而桌面&圖片系音樂卷j回收站計(jì)善機(jī)亦瀏地闞絡(luò)而Workspacefigcwent而現(xiàn)頰*Downloads中連堆到服昌器apport,1qe-4.£Z加th0JbootJoe111S*)bootstrao.loebtmpdpkE.loc1f'

21、MlMh141|vWfailloefomtcoiifig.loggpu-ftanag&r,logkernlogIVL_.:-»1tern,log.1lastlogMyda«ion.Lorgsysloe.5V與log,1同陪log2好syslog.Jrgz5y51qg.4.EZ16ww*1*syslP£a5,£Zsyslo£,7.EZwtg_)Ib*OTE.電1C£XOT£,0.1QC.oldXorcJi.loEXore,1.log.oldF/DoumlomdH/lininc美魅球件(撩作系筑)$sudc.八Esudc

22、jkxx的密碼:Daemononduty!*11(癖£»(-凸叩1¥:F/Downlnad5/linux實(shí)攀課件(操作系統(tǒng))*Daemononduty)Daemononduty!DaemonondutyI進(jìn)程通信(一)信號(hào)機(jī)制實(shí)驗(yàn)實(shí)驗(yàn)?zāi)康?、了解什么是信號(hào)2、熟悉LINUX系統(tǒng)中進(jìn)程之間軟中斷通信的基本原理實(shí)驗(yàn)內(nèi)容1、編寫程序:用fork()創(chuàng)建兩個(gè)子進(jìn)程,再用系統(tǒng)調(diào)用signal()讓父進(jìn)程捕捉鍵盤上來的中斷信號(hào)(即按Ac鍵);捕捉到中斷信號(hào)后,父進(jìn)程用系統(tǒng)調(diào)用kill()向兩個(gè)子進(jìn)程發(fā)出信號(hào),子進(jìn)程捕捉到信號(hào)后分別輸出下列信息后終止:Childprocessl

23、iskilledbyparent!Childprocess2iskilledbyparent!父進(jìn)程等待兩個(gè)子進(jìn)程終止后,輸出如下的信息后終止:Parentprocessiskilled!2、分析利用軟中斷通信實(shí)現(xiàn)進(jìn)程同步的機(jī)理參考程序#include<stdio.h>#include<signal.h>#include<unistd.h>voidwaiting(),stop();intwait_mark;main()intp1,p2,stdout;while(p1=fork()=-1);/*創(chuàng)建子進(jìn)程p1*/if(p1>0)while(p2=fork

24、()=-1);/*創(chuàng)建子進(jìn)程p2*/if(p2>0)wait_mark=1;signal(SIGINT,stop);/*接收至U3信號(hào),轉(zhuǎn)stop*/waiting();kill(p1,16);/*向pl發(fā)軟中斷信號(hào)16*/kill(p2,17);/*向p2發(fā)軟中斷信號(hào)17*/wait(0);/*同步*/wait(0);printf("Parentprocessiskilled!n");exit(0);)elsewait_mark=1;signal(17,stop);/*接收到軟中斷信號(hào)17,轉(zhuǎn)stop*/waiting();lockf(stdout,1,0);pri

25、ntf("Childprocess2iskilledbyparent!n");lockf(stdout,0,0);exit(0);)elsewait_mark=1;signal(16,stop);/*接收到軟中斷信號(hào)16,轉(zhuǎn)stop*/waiting();lockf(stdout,1,0);printf("Childprocess1iskilledbyparent!n");lockf(stdout,0,0);exit(0);)voidwaiting()while(wait_mark!=0);voidstop()(wait_mark=0;)一運(yùn)行結(jié)果屏幕上

26、無反應(yīng),按下AC后,顯示Parentprocessiskilled!xxxQxxxenptj:3d與/Linu實(shí)騏iM件(操作整蛻)xk爬km工-emon:Dowkaads/linuj(案皤讀性(.ixSuix-er'iutyr/p0mlljjgnnjK實(shí)蔽課件(.<nainO.c:Infunctionnain1:I.c;214:warning;JecldrdtionJfiidlL(d):implicitdeclarationofrunctioncMait'finplicitfjnction1.c:?4:4:warn!ng:inplicitdeciarattonnffun

27、cttnn'exit/r-winpitcit-funntion-aratonJexit();A.c:24:4:.c:24:4:二34;4:Naming:incompatibleimplicitdeclarationofbuilt-innato:include(h>5orp廣白vid。adeclarationoFwaning;incDTipatibleimplicitdeclarationoFbuilt-infunction-exit'-it'FunctionHexifexit(d);"exiffunctionHejcIL',gi34;4;note

28、;include'與stdlib-h>'orprovideadeclarationq.cr45:3:Ndmlng:incomdtibleinpllcitdeclarationofbuilt-inexit:1.c:4b:3:notinclude1Cstdlib.h>dprovideadeciarationofaEMLEupty:-/gwilaadq/linuK實(shí)雉課件(展作系雄)$*CParentprocessiskilled!k)CM)(KK-Qmpty:-7。0對(duì)nlomd與/linux實(shí)蛉iZfT(操fF系燒)$,分析原因上述程序中,signal()都放在一段程

29、序的前面部位,而不是在其他接收信號(hào)處。這是因?yàn)閟ignal()的執(zhí)行只是為進(jìn)程指定信號(hào)值16或17的作用,以及分配相應(yīng)的與stop()過程鏈接的指針。因而,signal()函數(shù)必須在程序前面部分執(zhí)行。本方法通信效率低,當(dāng)通信數(shù)據(jù)量較大時(shí)一般不用此法。思考1、該程序段前面部分用了兩個(gè)wait(0),它們起什么作用?答:父進(jìn)程等待兩個(gè)子進(jìn)程終止。2、該程序段中每個(gè)進(jìn)程退出時(shí)都用了語句exit(0),為什么?答:該程序中每個(gè)進(jìn)程退出時(shí)都用了語句exit(0),這是進(jìn)程的正常終止。3、為何預(yù)期的結(jié)果并未顯示出?答:因?yàn)橹粓?zhí)行成功兩個(gè)子進(jìn)程,(1是并沒有調(diào)用兩個(gè)子進(jìn)程P1,P2。當(dāng)signal()讓父進(jìn)

30、程捕捉從鍵盤上來的信號(hào)(按下ac或者break鍵時(shí)),只有捕捉到信號(hào)后,父進(jìn)程用系統(tǒng)調(diào)用kill()向兩個(gè)子進(jìn)程發(fā)出信號(hào)。當(dāng)子進(jìn)程捕捉到信號(hào)后才能輸出信息,之后父進(jìn)程輸出信息。4、程序該如何修改才能得到正確結(jié)果?答:#include<stdio.h>#include<signal.h>#include<unistd.h>Voidwaiting(),stop(),alarming();Intwait_mark;Main()一IntP1,P2,stdout;if(P1=fork();/*創(chuàng)建子進(jìn)程P1*/If(p2=fork();/*創(chuàng)建子進(jìn)程P2*/Wait_

31、mark=1;Signal(SIGINT,stop);/*接收到C信號(hào),轉(zhuǎn)stop*/Signal(SIGALRM,alarming);/*接收SIGALRM*/Waiting();Kill(P1,16);/*向P1發(fā)軟中斷信號(hào)16*/Kill(P2,17);/*向P2發(fā)軟中斷信號(hào)17*/Wait(0);/*同步*/Wait(0);Printf("Parentn")Exit(0);)ElseWait_mark=1;Signal(17,stop);/*接收到軟中斷信號(hào)17,轉(zhuǎn)stop*/Signal(17,stop);Signal(SIGINT,SIG_IGN);/*忽略AC

32、信號(hào)*/While(wait_mark!=0);Lockf(stdout,1,0);Printf("Cpildcess2iskilledbyparent!n);Lockf(stdout,0,0);Exit(0);)ElseWait_mark=1;Signal(16,stop);Signal(SIGINT,SIG_IGN);While(wait_mark!=0)Lockf(stdout,1,0);Printf(二Childn")Lockf(stdout,0,0);Exit(0);)Voidwaiting()Sleep(5);if(wait_mark!=0);kill(getp

33、id(),SIGALRM);Voidalarming()Wait_mark=0;Voidstop();(Wait_mark=0)一(二)進(jìn)程的管道通信實(shí)驗(yàn)實(shí)驗(yàn)?zāi)康?、了解什么是管道2、熟悉UNIX/LINUX支持的管道通信方式實(shí)驗(yàn)內(nèi)容編寫程序?qū)崿F(xiàn)進(jìn)程的管道通信。用系統(tǒng)調(diào)用pipe()建立一管道,二個(gè)子進(jìn)程P1和P2分別向管道各寫一句話:Child1issendingamessage!Child2issendingamessage!父進(jìn)程從管道中讀出二個(gè)來自子進(jìn)程的信息并顯示(要求先接收P1,后P2)。參考程序#include<unistd.h>#include<signal.

34、h>#include<stdio.h>intpid1,pid2;main()(intfd2;charoutpipe100,inpipe100;pipe(fd);while(pid1=fork()=-1);if(pid1=0)(/*創(chuàng)建一個(gè)管道*/lockf(fd1,1,0);sprintf(outpipe,"child1processissendingmessage!");write(fd1,outpipe,50);sleep(5);lockf(fd1,0,0);exit(0);/*把串放入數(shù)組outpipe中*/*向管道寫長為50字節(jié)的串*/*自我阻塞5

35、秒*/)else(while(pid2=fork()=-1);if(pid2=0)lockf(fd1,1,0);/*互斥*/sprintf(outpipe,"child2processissendingmessage!");write(fd1,outpipe,50);sleep(5);lockf(fd1,0,0);)elseexit(0);/*同步*/*從管道中讀長為50字節(jié)的串*/wait(0);read(fd0,inpipe,50);printf("%sn",inpipe);wait(0);read(fd0,inpipe,50);printf(&qu

36、ot;%sn",inpipe);exit(0);運(yùn)行結(jié)果延遲5秒后顯示child1processissendingmessage!再延遲5秒child2processissendingmessage!XXKexxx-empty;/Dgnloads/linujt實(shí)睢課件(操作系統(tǒng))xxempty:rgmloadVlinuj(實(shí)會(huì)課件(.xxxxexxx-empty:700麗1。3由八畝口)(實(shí)賽課件(Lc:Infunction'main':1.c:19:4:warning:implicitdeclarationoffunction1exit"-Wiinplic

37、it-funcduel白rationexit(0);A1,c:19:4;warring:incompatibleimplicitdeclarationofbuilt-infunction'1.c:19:4:note:include*<stdlib.h>Forprovideadeclarationoftexif1,c:31:4:earning:incompatibleimplicitdeclarationofbuilt-infunction,exit(0);A1.c:31:4:note:include1<stdlib.h>horprovideadeclaratio

38、nof*exit'1.c:35:4:warning:implicitdeclarationoffunction4wait"-Wimplicit-funcdeclarationwait(0);A1.c:41:4:warning:Incompatibleimplicitdeclarationofbuilt-infunction'exit(0);Al-c:41:4:note:include*<stdlib,h>horprovideadeclarationof*exit'心)£30£m-611)0:"7口0M103£

39、1號(hào)/1:11111*實(shí)驗(yàn)課件(操作系統(tǒng))$./tchild1processissendingmessage!child2processissendingmessageIKxxexjcx-eiiiptvL/Downloddg/linuxiXff(操作系統(tǒng))$,思考題1、程序中的sleep(5)起什么作用?答:自我阻塞5秒。這樣做的目的是令讀進(jìn)程把管道中的已有數(shù)據(jù)讀完后,暫時(shí)進(jìn)入睡眠狀態(tài)等待,直至寫進(jìn)程又將數(shù)據(jù)寫入管道后,再將讀進(jìn)程喚醒。2、子進(jìn)程1和2為什么也能對(duì)管道進(jìn)行操作?答:因?yàn)樗麄兊淖x指針和寫指針都指向了管道的索引節(jié)點(diǎn)。(三)消息的發(fā)送與接收實(shí)驗(yàn)實(shí)驗(yàn)?zāi)康?、了解什么是消息2、熟悉消息傳

40、送的機(jī)理實(shí)驗(yàn)內(nèi)容消息的創(chuàng)建、發(fā)送和接收。使用系統(tǒng)調(diào)用msgget(),msgsnd(),msgrev(),及msgctl()編制一長度為1k的消息發(fā)送和接收的程序。參考程序1、client.c#include<sys/types.h>#include<sys/msg.h>#include<sys/ipc.h>#defineMSGKEY75structmsgformlongmtype;charmtext1000;msg;intmsgqid;voidclient()inti;msgqid=msgget(MSGKEY,0777);/*打開75#消息隊(duì)列*/for(

41、i=10;i>=1;i-)msg.mtype=i;printf(client)sentn");/*發(fā)送消息*/msgsnd(msgqid,&msg,1024,0);exit(0);)main()(client();)2、server.c#include<sys/types.h>#include<sys/msg.h>#include<sys/ipc.h>#defineMSGKEY75structmsgformlongmtype;charmtext1000;msg;intmsgqid;voidserver()msgqid=msgget(M

42、SGKEY,0777|IPC_CREAT);/*創(chuàng)建75#消息隊(duì)列*/domsgrcv(msgqid,&msg,1030,0,0);/*接收消息*/printf(server)receivedn");while(msg.mtype!=1);msgctl(msgqid,IPC_RMID,0);/*刪除消息隊(duì)列,歸還資源*/exit(0);main()server();程序說明1、為了便于操作和觀察結(jié)果,編制二個(gè)程序client.c和server.c,分別用于消息的發(fā)送與接收。2、server建立一個(gè)Key為75的消息隊(duì)列,等待其它進(jìn)程發(fā)來的消息。當(dāng)遇到類型為1的消息,則作為結(jié)束

43、信號(hào),取消該隊(duì)列,并退出server。server每接收到一個(gè)消息后顯示一句”(server)received。"3、client使用key為75的消息隊(duì)列,先后發(fā)送類型從10至U1的消息,然后退出。最后一個(gè)消息,即是server端需要的結(jié)束信號(hào)。client每發(fā)送一條消息后顯示一句"(client)sent”。4、注意:二個(gè)程序分別編輯、編譯為client與server。執(zhí)行:./server&ipcs-q./client。運(yùn)行結(jié)果從理想的結(jié)果來說,應(yīng)當(dāng)是每當(dāng)client發(fā)送一個(gè)消息后,server接收該消息,client再發(fā)送下一條。也就是說"(cli

44、ent)sent"和"(server)received的字樣應(yīng)該在屏幕上交替出現(xiàn)。實(shí)際的結(jié)果大多是,先由client發(fā)送了兩條消息,然后server接收一條消息。此后client、server交替發(fā)送和接收消息。最后server一次接收兩條消息。client和server分別發(fā)送和接收了10條消息,與預(yù)期設(shè)想一致。開啟serverxxxxxx-empty:-/Downloads/linuxtSUEff()$./server開啟client,發(fā)送信息xxxexxx-empry:'/Downioaas/nnux5k®irttffiTFiRSJC)5-/ciie

45、n(client)sent(client)sent(client)sent(client)sent(client)sent(client)sent(client)sent(client)sent(client)sentServer收至ij信息(client)sentxxxxxx-empty:*/Downloads/linuxSCSiJfT(./server(server)received(server)received(server)received(server)received(server)received(server)received(server)received(server)r

46、eceived(server)received(server)received思考message的傳送和控制并不保證完全同步,當(dāng)一個(gè)程序不在激活狀態(tài)的時(shí)候,它完全可能繼續(xù)睡眠,造成了上面的現(xiàn)象,在多次sendmessage后才recievemessage。這一點(diǎn)有助于理解消息傳送的實(shí)現(xiàn)機(jī)理。(四)共享存儲(chǔ)區(qū)通信實(shí)驗(yàn)?zāi)康牧私夂褪煜す蚕泶鎯?chǔ)機(jī)制實(shí)驗(yàn)內(nèi)容編制一長度為1k的共享存儲(chǔ)區(qū)發(fā)送和接收的程序。參考程序#include<sys/types.h>#include<sys/shm.h>#include<sys/ipc.h>#defineSHMKEY75intshm

47、id,i;int*addr;voidclient()inti;shmid=shmget(SHMKEY,1024,0777);/*打開共享存儲(chǔ)區(qū)*/addr=shmat(shmid,0,0);/*獲得共享存儲(chǔ)區(qū)首地址*/for(i=9;i>=0;i-)while(*addr!=-1);printf("(client)sentn");*addr=i;exit(0);voidserver()shmid=shmget(SHMKEY,1024,0777|IPC_CREAT);/*創(chuàng)建共享存儲(chǔ)區(qū)*/addr=shmat(shmid,0,0);/*獲取首地址*/do*addr=-1

48、;while(*addr=-1);printf("(server)receivedn");while(*addr);shmctl(shmid,IPC_RMID,0);/*撤消共享存儲(chǔ)區(qū),歸還資源*/exit(0);main()while(i=fork()=-1);if(!i)server();system("ipcs-m");while(i=fork()=-1);if(!i)client();wait(0);wait(0);程序說明1、為了便于操作和觀察結(jié)果,用一個(gè)程序作為“引子“,先后fork()兩個(gè)子進(jìn)程,server和client,進(jìn)行通信。2、s

49、erver端建立一個(gè)key為75的共享區(qū),并將第一個(gè)字節(jié)置為-1,作為數(shù)據(jù)空的標(biāo)志。等待其他進(jìn)程發(fā)來的消息。當(dāng)該字節(jié)的值發(fā)生變化時(shí),表示收到了信息,進(jìn)行處理。然后再次把它的值設(shè)為-1,如果遇到的值為0,則視為為結(jié)束信號(hào),取消該隊(duì)列,并退出server。server每接收到一次數(shù)據(jù)后顯示“(server)received"。3、client端建立一個(gè)key為75的共享區(qū),當(dāng)共享取得第一個(gè)字節(jié)為-1時(shí),server端空閑,可發(fā)送請(qǐng)求。client隨即填入9至ij0。期間等待server端的再次空閑。進(jìn)行完這些操作后,client退出。client每發(fā)送一次數(shù)據(jù)后顯示“(client)se

50、nt”。4、父進(jìn)程在server和client均退出后結(jié)束。運(yùn)行結(jié)果client發(fā)送一次數(shù)據(jù)后,0.1秒才發(fā)送下一個(gè)數(shù)據(jù)。server要等待大約和預(yù)想的完全一樣。但在運(yùn)行過程中,發(fā)現(xiàn)每當(dāng)0.1秒才有響應(yīng)。同樣,之后client又需要等待大約標(biāo)標(biāo)標(biāo)標(biāo)標(biāo)標(biāo)標(biāo)標(biāo)標(biāo)標(biāo)標(biāo)標(biāo)標(biāo)標(biāo)標(biāo)標(biāo)標(biāo)標(biāo)目目目目目目目目目目目目目目目目目目共享內(nèi)存段鍵shmid擁有若一權(quán)限連接數(shù)狀態(tài)0x00000000524288xxx60052428820x00000000851969xxx60052428820x000000001245186xxx60052428820x00000000491523xxx6001677721620x0

51、0000000655364xxx60052428820x000000001114117xxx60052428820x000000001146886xxx6006710886420x000000001540103xxx60052428820x000000001572872xxx60052428820x000000001671177xxx60052428820x000000001703946xxx60039321620x000000001802251xxx60052428820x000000001835020xxx600420x000000002064397xxx60052428820x00000

52、0001966094xxx600420x5102005b4849679xxx666409610x000000002654224xxx600209715220x000000008912913xxx60052428820x000000002752530xxx600420x000000002785299xxx60042xxxxxx-empty:/Downloads/linux實(shí)驗(yàn)課件(操作系統(tǒng))$./20x000000002818068xxx600420x000000002850837xxx600420x000000002883606xxx600420x000000002916375xxx600420xcbc384f83473432xxx6006452810x000000004161561xx

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論