實驗三:進程通信(一)-管道及共享內存_第1頁
實驗三:進程通信(一)-管道及共享內存_第2頁
實驗三:進程通信(一)-管道及共享內存_第3頁
實驗三:進程通信(一)-管道及共享內存_第4頁
實驗三:進程通信(一)-管道及共享內存_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

操作系統(tǒng)實驗報告實驗三、進程通信(一)

——管道及共享內存實驗目的加深對管道通信的了解掌握利用管道進行通信的程序設計了解共享內存通信的程序設計方法了解和熟悉Linux支持的共享存儲區(qū)機制實驗內容任務一、(1)閱讀以上父子進程利用管道進行通信的例子(例1),寫出程序的運行結果并分析。(2)編寫程序:父進程利用管道將一字符串交給子進程處理。子進程讀字符串,將里面的字符反向后再交給父進程,父進程最后讀取并打印反向的字符串。任務二、(1)閱讀例2的程序,運行一次該程序,然后用ipcs命令查看系統(tǒng)中共享存儲區(qū)的情況,再次執(zhí)行該程序,再用ipcs命令查看系統(tǒng)中共享內存的情況,對兩次的結果進行比較,并分析原因。最后用ipcrm命令刪除自己建立的共享存儲區(qū)。(有關ipcs和ipcrm介紹見后面一頁)(2)每個同學登陸兩個窗口,先在一個窗口中運行例3程序1(或者只登陸一個窗口,先在該窗口中以后臺方式運行程序1),然后在另一個窗口中運行例3程序2,觀察程序的運行結果并分析。運行結束后可以用ctrl+c結束程序1的運行。(3)編寫程序:使用系統(tǒng)調用shmget(),shmat(),shmdt(),shmctl(),編制程序。要求在父進程中生成一個30字節(jié)長的私有共享內存段。接下來,設置一個指向共享內存段的字符指針,將一串大寫字母寫入到該指針指向的存貯區(qū)。調用fork()生成子進程,讓子進程顯示共享內存段中的內容。接著,將大寫字母改成小寫,子進程修改共享內存中的內容。之后,子進程將脫接共享內存段并退出。父進程在睡眠5秒后,在此顯示共享內存段中的內容(此時已經(jīng)是小寫字母)。代碼及運行結果分析閱讀以上父子進程利用管道進行通信的例子(例1),寫出程序的運行結果并分析實驗代碼:#include<stdio.h>main(){intx,fd[2];charbuf[30],s[30];pipe(fd);while((x=fork())==-1);if(x==0){close(fd[0]);printf("ChildProcess!\n");strcpy(buf,"Thisisanexample\n");write(fd[1],buf,30);exit(0);}else{close(fd[1]);printf("ParentProcess!\n");read(fd[0],s,30);printf("%s\n",s);}}運行結果:分析:調用pipe(fd);創(chuàng)建一個管道后,接著調用fork()函數(shù)產(chǎn)生兩個進程,首先開始執(zhí)行子進程,關閉管道出口,通過管道入口向管道中寫入內容。執(zhí)行if語句后,進入else語句塊內開始父進程,管道入口關閉,通過管道出口端從管道中讀取之前寫入內容,最后輸出出來編寫程序:父進程利用管道將一字符串交給子進程處理。子進程讀字符串,將里面的字符反向后再交給父進程,父進程最后讀取并打印反向的字符串。實驗代碼:#include<stdio.h>main(){intx,count,left,right,temp,fd[2],fe[2];charc,buf[30],s[30];pipe(fd);pipe(fe);printf("pleaseinputalineofchar");scanf("%s",buf);再次運行:再次用ipcs查看:Ipcrm刪除分析:成功,返回共享內存段的標識符,內核中用于唯一的標識一個對象。對存在于內核存貯空間中的每個共享內存段,內核均為其維護著一個數(shù)據(jù)結構shmid_ds。失敗,返回-1,設置errno。①第一個參數(shù)key(鍵值)用來創(chuàng)建IPC標識符,shmget()返回的標識符與key值一一對應,不同的key值返回不同的標識符。②第二個參數(shù)size,決定了共享內存段的大小(若訪問已存在的內存段,該參數(shù)可設為0)。有最大字節(jié)數(shù)的限制③第三個參數(shù)shmflag,用于設置訪問權限及標識創(chuàng)建條件。對兩次的結果進行比較:兩次運行結束后的第二個共享標識符是不一樣的。在用ipcs查看時,共享內存段中的關鍵字,共享內存標識符,訪問權限,字節(jié)等都是不一樣的。(4)每個同學登陸兩個窗口,先在一個窗口中運行例3程序1(或者只登陸一個窗口,先在該窗口中以后臺方式運行程序1),然后在另一個窗口中運行例3程序2,觀察程序的運行結果并分析。運行結束后可以用ctrl+c結束程序1的運行。實驗代碼:#include<sys/types.h>#include<sys/ipc.h>#include<sys/shm.h>#defineSHMKEY208/*在實際實驗過程中,為了避免每個同學建立的共享存儲區(qū)關鍵字一樣而相互干擾,關鍵字請用學號末3位*/#defineK1024intshmid;main(){inti,*pint;char*addr;externchar*shmat();externcleanup();for(i=0;i<20;i++)signal(i,cleanup);shmid=shmget(SHMKEY,16*K,0777|IPC_CREAT);/*建立16K共享區(qū)SHMKEY*/addr=shmat(shmid,0,0);/*掛接,并得到共享區(qū)首地址*/printf("addr0x%x\n",addr);pint=(int*)addr;for(i=0;i<256;i++)*pint++=i;pause();/*等待接收進程讀*/}cleanup(){shmctl(shmid,IPC_RMID,0);exit();}運行結果:分析:首先系統(tǒng)通過調用shmctl對shmid指向的內存段進行刪除操作,接著系統(tǒng)調用shmget創(chuàng)建一個16*1024字節(jié)的共享內存段,成功返回共享內存段的標識符給shmid,系統(tǒng)再次調用shmat連接內存段,返回該共享內存段連接到調用進程地址空間上的地址addr。實驗代碼:#include<sys/types.h>#include<sys/ipc.h>#include<sys/shm.h>#defineSHMKEY208/*在實際實驗過程中,為了避免每個同學建立的共享存儲區(qū)關鍵字一樣而相互干擾,關鍵字請用學號末3位*/#defineK1024intshmid;main(){inti,*pint;char*addr;externchar*shmat();shmid=shmget(SHMKEY,8*K,0777);/*取共享區(qū)SHMKEY的id*/addr=shmat(shmid,0,0);/*連接共享區(qū)*/pint=(int*)addr;for(i=0;i<256;i++)printf("%d\n",*pint++);/*打印共享區(qū)中的內容*/}運行結果:

