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

下載本文檔

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

文檔簡介

1、操作系統(tǒng)實驗報告實驗三、進程通信(一)管道及共享內(nèi)存一、實驗?zāi)康?) 加深對管道通信的了解2) 掌握利用管道進行通信的程序設(shè)計3) 了解共享內(nèi)存通信的程序設(shè)計方法4) 了解和熟悉 Linux 支持的共享存儲區(qū)機制二、實驗內(nèi)容任務(wù)一、( 1)閱讀以上父子進程利用管道進行通信的例子(例1),寫出程序的運行結(jié)果并分析。(2)編寫程序: 父進程利用管道將一字符串交給子進程處理。 子進程讀字符串, 將里面的字符反向后再交給父進程,父進程最后讀取并打印反向的字符串。 任務(wù)二、(1)閱讀例 2 的程序,運行一次該程序,然后用 ipcs 命令查看系統(tǒng)中共享存儲 區(qū)的情況,再次執(zhí)行該程序,再用 ipcs 命令查

2、看系統(tǒng)中共享內(nèi)存的情況,對兩 次的結(jié)果進行比較, 并分析原因。最后用 ipcrm 命令刪除自己建立的共享存儲區(qū)。 (有關(guān) ipcs 和 ipcrm 介紹見后面一頁)( 2)每個同學(xué)登陸兩個窗口,先在一個窗口中運行例3 程序 1(或者只登陸一個窗口,先在該窗口中以后臺方式運行程序 1),然后在另一個窗口中運行例 3 程序 2,觀察程序的運行結(jié)果并分析。運行結(jié)束后可以用 ctrl+c 結(jié)束程序 1 的運 行。(3)編寫程序:使用系統(tǒng)調(diào)用shmget(), shmat(), shmdt(), shmctl(),編制程序。 要求在父進程中生成一個 30 字節(jié)長的私有共享內(nèi)存段。接下來,設(shè)置一個指向 共

3、享內(nèi)存段的字符指針, 將一串大寫字母寫入到該指針指向的存貯區(qū)。 調(diào)用 fork() 生成子進程,讓子進程顯示共享內(nèi)存段中的內(nèi)容。接著,將大寫字母改成小寫, 子進程修改共享內(nèi)存中的內(nèi)容。 之后, 子進程將脫接共享內(nèi)存段并退出。 父進程 在睡眠 5 秒后,在此顯示共享內(nèi)存段中的內(nèi)容(此時已經(jīng)是小寫字母) 。三、代碼及運行結(jié)果分析( 1) 閱讀以上父子進程利用管道進行通信的例子 (例 1),寫出程序的運行結(jié)果并分 析 實驗代碼: #includemain() int x,fd2;char buf30,s30;pipe(fd);while (x=fork()=_1);if (x=0)close(fd0

4、);prin tf(Child Process!n); strcpy(buf,This is an example n); write(fd1,buf,30);exit(0);elseclose(fd1);printf(Parent Process!n); read(fd0,s,30);prin tf(%sn,s);運行結(jié)果:分析:調(diào)用pipe(fd);創(chuàng)建一個管道后,接著調(diào)用fork()函數(shù)產(chǎn)生兩個進程,首先開始執(zhí) 行子進程,關(guān)閉管道出口,通過管道入口向管道中寫入內(nèi)容。執(zhí)行if語句后,進入else語句塊內(nèi)開始父進程,管道入口關(guān)閉,通過管道出口端從管道中讀取之 前寫入內(nèi)容,最后輸出出來(2)編

5、寫程序:父進程利用管道將一字符串交給子進程處理。子進程讀字符串,將里面的字符反向后再交給父進程,父進程最后讀取并打印反向的字符串。 實驗代碼:#in cludemain () int x,cou nt,left,right,temp,fd2,fe2;char c,buf30,s30;pipe(fd);pipe(fe);prin tf(please in put a line of char);scan f(%s,buf);while(x=fork()=_1);if(x=O)close(fd0);close(fe1);prin tf(Child Process!n);write(fd1,buf,

