操作系統(tǒng)-管道通信課程設(shè)計(jì)_第1頁(yè)
操作系統(tǒng)-管道通信課程設(shè)計(jì)_第2頁(yè)
操作系統(tǒng)-管道通信課程設(shè)計(jì)_第3頁(yè)
操作系統(tǒng)-管道通信課程設(shè)計(jì)_第4頁(yè)
操作系統(tǒng)-管道通信課程設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩12頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

《計(jì)算機(jī)操作系統(tǒng)》課程設(shè)計(jì)報(bào)告課程名稱:操作系統(tǒng)設(shè)計(jì)題目:管道通信指導(dǎo)教師:*******班級(jí):*******學(xué)號(hào):*****學(xué)生姓名:***同組人員:*******************成績(jī):成績(jī):評(píng)語(yǔ):計(jì)算機(jī)科學(xué)與工程學(xué)院2014年6月19日前言:Linux操作系統(tǒng)就是一個(gè)向用戶開(kāi)放源碼得免費(fèi)得類UNIX操作系統(tǒng)。它為在校學(xué)生學(xué)習(xí)操作系統(tǒng)課程提供了一個(gè)瞧得見(jiàn)摸得著得范例。對(duì)于學(xué)生正確理解,掌握操作系統(tǒng)得基本知識(shí)具有重要意義。鑒于此,本操作系統(tǒng)課程涉及得實(shí)驗(yàn)均在Linux環(huán)境下進(jìn)行。這就要求大家:(1)熟悉Linux得操作與開(kāi)發(fā)環(huán)境;(2)具有C語(yǔ)言知識(shí)(Linux操作系統(tǒng)大約90%得源碼就是用C語(yǔ)言編寫(xiě))。我們得設(shè)計(jì)與實(shí)驗(yàn)將在Windowsxp環(huán)境下,基于虛擬機(jī)軟件VMWare軟件進(jìn)行安裝。學(xué)習(xí)計(jì)算機(jī)軟件技術(shù),特別就是計(jì)算機(jī)操作系統(tǒng)技術(shù),除了需要刻苦努力外,還需要掌握軟件與操作系統(tǒng)得原理與設(shè)計(jì)技巧。如何學(xué)習(xí)與掌握操作系統(tǒng)技術(shù)得原理與實(shí)際技巧呢?除了聽(tīng)課與讀書(shū)之外,最好得方法恐怕就就是在實(shí)踐中練習(xí)。例如,自己設(shè)計(jì)一個(gè)小型操作系統(tǒng),多使用操作系統(tǒng),多閱讀與分析操作源代碼等。但由于我們得條件與學(xué)時(shí)有限,在理論學(xué)習(xí)過(guò)程中沒(méi)有給同學(xué)們提供更多得實(shí)驗(yàn)機(jī)會(huì).管道通信,通過(guò)在兩個(gè)進(jìn)程間創(chuàng)建通道,一個(gè)寫(xiě)信息通過(guò)通道傳送給另一個(gè)進(jìn)程并且讀出來(lái),同過(guò)實(shí)踐讓我們了解了什么就是管道通信機(jī)制,實(shí)現(xiàn)了程序進(jìn)程間得通信.積極通過(guò)合作,完成任務(wù)。目錄TOC\o”1-3"\h\z\uHYPERLINK\l_Toc2301第一章:系統(tǒng)環(huán)境 PAGEREF_Toc23014HYPERLINK\l_Toc73101、1硬件環(huán)境 PAGEREF_Toc73104HYPERLINK\l_Toc316471、2軟件環(huán)境?PAGEREF_Toc316474HYPERLINK\l_Toc22541第二章:設(shè)計(jì)目得 PAGEREF_Toc225414HYPERLINK\l_Toc16656第三章:總體設(shè)計(jì) PAGEREF_Toc166565HYPERLINK\l_Toc24493、1程序設(shè)計(jì)組成框圖?PAGEREF_Toc24495HYPERLINK\l_Toc271683、2流程圖?PAGEREF_Toc271686HYPERLINK\l_Toc31123、2、1匿名管道通信C/S流程圖?PAGEREF_Toc31126HYPERLINK\l_Toc176983、2、2命名管道通信C/S流程圖?986HYPERLINK\l_Toc15984第四章:詳細(xì)設(shè)計(jì)?PAGEREF_Toc159848HYPERLINK\l_Toc85804、1匿名管道通信 PAGEREF_Toc85808HYPERLINK\l_Toc85804、2命名管道通信?10HYPERLINK\l_Toc6206第五章:調(diào)試與測(cè)試 13HYPERLINK\l_Toc28002第六章:設(shè)計(jì)中遇到得問(wèn)題及解決方法?15HYPERLINK\l_Toc13935第七章:源程序清單與執(zhí)行結(jié)果及分析?PAGEREF_Toc1393516HYPERLINK\l_Toc25742第八章:總結(jié) 20HYPERLINK\l_Toc22097第九章:參考文獻(xiàn)?PAGEREF_Toc2209720:系統(tǒng)環(huán)境1、1硬件環(huán)境Intel(R)Core?2DuoCPUE75002、93GHz2、00GB內(nèi)存1、2軟件環(huán)境1)MicrosoftWindowsXPProfessional版本2002ServicePack32)VmwareWorkstat(yī)ion10、0、1build—13797763)RedHatLinux9:設(shè)計(jì)目得實(shí)踐操作系統(tǒng)原理知識(shí),根據(jù)題目要求設(shè)計(jì)、實(shí)現(xiàn)進(jìn)程得管道通信,并且在虛擬機(jī)中模擬得linux系統(tǒng)中運(yùn)行檢測(cè)。:總體設(shè)計(jì)3、1程序設(shè)計(jì)組成框圖無(wú)名管道讀寫(xiě)示意圖命名管道操作示意圖3、2流程圖3、2、1匿名管道通信C/S流程圖3、2、2命名管道通信C/S流程圖FIFO寫(xiě)進(jìn)程::詳細(xì)設(shè)計(jì)4、1匿名管道通信管道用于不同進(jìn)程間通信。通常先創(chuàng)建一個(gè)管道,再通過(guò)fork函數(shù)創(chuàng)建一個(gè)子進(jìn)程,該子進(jìn)程會(huì)繼承父進(jìn)程創(chuàng)建得管道。注意事項(xiàng):必須在系統(tǒng)調(diào)用fork()前調(diào)用pipe(),否則子進(jìn)程將不會(huì)繼承文件描述符。否則,會(huì)創(chuàng)建兩個(gè)管道,因?yàn)楦缸舆M(jìn)程共享同一段代碼段,都會(huì)各自調(diào)用pipe(),即建立兩個(gè)管道,出現(xiàn)異常錯(cuò)誤。1、fork()創(chuàng)建一個(gè)新進(jìn)程.用法: intfork()其中返回int取值意義如下:0:創(chuàng)建子進(jìn)程,從子進(jìn)程返回得id值〉0:從父進(jìn)程返回得子進(jìn)程id值—1:創(chuàng)建失?。?、lockf()用作鎖定文件得某些段或者整個(gè)文件.頭文件:#include?<unistd、h>參數(shù)定義:intlockf();int;longsize;其中:files就是文件描述符;function就是鎖定與解鎖;1表示鎖定;0表示解鎖;Size就是鎖定或解鎖得字節(jié)數(shù),若用0,表示從文件得當(dāng)前位置到文件尾。3、read功能:從描述符為得文件讀信息。用法:#include<unistd、h>ssize_t read(int,void*buff,size_tnbytes);返回:讀到得字節(jié)數(shù),若已到文件尾為0,若出錯(cuò)為-1。在UNIX/Linux可重定義為:int?read(intfd,char*buff,unsignednbytes);4、write功能:向已打開(kāi)得文件寫(xiě)數(shù)據(jù).用法:#include<unistd、h〉ssize_twrite(int,constvoid*buff,size_tnbytes);返回值:若成功為已寫(xiě)入得字節(jié)數(shù);出錯(cuò)為-1.int?write(intfd,char*buff,unsignednbytes);文件位置指針文件位置指針:每個(gè)打開(kāi)文件都有一個(gè)與其相關(guān)聯(lián)得“當(dāng)前位移量”.就是從文件開(kāi)始處計(jì)算得字節(jié)數(shù).通常,讀、寫(xiě)操作都從當(dāng)前文件位置處開(kāi)始,并使位移量增加所讀或?qū)懙米止?jié)數(shù)。按系統(tǒng)默認(rèn),當(dāng)打開(kāi)一個(gè)文件時(shí),除非指定O_APPEND選擇項(xiàng),否則該位移量被設(shè)置為0,即指向文件得開(kāi)始處。文件位置指針可以通過(guò)系統(tǒng)調(diào)用lsee(cuò)k來(lái)移動(dòng).#include〈unistd、h〉#include〈sys/types、h>#include〈errno、h〉#include〈stdio、h〉#include<string、h〉#include〈stdlib、h〉/**程序入口**/intmain(){intpipe_fd[2];pid_tpid;charbuf_r[100];char*p_wbuf;intr_num;memset(buf_r,0,sizeof(buf_r));//對(duì)較大得HYPERLINK"”結(jié)構(gòu)體或HYPERLINK""數(shù)組進(jìn)行清零操作得一種最快方法/*創(chuàng)建管道*/if(pipe(pipe_fd)<0){printf(”pipecreat(yī)eerror\n");return—1;}/*?jiǎng)?chuàng)建子進(jìn)程*/if((pid=fork())==0)//子進(jìn)程執(zhí)行序列{printf("\n”);close(pipe_fd[1]);//子進(jìn)程先關(guān)閉了管道得寫(xiě)端sleep(2);/*讓父進(jìn)程先運(yùn)行,這樣父進(jìn)程先寫(xiě)子進(jìn)程才有內(nèi)容讀*/if((r_num=read(pipe_fd[0],buf_r,100))>0){printf(”%dnumbersreadfromthepipeis%s\n",r_num,buf_r);}close(pipe_fd[0]);exit(0);}elseif(pid>0)//父進(jìn)程執(zhí)行序列{close(pipe_fd[0]);//父進(jìn)程先關(guān)閉了管道得讀端if(write(pipe_fd[1],"Hello",5)!=—1)printf("parentwrite1Hello!\n”);if(write(pipe_fd[1],"Pipe”,5)!=—1)printf(”parentwrite2Pipe!\n");close(pipe_fd[1]);waitpid(pid,NULL,0);/*等待子進(jìn)程結(jié)束*/exit(0);}return0;}4、2命名管道通信

命名管道:命名管道與無(wú)名管道基本相同,但也有不同點(diǎn):無(wú)名管道只能有父進(jìn)程使用;但就是通過(guò)命名管道,不相關(guān)得進(jìn)程也能交換數(shù)據(jù)。1、創(chuàng)建用mkfifo或mknod創(chuàng)建一個(gè)命名管道。以mkfifo為例:?#include?<sys/types、h>?#include <sys/stat、h>?intmkfifo(constchar*fifo_name,mode_tmode); ?//成功返回0,否則為—12、使用 管道一經(jīng)創(chuàng)建,就可向普通文件一樣使用.可通過(guò)系統(tǒng)調(diào)用open,close,read,write,unlink等進(jìn)行操作。FIFO讀進(jìn)程:#include<sys/types、h>#include〈sys/stat、h>#include<errno、h〉#include<fcntl、h>#include<stdio、h>#include〈stdlib、h〉#include<string、h>#defineFIFO"myfifo"/*程序入口*/intmain(intargc,char**argv){charbuf_r[100];intfd;intnread;printf(”P(pán)reparingforreadingbytes、、、\n");memset(buf_r,0,sizeof(buf_r));/*打開(kāi)管道*/fd=open(FIFO,O_RDONLY|(zhì)O_NONBLOCK,0);if(fd==-1){perror("open");exit(1);}while(1){memset(buf_r,0,sizeof(buf_r));if((nread=read(fd,buf_r,100))==-1){if(errno==EAGAIN)printf(”nodatayet\n”);}printf("read%sfromFIFO\n",buf_r);sleep(1);}/*后面三句話就是不會(huì)被運(yùn)行到得,但不會(huì)影響程序運(yùn)行得效果當(dāng)程序在上面得死循環(huán)中執(zhí)行時(shí)收到信號(hào)后會(huì)馬上結(jié)束運(yùn)行而沒(méi)有執(zhí)行后面得三句話。*/close(fd);//關(guān)閉管道pause();//暫停,等待信號(hào)unlink(FIFO);//刪除文件}FIFO寫(xiě)進(jìn)程:#include<sys/types、h〉#include<sys/stat、h>#include〈errno、h>#include<fcntl、h>#include〈stdio、h〉#include<stdlib、h〉#include<string、h>#defineFIFO_SERVER"myfifo”/**程序入口**/intmain(intargc,char**argv){intfd;charw_buf[100];intnwrite;/*?jiǎng)?chuàng)建有名管道*/if((mkfifo(FIFO_SERVER,O_CREAT|O_EXCL|O_RDWR)<0)&&(errno!=EEXIST)){printf("cannotcreatefifoserver\n");}/*打開(kāi)管道*/fd=open(FIFO_SERVER,O_WRONLY|O_NONBLOCK,0);if(fd==-1){perror("open");exit(1);}/*入?yún)z測(cè)*/if(argc==1){printf("Pleasesendsomething\n");exit(—1);}strcpy(w_buf,argv[1]);/*向管道寫(xiě)入數(shù)據(jù)*/if((nwrite=write(fd,w_buf,100))==-1){if(errno==EAGAIN)printf(”TheFIFOhasnotbeenreadyet、Pleasetrylater\n");}else{printf("write%stotheFIFO\n”,w_buf);}close(fd);//關(guān)閉管道return0;}:調(diào)試與測(cè)試運(yùn)行匿名管道通信以及運(yùn)行命名管道通信讀進(jìn)程結(jié)果如下:打開(kāi)另外一個(gè)終端,運(yùn)行寫(xiě)進(jìn)程結(jié)果如下:同時(shí)讀進(jìn)程結(jié)果發(fā)生變化如下::設(shè)計(jì)中遇到得問(wèn)題及解決方法1、由于課程涉及UNIX管道通信模式較少,剛開(kāi)始做課程設(shè)計(jì)時(shí)感覺(jué)無(wú)從下手,后來(lái)通過(guò)瞧書(shū)以及上網(wǎng)查詢相關(guān)資料有些頭緒。2、對(duì)于虛擬機(jī)與主機(jī)得交互搞了好久但就是最后結(jié)果不理想,也沒(méi)搞成功,試了用ftp方式相互連接,以及通過(guò)VMwareTools也沒(méi)有成功。后來(lái),通過(guò)問(wèn)學(xué)長(zhǎng)與同學(xué)終于解決了。通過(guò)此事,我知道知識(shí)自己主動(dòng)探索實(shí)踐固然好,但學(xué)習(xí)她人已有得經(jīng)驗(yàn)學(xué)得知識(shí)更多更快。3、對(duì)于C語(yǔ)言中open、write等函數(shù)掌握得并不好,這就是由于長(zhǎng)期不聯(lián)系C語(yǔ)言所致,一門語(yǔ)言要想精通必須通過(guò)不斷得聯(lián)系才行。:源程序清單與執(zhí)行結(jié)果及分析任務(wù)1:匿名管道通信#include<unistd、h〉#include〈sys/types、h>#include〈errno、h〉#include〈stdio、h>#include〈string、h〉#include<stdlib、h>/**程序入口**/intmain(){intpipe_fd[2];pid_tpid;charbuf_r[100];char*p_wbuf;intr_num;memset(buf_r,0,sizeof(buf_r));/*創(chuàng)建管道*/if(pipe(pipe_fd)〈0){printf("pipecreat(yī)eerror\n”);return—1;}/*?jiǎng)?chuàng)建子進(jìn)程*/if((pid=fork())==0)//子進(jìn)程執(zhí)行序列{printf("\n");close(pipe_fd[1]);//子進(jìn)程先關(guān)閉了管道得寫(xiě)端slee(cuò)p(2);/*讓父進(jìn)程先運(yùn)行,這樣父進(jìn)程先寫(xiě)子進(jìn)程才有內(nèi)容讀*/if((r_num=read(pipe_fd[0],buf_r,100))〉0){printf(”%dnumbersreadfromthepipeis%s\n”,r_num,buf_r);}close(pipe_fd[0]);exit(0);}elseif(pid>0)//父進(jìn)程執(zhí)行序列{close(pipe_fd[0]);//父進(jìn)程先關(guān)閉了管道得讀端if(write(pipe_fd[1],”Hello”,5)!=—1)printf("parentwrite1Hello!\n”);if(write(pipe_fd[1],"Pipe",5)!=—1)printf("parentwrite2Pipe!\n");close(pipe_fd[1]);waitpid(pid,NULL,0);/*等待子進(jìn)程結(jié)束*/exit(0);}return0;}任務(wù)2:命名管道通信FIFO讀進(jìn)程:#include<sys/types、h>#include〈sys/stat(yī)、h〉#include<errno、h〉#include〈fcntl、h>#include<stdio、h>#include<stdlib、h〉#include<string、h>#defineFIFO”/tmp/myfifo”/*程序入口*/intmain(intargc,char**argv){charbuf_r[100];intfd;intnread;printf(”P(pán)reparingforreadingbytes、、、\n”);memset(buf_r,0,sizeof(buf_r));/*打開(kāi)管道*/fd=open(FIFO,O_RDONLY|O_NONBLOCK,0);if(fd==-1){perror(”open”);exit(1);}while(1){memset(buf_r,0,sizeof(buf_r));if((nread=read(fd,buf_r,100))==-1){if(errno==EAGAIN)printf("nodatayet\n");}printf(”read%sfromFIFO\n",buf_r);slee(cuò)p(1);}/*后面三句話就是不會(huì)被運(yùn)行到得,但不會(huì)影響程序運(yùn)行得效果當(dāng)程序在上面得死循環(huán)中執(zhí)行時(shí)收到信號(hào)后會(huì)馬上結(jié)束運(yùn)行而沒(méi)有執(zhí)行后面得三句話。*/close(fd);//關(guān)閉管道pause();//暫停,等待信號(hào)unlink(FIFO);//刪除文件}FIFO寫(xiě)進(jìn)程:#include<sys/types、h〉#include<sys/stat、h>#include<errno、h>#include〈fcntl、h>#include〈stdio、h>#include〈stdlib、h>#include〈string、h〉#defineFIFO_SERVER”/tmp/myfifo"/**程序入口**/intmain(intargc,char**argv){intfd;charw_buf[100];intnwrite;/*創(chuàng)建有名管道*/if((mkfifo(FIFO_SERVER,O_CREAT|O_EXCL|O_RDWR)<0)&&(errno?。剑臙XIST)){

溫馨提示

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

評(píng)論

0/150

提交評(píng)論