分析:例3_1程序后臺運行時,該程序開始執(zhí)行,系統(tǒng)調用shmget創(chuàng)建一個8*1024字節(jié)的共享內存段,再通過調用shmat掛接內存段,由系統(tǒng)選擇掛接地址,最終輸出轉換后的掛接地址。需要指出的是,共享存儲區(qū)機制只為通信進程提供了訪問共享存儲區(qū)的操作條件,而對通信的同步控制則要依靠信號量機制等才能完成。編寫程序:使用系統(tǒng)調用shmget(),shmat(),shmdt(),shmctl(),編制程序。要求在父進程中生成一個30字節(jié)長的私有共享內存段。接下來,設置一個指向共享內存段的字符指針,將一串大寫字母寫入到該指針指向的存貯區(qū)。調用fork()生成子進程,讓子進程顯示共享內存段中的內容。接著,將大寫字母改成小寫,子進程修改共享內存中的內容。之后,子進程將脫接共享內存段并退出。父進程在睡眠5秒后,在此顯示共享內存段中的內容(此時已經(jīng)是小寫字母)。實驗代碼:#include<sys/types.h>#include<sys/ipc.h>#include<sys/shm.h>#defineSHMKEY208/*在實際實驗過程中,為了避免每個同學建立的共享存儲區(qū)關鍵字一樣而相互干擾,關鍵字請用學號末3位*/#defineK1024intshmid;main(){inti;char*pint;char*addr;externchar*shmat();externcleanup();for(i=0;i<20;i++)signal(i,cleanup);shmid=shmget(SHMKEY,16*K,0777|IPC_CREAT);/*建立16K共享區(qū)SHMKEY*/addr=shmat(shmid,0,0);/*掛接,并得到共享區(qū)首地址*/printf("addr0x%x\n",addr);pint=(char*)addr;for(i='a';i<='e';i++)*pint++=i;pause();/*等待接收進程讀*/}cleanup(){shmctl(shmid,IPC_RMID,0);exit();}#include<sys/types.h>#include<sys/ipc.h>#include<sys/shm.h>#defineSHMKEY208/*在實際實驗過程中,為了避免每個同學建立的共享存儲區(qū)關鍵字一樣而相互干擾,關鍵字請用學號末3位*/#defineK1024intshmid;main(){inti;char*pint;char*addr;externchar*shmat();shmid=shmget(SHMKEY,8*K,0777);/*取共享區(qū)SHMKEY的id*/addr=shmat(shmid,0,0);/*連接共享區(qū)*/pint=(char*)addr;for(i=0;i<5;i++)printf("%c\n",-32+*pint++);/*打印共享區(qū)中的內容*/}結果無法正確運行實驗心得通過本次實驗了解了管道進程間通信形式,,管道是半雙工的,數(shù)據(jù)

溫馨提示

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

評論

0/150

提交評論