6、30);read(fe0,buf,30);prin tf(%sn,buf);exit(0);elseclose(fd1);close(fe0); coun t=0;doread(fd0, &c,1);sco un t+=c;while(c!=0);printf(Parent Process!n);prin tf(%sn,s);coun t-=2;for(left=0,right=co un t;leftc鬲:Lho召t(3)閱讀例2的程序,運行一次該程序,然后用ipcs命令查看系統(tǒng)中共享存儲區(qū)的情況,再次執(zhí)行該程序,再用ipcs命令查看系統(tǒng)中共享內(nèi)存的情況,對兩次的結(jié)果進行比較,并分析原因。最

7、后用ipcrm命令刪除自己建立的共享存儲區(qū)。(有關(guān)ipcs和ipcrm介紹見后面一頁)實驗代碼:#in elude #in elude #in elude main ()key_t key=208; /*在實際實驗過程中,為了避免每個同學(xué)建立的共享存儲區(qū)關(guān)鍵字一樣而相 互干擾,關(guān)鍵字請用學(xué)號末3位*/int shmid_1,shmid_2;if (shmid_ 仁shmget(key,1000,0644|IPC_CREAT)=-1)perror(shmget shmid_1);exit(1);prin tf(First shared memory ide ntifier is %dn ,shm

8、id_1);if (shmid_2=shmget(IPC_PRIV ATE,20,0644)=-1)perror(shmget shmid_2);exit(2);prin tf(Sec ond shared memory ide ntifier is %dn,shmid_2);exit(0);運行結(jié)果:112 .c Nbu 18U 523C written eB662O2O8(?ljQcaliost e06628238 gcc 112 .c -d 112 LB(d662U2U8(Jlocalhast e(dbb2U2d8J$ ./Li2First shared nenori/ ident if

9、 ier is 1376291Eecond shared memaFV identifier is 1409060 eQE202S81acalhost e0G62B298$ ,Ipcs查看:0丄000010 000 0 0 0000 2 t00000_w 0 0 6- 00 0 0 0 0 0 000100再次運行:Bx009aS003 bx0090G00apx0fl38B2a2 hxQ030QfiO0 bxseaeesaaRBx0030SGe7HX0030SG03 hx0030606F hl0038SO09 0X0090088 5 QxQ030QGQ0 MA30600F) 6x0030600

10、3 kl00306003 0X00900009 S0396Q14b 0x00308000 0XMU90Q009 0x06908012 0X00300000 0x00306603 0x00308495 x0B300800 MX0B30QS00 HX00900090 0xQ03SQQ4b0X0O30B000 |0X0000007g MX0O00QO0B Hx090QSe& bx0090Q000 6x03906309 Hx00900e09 hxQe90Q3e? ”辺酮囪甌斷hx0306SdaMX0S30SS00 X0099e3?f Bx0G3SSG09 0x0030680 0X0838W08 0x8

11、8080800 0X00000077 0x00306009 0x003060034751455 5701728 3833953 3999490 3997795 4939564 E7G7269 4O9&183 4128B71 41616404227178 4259947 4685932 4423789 44893264&22095 4587632 4&2041 4784242 4S17011 6091964 4783853 5013622 E04&391 5977160 S144697 6193274 5210235 5243004 530B541 341310 5374079 胸00區(qū)4 54

12、3?61? 505丄54 5537933 S57M92 SS32S37 E&6S998 5S65607 E99937& 5J31145 5763914 5?9&663E 029452622&062606620 丄 33 0020233 e%620119 E0&62Q3L2 e%&20114 BO6629134 C0G623231 e%620211 e%62aill e06620111B06620133 8&620133 e06620121 e06620121 #06620124 e96620丄 %G20131 e&3G!21B e%&20294 eflfi&3tR21S e%6202LB 00

13、862921 e%62Q121 e%62ai21 e%620121 06629218 OK&30211 eK620118 e0662012Q e0662011? e 96620124 O0&620124 e%620230 elKfi30231 e%G20224 e06620121eK&2Mll e%&2021 e%620211 e06620114 o%G29332 e06620102 e%&20126 C0662Q333 e0662811? o0&628120C06620333644644644777644644G446446446446446*14644644644644?7?7744644

14、644G44644B446446447776446446447-H644?7?64644644777644?77777777t44644644644777646442020201&3B4202910 BS2010B8201000礙202020201639416384201030202Q10 B02020Z01694203020100020 163842020201&3I420 通討 1&34 163*420203Q201631430200 1000002100Semaphore fippaps femldounereyMessage Queuesnisqidownerpernse0652e20

15、BPlacailhost b0G&2S20QI?1o can lhoo te0662BZE)8 $ e0Gt2B2B8 $gcc 112 .c,li2First slhFeid vneviory identifier is 1376291|second shared nenoi*!/ identif ie?r i爭 6389906再次用ipcs查看:010 0 0w000 0 2丄電邑a0 0 4Fj-M0000001 0 11200 10 00 0 0awIpcrm刪除- dm n as b X* J- *d Mil 00 0 0000 0 0ft- cS 一H040 0 0000 0001

16、0112 00 0 00 0 0 0分析:成功,返回共享內(nèi)存段的標(biāo)識符,內(nèi)核中用于唯一的標(biāo)識一個對象。 對存在于內(nèi) 核存貯空間中的每個共享內(nèi)存段,內(nèi)核均為其維護著一個數(shù)據(jù)結(jié)構(gòu)shmid_dso失敗,返回一1,設(shè)置errno。 第一個參數(shù)key (鍵值)用來創(chuàng)建IPC標(biāo)識符,shmget(返回的標(biāo)識符與 key 值一一對應(yīng),不同的 key 值返回不同的標(biāo)識符。 第二個參數(shù)size,決定了共享內(nèi)存段的大小(若訪問已存在的內(nèi)存段,該 參數(shù)可設(shè)為 0)。有最大字節(jié)數(shù)的限制 第三個參數(shù)shmflag,用于設(shè)置訪問權(quán)限及標(biāo)識創(chuàng)建條件。對兩次的結(jié)果進行比較:兩次運行結(jié)束后的 第二個共享標(biāo)識符是不一樣的。在

17、用 ipcs 查看時,共享內(nèi)存段中的關(guān)鍵字,共享內(nèi)存標(biāo)識符,訪問權(quán)限,字節(jié)等 都是不一樣的。(4)每個同學(xué)登陸兩個窗口,先在一個窗口中運行例3 程序 1(或者只登陸一個窗口,先在該窗口中以后臺方式運行程序 1),然后在另一個窗口中運行例 3 程序 2,觀察程序的運 行結(jié)果并分析。運行結(jié)束后可以用 ctrl+c 結(jié)束程序 1 的運行。實驗代碼:#include #include #include #define SHMKEY 208 /* 在實際實驗過程中, 為了避免每個同學(xué)建立的共享存儲區(qū)關(guān)鍵字一 樣而相互干擾,關(guān)鍵字請用學(xué)號末3 位*/#define K 1024int shmid;main

18、 ()int i,*pint;char *addr;extern char * shmat ();extern cleanup ();for(i=0;i20;i+) signal(i,cleanup); shmid=shmget(SHMKEY,16*K,0777|IPC_CREAT); /* 建立 16K 共享區(qū) SHMKEY */ addr=shmat(shmid,0,0);/* 掛接,并得到共享區(qū)首地址 */ printf (addr 0x%xn,addr);pint=(int *)addr;for (i=0;i0662S298(?localho0t o%62O20eK .ZliSft1

19、24718aJdr 0x001?Se00620208(?locdlhusc t;0662O208 J$分析:首先系統(tǒng)通過調(diào)用shmctl對shmid指向的內(nèi)存段進行刪除操作,接著系統(tǒng)調(diào)用 shmget創(chuàng)建一個16*1024字節(jié)的共享內(nèi)存段,成功返回共享內(nèi)存段的標(biāo)識符給 shmid,系統(tǒng)再次調(diào)用shmat連接內(nèi)存段,返回該共享內(nèi)存段連接到調(diào)用進程地 址空間上的地址addr。實驗代碼:#in elude #in clude #in clude #defi ne SHMKEY 208/*在實際實驗過程中,為了避免每個同學(xué)建立的共享存儲區(qū)關(guān)鍵字一樣而相互干擾,關(guān)鍵字請用學(xué)號末3位*/#defi ne

20、K 1024int shmid;main ()int i,*pi nt;char *addr;exter n char * shmat ();shmid=shmget(SHMKEY,8*K,0777);/* 取共享區(qū) SHMKEY 的 id */ addr=shmat(shmid,0,0);/* 連接共享區(qū) */pin t=(i nt *)addr;for (i=0;i256;i+)prin tf(%dn,*pi nt+);/* 打印共享區(qū)中的內(nèi)容 */運行結(jié)果:分析:例 3_1 程序后臺運行時, 該程序開始執(zhí)行, 系統(tǒng)調(diào)用 shmget 創(chuàng)建一個 8*1024 字 節(jié)的共享內(nèi)存段,再通過調(diào)用

21、 shmat 掛接內(nèi)存段,由系統(tǒng)選擇掛接地址,最終輸 出轉(zhuǎn)換后的掛接地址。需要指出的是, 共享存儲區(qū)機制只為通信進程提供了訪問共享存儲區(qū)的操作 條件,而對通信的同步控制則要依靠信號量機制等才能完成。(5) 編寫程序:使用系統(tǒng)調(diào)用 shmget() ,shmat() , shmdt() , shmctl() ,編制程序。 要求在父進程中生成一個 30 字節(jié)長的私有共享內(nèi)存段。接下來,設(shè)置一個指 向共享內(nèi)存段的字符指針,將一串大寫字母寫入到該指針指向的存貯區(qū)。調(diào)用 fork() 生成子進程, 讓子進程顯示共享內(nèi)存段中的內(nèi)容。 接著, 將大寫字母改成 小寫, 子進程修改共享內(nèi)存中的內(nèi)容。 之后,子進

22、程將脫接共享內(nèi)存段并退出。 父進程在睡眠 5 秒后,在此顯示共享內(nèi)存段中的內(nèi)容(此時已經(jīng)是小寫字母)。實驗代碼:#include #include #include #define SHMKEY 208 /* 在實際實驗過程中, 為了避免每個同學(xué)建立的共享存儲區(qū)關(guān)鍵字一 樣而相互干擾,關(guān)鍵字請用學(xué)號末 3 位*/#define K 1024int shmid;main()int i;char *pint;char *addr;extern char * shmat ();extern cleanup ();for(i=0;i20;i+) signal(i,cleanup); shmid=shmget(SHMKEY,16*K,0777|IPC_CREAT); /* 建立 16K 共享區(qū) SHMKEY */ addr=shmat(shmid,0,0);/* 掛接,并得到共享區(qū)首地址 */printf (ad

溫馨提示

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

評論

0/150

提交評論