資源描述:
《實(shí)驗二,進(jìn)程通信,管道共享內(nèi)存》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、........操作系統(tǒng)實(shí)驗報告實(shí)驗二:進(jìn)程通信(一)——管道及共享內(nèi)存一、實(shí)驗?zāi)康摹ち私膺M(jìn)程之中相互通信的方式·加深對管道通信的了解·了解共享內(nèi)存通信的程序設(shè)計方法·了解和熟悉Linux支持的共享存儲區(qū)機(jī)制二、實(shí)驗內(nèi)容和步驟任務(wù)一、(1)閱讀以上父子進(jìn)程利用管道進(jìn)行通信的例子(例1),寫出程序的運(yùn)行結(jié)果并分析。(2)編寫程序:父進(jìn)程利用管道將一字符串交給子進(jìn)程處理。子進(jìn)程讀字符串,將里面的字符反向后再交給父進(jìn)程,父進(jìn)程最后讀取并打印反向的字符串任務(wù)二、1)閱讀例2的程序,運(yùn)行一次該程序,然后用ipcs命令查看系統(tǒng)中共享存儲區(qū)
2、的情況,再次執(zhí)行該程序,再用ipcs.專業(yè)學(xué)習(xí)資料.........命令查看系統(tǒng)中共享內(nèi)存的情況,對兩次的結(jié)果進(jìn)行比較,并分析原因。最后用ipcrm命令刪除自己建立的共享存儲區(qū)。(有關(guān)ipcs和ipcrm介紹見后面一頁)(2)每個同學(xué)登陸兩個窗口,先在一個窗口中運(yùn)行例3程序1(或者只登陸一個窗口,先在該窗口中以后臺方式運(yùn)行程序1),然后在另一個窗口中運(yùn)行例3程序2,觀察程序的運(yùn)行結(jié)果并分析。運(yùn)行結(jié)束后可以用ctrl+c結(jié)束程序1的運(yùn)行。(3)編寫程序:使用系統(tǒng)調(diào)用shmget(),shmat(),shmdt(),shmctl(
3、),編制程序。要求在父進(jìn)程中生成一個30字節(jié)長的私有共享內(nèi)存段。接下來,設(shè)置一個指向共享內(nèi)存段的字符指針,將一串大寫字母寫入到該指針指向的存貯區(qū)。調(diào)用fork()生成子進(jìn)程,讓子進(jìn)程共享內(nèi)存段中的內(nèi)容。接著,將大寫字母改成小寫,子進(jìn)顯示程修改共享內(nèi)存中的內(nèi)容。之后,子進(jìn)程將脫接共享內(nèi)存段并退出。父進(jìn)程在睡眠5秒后,在此顯示共享內(nèi)存段中的內(nèi)容(此時已經(jīng)是小寫字母)。一、代碼及運(yùn)行結(jié)果分析1.任務(wù)1(1)①代碼:#include#include#include#inc
4、lude#include.專業(yè)學(xué)習(xí)資料.........#includeintmain(){intx,fd[2];charbuf[30],s[30];pipe(fd);while((x=fork())==-1);if(x==0){close(fd[0]);printf("ChildProcess!");strcpy(buf,"Thisisanexample");write(fd[1],buf,30);exit(0);}else{close(fd[1]);p
5、rintf("ParentProcess!");read(fd[0],s,30);printf("%s",s);}}②截圖:.專業(yè)學(xué)習(xí)資料.........③結(jié)果和分析:創(chuàng)建一個管道,調(diào)用fork()函數(shù)產(chǎn)生兩個進(jìn)程,我的系統(tǒng)優(yōu)先先執(zhí)行父進(jìn)程,比較疑惑,既然這樣,管道中并沒有數(shù)據(jù)是如何得出最后結(jié)果的,后來百度了一下解釋說是因為管道本身是一種同步機(jī)制,并且printf執(zhí)行的時間要比其他程序時間長得多,才會這樣。然后執(zhí)行子程序,將數(shù)據(jù)寫入管道,然后父程序打印出來2.任務(wù)1(2)①代碼:#include#i
6、nclude#include#include#include.專業(yè)學(xué)習(xí)資料.........#includevoidfanzhuan(char*s){char*p=s+strlen(s)-1;chartemp;while(s7、example");pipe(fd);write(fd[1],buf,20);while((x=fork())==-1);if(x==0){printf("ChildProcess!");read(fd[0],s,20);.專業(yè)學(xué)習(xí)資料.........//printf("%s",s);fanzhuan(s);write(fd[1],s,20);exit(0);}else{wait(NULL);close(fd[1]);printf("ParentProcess!");read(fd[0],m,20);prin
8、tf("%s",m);}}②截圖:.專業(yè)學(xué)習(xí)資料.........3.任務(wù)2(1)①代碼:#include#include#include#include#include