資源描述:
《實(shí)驗(yàn)三、進(jìn)程通信(一)----------——管道及共享內(nèi)存.doc》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、操作系統(tǒng)實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)三、進(jìn)程通信(一)——管道及共享內(nèi)存一、實(shí)驗(yàn)?zāi)康?)加深對(duì)管道通信的了解2)掌握利用管道進(jìn)行通信的程序設(shè)計(jì)3)了解共享內(nèi)存通信的程序設(shè)計(jì)方法4)了解和熟悉Linux支持的共享存儲(chǔ)區(qū)機(jī)制二、實(shí)驗(yàn)內(nèi)容任務(wù)一、(1)閱讀以上父子進(jìn)程利用管道進(jìn)行通信的例子(例1),寫(xiě)出程序的運(yùn)行結(jié)果并分析。(2)編寫(xiě)程序:父進(jìn)程利用管道將一字符串交給子進(jìn)程處理。子進(jìn)程讀字符串,將里面的字符反向后再交給父進(jìn)程,父進(jìn)程最后讀取并打印反向的字符串。任務(wù)二、(1)閱讀例2的程序,運(yùn)行一次該程序,然后用ipcs命令查看系統(tǒng)中共享存儲(chǔ)區(qū)的情況,再次執(zhí)行該程序,再用ipcs命令查看系統(tǒng)中共享內(nèi)存的情況,
2、對(duì)兩次的結(jié)果進(jìn)行比較,并分析原因。最后用ipcrm命令刪除自己建立的共享存儲(chǔ)區(qū)。(有關(guān)ipcs和ipcrm介紹見(jiàn)后面一頁(yè))(2)每個(gè)同學(xué)登陸兩個(gè)窗口,先在一個(gè)窗口中運(yùn)行例3程序1(或者只登陸一個(gè)窗口,先在該窗口中以后臺(tái)方式運(yùn)行程序1),然后在另一個(gè)窗口中運(yùn)行例3程序2,觀察程序的運(yùn)行結(jié)果并分析。運(yùn)行結(jié)束后可以用ctrl+c結(jié)束程序1的運(yùn)行。(3)編寫(xiě)程序:使用系統(tǒng)調(diào)用shmget(),shmat(),shmdt(),shmctl(),編制程序。要求在父進(jìn)程中生成一個(gè)30字節(jié)長(zhǎng)的私有共享內(nèi)存段。接下來(lái),設(shè)置一個(gè)指向共享內(nèi)存段的字符指針,將一串大寫(xiě)字母寫(xiě)入到該指針指向的存貯區(qū)。調(diào)用fork
3、()生成子進(jìn)程,讓子進(jìn)程顯示共享內(nèi)存段中的內(nèi)容。接著,將大寫(xiě)字母改成小寫(xiě),子進(jìn)程修改共享內(nèi)存中的內(nèi)容。之后,子進(jìn)程將脫接共享內(nèi)存段并退出。父進(jìn)程在睡眠5秒后,在此顯示共享內(nèi)存段中的內(nèi)容(此時(shí)已經(jīng)是小寫(xiě)字母)。三、代碼及運(yùn)行結(jié)果分析(1)閱讀以上父子進(jìn)程利用管道進(jìn)行通信的例子(例1),寫(xiě)出程序的運(yùn)行結(jié)果并分析實(shí)驗(yàn)代碼:#includemain(){intx,fd[2];charbuf[30],s[30];pipe(fd);while((x=fork())==-1);if(x==0){close(fd[0]);printf("ChildProcess!");strcp
4、y(buf,"Thisisanexample");write(fd[1],buf,30);exit(0);}else{close(fd[1]);printf("ParentProcess!");read(fd[0],s,30);printf("%s",s);}}運(yùn)行結(jié)果:分析:調(diào)用pipe(fd);創(chuàng)建一個(gè)管道后,接著調(diào)用fork()函數(shù)產(chǎn)生兩個(gè)進(jìn)程,首先開(kāi)始執(zhí)行子進(jìn)程,關(guān)閉管道出口,通過(guò)管道入口向管道中寫(xiě)入內(nèi)容。執(zhí)行if語(yǔ)句后,進(jìn)入else語(yǔ)句塊內(nèi)開(kāi)始父進(jìn)程,管道入口關(guān)閉,通過(guò)管道出口端從管道中讀取之前寫(xiě)入內(nèi)容,最后輸出出來(lái)(1)編寫(xiě)程序:父進(jìn)程利用管道將一字符串交給子進(jìn)
5、程處理。子進(jìn)程讀字符串,將里面的字符反向后再交給父進(jìn)程,父進(jìn)程最后讀取并打印反向的字符串。實(shí)驗(yàn)代碼:#includemain(){intx,count,left,right,temp,fd[2],fe[2];charc,buf[30],s[30];pipe(fd);pipe(fe);printf("pleaseinputalineofchar");scanf("%s",buf);while((x=fork())==-1);if(x==0){close(fd[0]);close(fe[1]);printf("ChildProcess!");write(fd[1],b
6、uf,30);read(fe[0],buf,30);printf("%s",buf);exit(0);}else{close(fd[1]);close(fe[0]);count=0;do{read(fd[0],&c,1);s[count++]=c;}while(c!='