實驗二進程管理_第1頁
實驗二進程管理_第2頁
實驗二進程管理_第3頁
實驗二進程管理_第4頁
實驗二進程管理_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

實驗二

進程管理(一)實驗的或實驗理.加深對進概念的理,明確進和程序的區(qū)別。.進一步認并發(fā)執(zhí)行實質。.分析進程爭資源現,學習解進程互斥的方法。.了解inux系統進程通信基本原理。(二)實驗容.進程的創(chuàng)。.進程的控。.①編寫一程序,使現實進程軟中斷通信。要求:使用統調用fork()建兩個進程,再系統調用ignal()讓父進捕捉鍵盤上來的中斷信按EL鍵當捕到中斷信號后,父進程用系統調用Kill()兩個進程發(fā)出信號,子進程捕捉信號后分輸出下列息后終止:ChildProcessllisKilledbyParent!ChildProcessl2isKilledbyParent!父進程等待個子進程止后,輸如下的信息后終止ParentProcessisKilled!②在上面的序中增加句signal(SIGNAL,SIG-IGN)和ignal(SIGQUIT,SIG-IGN),觀察執(zhí)行結果,分析原因4.進程的管通信。編制一段程,實現進的管理通。使用系統調pipe()建立一條道線;兩個子進程1和2分別管道中寫一話:Child1issendingamessage!Child2issendingamessage!而父進程則管道中讀來自于兩子進程的信息,顯示在屏幕上。要求父進程接收子進P發(fā)來的息,然后再接收子進程P2發(fā)來的息。實驗2指導[驗內容1.進程的創(chuàng)建〈任務〉編寫一段程,使用系調用fork()創(chuàng)兩個子進。當此程運行時,在系統中有一個父進程和兩個子程活動。每一個進在屏幕上顯示一個字符;父進程顯字符“a”,子進程分別顯示字符“b和“c”試觀記錄屏幕上顯示結果并分析原?!闯绦颉?include<>main(){intp1,p2;if(p1=fork())/*進程創(chuàng)建功*/putchar('b');else{if(p2=fork())/*子程創(chuàng)建成功*putchar('c');elseputchar('a');/*父程執(zhí)行*/}}<運行結果bca(時會出abc的任的排列分析:從進執(zhí)行并發(fā)看,輸出的排列是有可的。原因:創(chuàng)建進程需的時間雖可能多于出一個字的時間,各個進程的時間片的獲得卻不是一定順序的,以輸出abc的排列都是可能的。2.進程的控制<任務>修改已編寫的程序,每個程序輸出由單個字符改為一句話,再觀程序執(zhí)行屏幕上出的現象,并析其原因如果在程中使用系統調用lockf()來給每個程加鎖,可以實現進程之間的互斥,觀并分析出的現象。〈程序1#include<>main(){intp1,p2,i;if(p1=fork()){for(i=0;i<500;i++)printf("parent%d\n",i);wait(0);/*保證在子進終止前,父程不會終*/exit(0);}else{if(p2=fork()){for(i=0;i<500;i++)printf("son%d\n",i);wait(0);/*保證在子進終止前,父程不會終*/exit(0);/*向父進程信號且進程退出*/}else{for(i=0;i<500;i++)printf(“grandchild%d\n",i);exit(0);}}}〈運行結果parent….son…grandchild…grandchild…或grandchild…son…grandchild…son…parent分析:由于數出的字符之間不會中斷,因,每個字符內部的字順序輸出時不變。是由于進并發(fā)執(zhí)行的調度順序和父子進程的搶占處理問題,輸字符串的序和先后隨執(zhí)行的不而發(fā)生變。這與打印單字符的結果相同?!闯绦?#include<>#include<>main(){intp1,p2,i;if(p1=fork()){lockf(1,1,0);for(i=0;i<500;i++)printf("parent%d\n",i);lockf(1,0,0);wait(0);/*保在子進程終止前,父進不會終止*/exit(0);}else{if(p2=fork()){lockf(1,1,0);for(i=0;i<500;i++)printf("son%d\n",i);lockf(1,0,0);wait(0);/*保證在子進終止前,父程不會終*/exit(0);}else{lockf(1,1,0);for(i=0;i<500;i++)printf("daughter%d\n",i);lockf(1,0,0);exit(0);}}}<運行結果〉輸出parent塊son塊grandchild的順可能不同,但是每個塊的輸出過程會被打斷分析:因為述程序執(zhí)時,lockf(1,1,0)鎖定標準輸設備,lockf(1,0,0)解鎖準輸出設備,在lockf(1,1,0)與lockf(1,0,0)中間的for循環(huán)輸出不被中斷,鎖與不加鎖效果不相同。3.軟中斷通信〈任務1編制一段程,使用系調用fork()創(chuàng)建兩個子進程,再用系統調用signal()讓父進程捕鍵盤上來的中信號(即ctrl+c鍵),當捕到中斷信后,父進用系統調用kill()向個子進程發(fā)出信號子進程捕到信號后分別輸出下列信息后終止:childkilledbyparent!childkilledbyparent!父進程等待個子進程止后,輸以下信息后終止:parentprocessiskilled!<程序流程圖>〈程序〉#include<>#include<>#include<>voidwaiting(),stop(),alarming();intwait_mark;main(){intp1,p2;if(p1=fork())/*創(chuàng)建進程p1*/{if(p2=fork()){

/*創(chuàng)建進程wait_mark=1;signal(SIGINT,stop);/*接收到c信,轉stop*/接受SIGALRM*/waiting();kill(p1,16);/*向p1軟中信號kill(p2,17);/*向發(fā)中斷信號wait(0);/*同步/wait(0);printf("parentprocessiskilled!\n");exit(0);}else{wait_mark=1;signal(17,stop);signal(SIGINT,SIG_IGN);/*忽略^c信號/while(wait_mark!=0);lockf(1,1,0);printf("childprocess2iskilledbyparent!\n");lockf(1,0,0);exit(0);}}else{wait_mark=1;signal(16,stop);signal(SIGINT,SIG_IGN);/*忽略^信號/while(wait_mark!=0)lockf(1,1,0);printf("childprocess1killedparent!\n");lockf(1,0,0);exit(0);}}voidwaiting(){sleep(5);if(wait_mark!=0)kill(getpid(),SIGALRM);}voidalarming(){wait_mark=0;}voidstop(){wait_mark=0;}<運行結果不做任何操等待五秒父進程回子進程縣推出后退出,并打印退出順序;或點擊ctrl+C后程序退出打印退出順序?!慈蝿?在上面的任1中增加語句signal(SIGINT,SIG_IGN)和句signal(SIGQUIT,SIG_IGN),觀察執(zhí)行結果,分析原因這里,signal(SIGINT,SIG_IGN)和signal(SIGQUIT,SIG_IGN)分別為忽鍵信號以及忽中斷信號<程序>#include<>#include<>#include<>intpid1,pid2;intEndFlag=0;intpf1=0;intpf2=0;voidIntDelete(){kill(pid1,16);kill(pid2,17);}voidInt1(){printf("childprocesskilled!byparent\n");exit(0);}voidInt2(){printf("childprocesskilled!byparent\n");exit(0);}main(){intexitpid;if(pid1=fork()){if(pid2=fork()){signal(SIGINT,IntDelete);waitpid(-1,&exitpid,0);waitpid(-1,&exitpid,0);printf("parentprocessiskilled\n");exit(0);}else{signal(SIGINT,SIG_IGN);signal(17,Int2);pause();}}else{signal(SIGINT,SIG_IGN);signal(16,Int1);pause();}}〈運行結果請將上述程輸入計算后,執(zhí)行觀察。3.進程的管道信〈任務〉編制一段程,實現進的管道通。使用系統調用pipe()建立一條管線。兩個進程p1和p2分別向通道寫一句話child1processissendingmessage!child2processissendingmessage!而父進程則管道中讀來自兩個程的信息,顯示在屏幕上?!闯绦颉?include<>#include<>#include<>intpid1,pid2;main(){intfd[2];charoutpipe[100],inpipe[100];pipe(fd);/*建一管道/while((pid1=fork())==-1);if(pid1==0){lockf(fd[1],1,0);sprintf(outpipe,"child1processissendingmessage!");/*把串入數組outpipe中/write(fd[1],outpipe,50);/*向管道寫長50字節(jié)的串/sleep(5);/*我阻塞5秒/lockf(fd[1],0,0);exit(0);}else{while((pid2=fork(if(pid2==0){lockf(fd[1],1,0);/*斥*/sprintf(outpipe,"child2processissendingmessage!");write(fd[1],outpipe,50);sleep(5);lockf(fd[1],0,0);exit(0);}else{wait(0);/*同步/read(fd[0],inpipe,50);/*管道

溫馨提示

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

最新文檔

評論

0/150

提交評論