版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 《計算機操作系統(tǒng)》課程設計報告</p><p> 課程名稱: 操作系統(tǒng) </p><p> 設計題目: 管道通信 </p><p> 指導教師: ******* </p><
2、;p> 班 級: ******* </p><p> 學 號: ***** </p><p> 學生姓名: *** </p><p> 同組人員: ******************* </p>
3、<p> 計算機科學與工程學院</p><p> 2014年6月19 日</p><p><b> 前言:</b></p><p> Linux操作系統(tǒng)是一個向用戶開放源碼的免費的類UNIX操作系統(tǒng)。它為在校學生學習操作系統(tǒng)課程提供了一個看得見摸得著的范例。對于學生正確理解,掌握操作系統(tǒng)的基本知識具有重要意義。鑒于此,本操作系
4、統(tǒng)課程涉及的實驗均在Linux環(huán)境下進行。</p><p><b> 這就要求大家:</b></p><p> (1)熟悉Linux的操作和開發(fā)環(huán)境;</p><p> (2)具有C語言知識(Linux操作系統(tǒng)大約90%的源碼是用C語言編寫)。</p><p> 我們的設計和實驗將在Windows xp環(huán)境下,基
5、于虛擬機軟件VMWare軟件進行安裝。</p><p> 學習計算機軟件技術,特別是計算機操作系統(tǒng)技術,除了需要刻苦努力外,還需要掌握軟件和操作系統(tǒng)的原理與設計技巧。如何學習和掌握操作系統(tǒng)技術的原理與實際技巧呢?除了聽課和讀書之外,最好的方法恐怕就是在實踐中練習。例如,自己設計一個小型操作系統(tǒng),多使用操作系統(tǒng),多閱讀和分析操作源代碼等。但由于我們的條件和學時有限,在理論學習過程中沒有給同學們提供更多的實驗機會。
6、</p><p> 管道通信,通過在兩個進程間創(chuàng)建通道,一個寫信息通過通道傳送給另一個進程并且讀出來,同過實踐讓我們了解了什么是管道通信機制,實現了程序進程間的通信。積極通過合作,完成任務。</p><p><b> 目 錄</b></p><p> 第一章 :系統(tǒng)環(huán)境4</p><p><b>
7、 1.1硬件環(huán)境4</b></p><p><b> 1.2軟件環(huán)境4</b></p><p> 第二章 :設計目的4</p><p> 第三章 :總體設計5</p><p> 3.1程序設計組成框圖5</p><p><b> 3.2流程圖6<
8、/b></p><p> 3.2.1匿名管道通信C/S流程圖6</p><p> 3.2.2命名管道通信C/S流程圖6</p><p> 第四章 :詳細設計8</p><p> 4.1匿名管道通信8</p><p> 4.2命名管道通信10</p><p> 第五章
9、:調試與測試13</p><p> 第六章 :設計中遇到的問題及解決方法15</p><p> 第七章 :源程序清單和執(zhí)行結果及分析16</p><p> 第八章 :總結20</p><p> 第九章 :參考文獻20</p><p><b> :系統(tǒng)環(huán)境</b></p&g
10、t;<p><b> 1.1硬件環(huán)境</b></p><p> Intel(R)Core?2 Duo CPU E7500 @2.93GHz 2.00GB內存</p><p><b> 1.2軟件環(huán)境</b></p><p> 1)Microsoft Windows XP Professional 版
11、本2002 Service Pack 3</p><p> 2)Vmware Workstation 10.0.1 build-1379776</p><p> 3)Red Hat Linux 9</p><p><b> ?。涸O計目的</b></p><p> 實踐操作系統(tǒng)原理知識,根據題目要求設計、實現進程的管
12、道通信,并且在虛擬機中模擬的linux系統(tǒng)中運行檢測。</p><p><b> :總體設計</b></p><p> 3.1程序設計組成框圖</p><p><b> 無名管道讀寫示意圖</b></p><p><b> 命名管道操作示意圖</b></p>
13、<p><b> 3.2流程圖</b></p><p> 3.2.1匿名管道通信C/S流程圖</p><p> 3.2.2命名管道通信C/S流程圖</p><p><b> FIFO寫進程:</b></p><p><b> ?。涸敿氃O計</b></
14、p><p><b> 4.1匿名管道通信</b></p><p> 管道用于不同進程間通信。通常先創(chuàng)建一個管道,再通過fork函數創(chuàng)建一個子進程,該子進程會繼承父進程創(chuàng)建的管道。注意事項:必須在系統(tǒng)調用fork()前調用pipe(),否則子進程將不會繼承文件描述符。否則,會創(chuàng)建兩個管道,因為父子進程共享同一段代碼段,都會各自調用pipe(),即建立兩個管道,出現異常錯
15、誤。 父進程通過管道向服務器發(fā)布命令,然后由服務器執(zhí)行命令。</p><p><b> 1.fork()</b></p><p><b> 創(chuàng)建一個新進程。</b></p><p> 用法:int fork()</p><p> 其中返回int取值意義如下:</p><
16、p> 0:創(chuàng)建子進程,從子進程返回的id值</p><p> >0:從父進程返回的子進程id值</p><p><b> -1:創(chuàng)建失敗</b></p><p> 2.lockf(files,function,size)</p><p> 用作鎖定文件的某些段或者整個文件。</p>&
17、lt;p><b> 頭文件:</b></p><p> #include<unistd.h></p><p><b> 參數定義:</b></p><p> int lockf(files,function,size);</p><p> int files,funct
18、ion;</p><p> long size;</p><p> 其中:files是文件描述符;function是鎖定和解鎖;1表示鎖定;0表示解鎖;Size是鎖定或解鎖的字節(jié)數,若用0,表示從文件的當前位置到文件尾。</p><p><b> 3.read</b></p><p> 功能:從描述符為filed
19、es的文件讀信息。</p><p><b> 用法:</b></p><p> #include <unistd.h></p><p> ssize_tread(int filedes, void *buff, size_t nbytes) ;</p><p> 返回:讀到的字節(jié)數,若已到文件尾為0
20、,若出錯為-1。</p><p> 在UNIX/Linux 可重定義為: </p><p> intread(int fd, char *buff, unsigned nbytes) ;</p><p><b> 4.write</b></p><p> 功能:向已打開的文件寫數據。</p>
21、<p><b> 用法:</b></p><p> #include <unistd.h></p><p> ssize_t write(int filedes, const void * buff, size_t nbytes) ;</p><p> 返回值:若成功為已寫入的字節(jié)數;出錯為-1。</p&g
22、t;<p> intwrite(int fd, char *buff, unsigned nbytes) ;</p><p><b> 文件位置指針</b></p><p> 文件位置指針:每個打開文件都有一個與其相關聯的“當前位移量”。是從文件開始處計算的字節(jié)數。通常,讀、寫操作都從當前文件位置處開始,并使位移量增加所讀或寫的字節(jié)數。&l
23、t;/p><p> 按系統(tǒng)默認,當打開一個文件時,除非指定O_APPEND選擇項,否則該位移量被設置為0,即指向文件的開始處。</p><p> 文件位置指針可以通過系統(tǒng)調用lseek來移動。</p><p> #include <unistd.h> </p><p> #include <sys/types.h>
24、; </p><p> #include <errno.h> </p><p> #include <stdio.h> </p><p> #include <string.h> </p><p> #include <stdlib.h> </p><p&g
25、t;<b> /* </b></p><p><b> * 程序入口 </b></p><p><b> * */ </b></p><p> int main() </p><p><b> { </b></p><p
26、> int pipe_fd[2]; </p><p> pid_t pid; </p><p> char buf_r[100]; </p><p> char* p_wbuf; </p><p> int r_num; </p><p> memset(buf_r,0,sizeof(buf
27、_r)); //對較大的結構體或數組進行清零操作的一種最快方法</p><p> /*創(chuàng)建管道*/ </p><p> if(pipe(pipe_fd)<0) </p><p><b> { </b></p><p> printf("pipe create error\n");
28、 </p><p> return -1; </p><p><b> } </b></p><p> /*創(chuàng)建子進程*/ </p><p> if((pid=fork())==0) //子進程執(zhí)行序列 </p><p><b> { </b><
29、/p><p> printf("\n"); </p><p> close(pipe_fd[1]);//子進程先關閉了管道的寫端 </p><p> sleep(2); /*讓父進程先運行,這樣父進程先寫子進程才有內容讀*/ </p><p> if((r_num=read(pipe_fd[0],buf_r,10
30、0))>0) </p><p><b> { </b></p><p> printf("%d numbers read from the pipe is %s\n",r_num,buf_r); </p><p><b> } </b></p><p>
31、 close(pipe_fd[0]); </p><p> exit(0); </p><p><b> } </b></p><p> else if(pid>0) //父進程執(zhí)行序列 </p><p><b> { </b></p><p>
32、close(pipe_fd[0]); //父進程先關閉了管道的讀端 </p><p> if(write(pipe_fd[1],"Hello",5)!=-1) </p><p> printf("parent write1 Hello!\n"); </p><p> if(write(pipe_fd[1],&quo
33、t; Pipe",5)!=-1) </p><p> printf("parent write2 Pipe!\n"); </p><p> close(pipe_fd[1]); </p><p> waitpid(pid,NULL,0); /*等待子進程結束*/ </p><p> exit(0)
34、; </p><p><b> } </b></p><p> return 0; </p><p><b> }</b></p><p> 4.2命名管道通信命名管道 :</p><p> 命名管道和無名管道基本相同,但也有不同點:無名管道只能有父進程使用
35、;但是通過命名管道,不相關的進程也能交換數據??蛻魴C實現數據的發(fā)送,服務器實現數據接收。</p><p><b> 1.創(chuàng)建</b></p><p> 用mkfifo或mknod創(chuàng)建一個命名管道。以mkfifo為例:</p><p> #include<sys/types.h></p><p> #
36、include<sys/stat.h></p><p> int mkfifo(const char *fifo_name, mode_t mode);//成功返回0,否則為-1</p><p><b> 2、使用</b></p><p> 管道一經創(chuàng)建,就可向普通文件一樣使用??赏ㄟ^系統(tǒng)調用open,close,rea
37、d,write,unlink等進行操作。</p><p><b> FIFO讀進程:</b></p><p> #include <sys/types.h> </p><p> #include <sys/stat.h> </p><p> #include <errno.h&g
38、t; </p><p> #include <fcntl.h> </p><p> #include <stdio.h> </p><p> #include <stdlib.h> </p><p> #include <string.h> </p><p&
39、gt; #define FIFO "myfifo" </p><p><b> /*程序入口*/</b></p><p> int main(int argc,char** argv) </p><p><b> { </b></p><p> char buf_
40、r[100]; </p><p> int fd; </p><p> int nread; </p><p> printf("Preparing for reading bytes...\n"); </p><p> memset(buf_r,0,sizeof(buf_r)); </p>
41、;<p><b> /*打開管道*/ </b></p><p> fd=open(FIFO,O_RDONLY|O_NONBLOCK,0); </p><p> if(fd==-1) </p><p><b> { </b></p><p> perror("o
42、pen"); </p><p> exit(1); </p><p><b> } </b></p><p> while(1) </p><p><b> { </b></p><p> memset(buf_r,0,sizeof(bu
43、f_r)); </p><p> if((nread=read(fd,buf_r,100))==-1) </p><p><b> { </b></p><p> if(errno==EAGAIN) </p><p> printf("no data yet\n"); </p&
44、gt;<p><b> } </b></p><p> printf("read %s from FIFO\n",buf_r); </p><p> sleep(1); </p><p><b> } </b></p><p> /*后面三句話是
45、不會被運行到的,但不會影響程序運行的效果當程序在上面的死循環(huán)中執(zhí)行時收到信號后會馬上結束運行而沒有執(zhí)行后面的三句話。*/ </p><p> close(fd); //關閉管道</p><p> pause(); //暫停,等待信號</p><p> unlink(FIFO); //刪除文件 </p><p><b>
46、 } </b></p><p><b> FIFO寫進程:</b></p><p> #include <sys/types.h> </p><p> #include <sys/stat.h> </p><p> #include <errno.h> <
47、;/p><p> #include <fcntl.h> </p><p> #include <stdio.h> </p><p> #include <stdlib.h> </p><p> #include <string.h> </p><p> #d
48、efine FIFO_SERVER "myfifo" </p><p><b> /* </b></p><p><b> * 程序入口 </b></p><p><b> * */ </b></p><p> int main(int argc
49、,char** argv) </p><p><b> { </b></p><p><b> int fd; </b></p><p> char w_buf[100]; </p><p> int nwrite; </p><p> /*創(chuàng)建有名管道*
50、/ </p><p> if((mkfifo(FIFO_SERVER,O_CREAT|O_EXCL|O_RDWR)<0)&&(errno!=EEXIST)) </p><p><b> { </b></p><p> printf("cannot create fifoserver\n");
51、 </p><p><b> } </b></p><p> /*打開管道*/ </p><p> fd=open(FIFO_SERVER,O_WRONLY |O_NONBLOCK,0); </p><p> if(fd==-1) </p><p><b> { &
52、lt;/b></p><p> perror("open"); </p><p> exit(1); </p><p><b> } </b></p><p> /*入參檢測*/ </p><p> if(argc==1) </p>&l
53、t;p><b> { </b></p><p> printf("Please send something\n"); </p><p> exit(-1); </p><p><b> } </b></p><p> strcpy(w_buf,argv[
54、1]); </p><p> /* 向管道寫入數據 */ </p><p> if((nwrite=write(fd,w_buf,100))==-1) </p><p><b> { </b></p><p> if(errno==EAGAIN) </p><p> print
55、f("The FIFO has not been read yet.Please try later\n"); </p><p><b> } </b></p><p><b> else </b></p><p><b> { </b></p>&l
56、t;p> printf("write %s to the FIFO\n",w_buf); </p><p><b> } </b></p><p> close(fd); //關閉管道 </p><p> return 0; </p><p><b> } <
57、/b></p><p><b> ?。赫{試與測試</b></p><p> 運行匿名管道通信以及運行命名管道通信讀進程結果如下:</p><p> 打開另外一個終端,運行寫進程結果如下:</p><p> 同時讀進程結果發(fā)生變化如下:</p><p> ?。涸O計中遇到的問題及解決方法&
58、lt;/p><p> 1、 由于課程涉及UNIX管道通信模式較少,剛開始做課程設計時感覺無從下手,后來通過看書以及上網查詢相關資料有些頭緒。</p><p> 2、對于虛擬機與主機的交互搞了好久但是最后結果不理想,也沒搞成功,試了用ftp方式相互連接,以及通過VMware Tools也沒有成功。后來,通過問學長和同學終于解決了。通過此事,我知道知識自己主動探索實踐固然好,但學習他人已有的經
59、驗學的知識更多更快。</p><p> 3、對于C語言中open、write等函數掌握的并不好,這是由于長期不聯系C語言所致,一門語言要想精通必須通過不斷的聯系才行。</p><p> ?。涸闯绦蚯鍐魏蛨?zhí)行結果及分析</p><p> 任務1:匿名管道通信</p><p> #include <unistd.h> <
60、/p><p> #include <sys/types.h> </p><p> #include <errno.h> </p><p> #include <stdio.h> </p><p> #include <string.h> </p><p>
61、#include <stdlib.h> </p><p><b> /* </b></p><p><b> * 程序入口 </b></p><p><b> * */ </b></p><p> int main() </p><
62、p><b> { </b></p><p> int pipe_fd[2]; </p><p> pid_t pid; </p><p> char buf_r[100]; </p><p> char* p_wbuf; </p><p> int r_num; &l
63、t;/p><p> memset(buf_r,0,sizeof(buf_r)); </p><p> /*創(chuàng)建管道*/ </p><p> if(pipe(pipe_fd)<0) </p><p><b> { </b></p><p> printf("pipe c
64、reate error\n"); </p><p> return -1; </p><p><b> } </b></p><p> /*創(chuàng)建子進程*/ </p><p> if((pid=fork())==0) //子進程執(zhí)行序列 </p><p><b&g
65、t; { </b></p><p> printf("\n"); </p><p> close(pipe_fd[1]);//子進程先關閉了管道的寫端 </p><p> sleep(2); /*讓父進程先運行,這樣父進程先寫子進程才有內容讀*/ </p><p> if((r_num=rea
66、d(pipe_fd[0],buf_r,100))>0) </p><p><b> { </b></p><p> printf("%d numbers read from the pipe is %s\n",r_num,buf_r); </p><p><b> } </b>
67、</p><p> close(pipe_fd[0]); </p><p> exit(0); </p><p><b> } </b></p><p> else if(pid>0) //父進程執(zhí)行序列 </p><p><b> { </b>&l
68、t;/p><p> close(pipe_fd[0]); //父進程先關閉了管道的讀端 </p><p> if(write(pipe_fd[1],"Hello",5)!=-1) </p><p> printf("parent write1 Hello!\n"); </p><p> if(
69、write(pipe_fd[1]," Pipe",5)!=-1) </p><p> printf("parent write2 Pipe!\n"); </p><p> close(pipe_fd[1]); </p><p> waitpid(pid,NULL,0); /*等待子進程結束*/ </p>
70、;<p> exit(0); </p><p><b> } </b></p><p> return 0; </p><p><b> } </b></p><p> 任務2:命名管道通信</p><p><b> FIFO讀進程
71、:</b></p><p> #include <sys/types.h> </p><p> #include <sys/stat.h> </p><p> #include <errno.h> </p><p> #include <fcntl.h> </p
72、><p> #include <stdio.h> </p><p> #include <stdlib.h> </p><p> #include <string.h> </p><p> #define FIFO "/tmp/myfifo" </p><
73、p><b> /*程序入口*/</b></p><p> int main(int argc,char** argv) </p><p><b> { </b></p><p> char buf_r[100]; </p><p> int fd; </p>
74、<p> int nread; </p><p> printf("Preparing for reading bytes...\n"); </p><p> memset(buf_r,0,sizeof(buf_r)); </p><p><b> /*打開管道*/ </b></p>
75、<p> fd=open(FIFO,O_RDONLY|O_NONBLOCK,0); </p><p> if(fd==-1) </p><p><b> { </b></p><p> perror("open"); </p><p> exit(1); <
76、/p><p><b> } </b></p><p> while(1) </p><p><b> { </b></p><p> memset(buf_r,0,sizeof(buf_r)); </p><p> if((nread=read(fd,buf_r
77、,100))==-1) </p><p><b> { </b></p><p> if(errno==EAGAIN) </p><p> printf("no data yet\n"); </p><p><b> } </b></p><
78、p> printf("read %s from FIFO\n",buf_r); </p><p> sleep(1); </p><p><b> } </b></p><p> /*后面三句話是不會被運行到的,但不會影響程序運行的效果當程序在上面的死循環(huán)中執(zhí)行時收到信號后會馬上結束運行而沒有執(zhí)行后面的
79、三句話。*/ </p><p> close(fd); //關閉管道</p><p> pause(); //暫停,等待信號</p><p> unlink(FIFO); //刪除文件 </p><p><b> } </b></p><p><b> FIFO寫進程:&
80、lt;/b></p><p> #include <sys/types.h> </p><p> #include <sys/stat.h> </p><p> #include <errno.h> </p><p> #include <fcntl.h> </p&g
81、t;<p> #include <stdio.h> </p><p> #include <stdlib.h> </p><p> #include <string.h> </p><p> #define FIFO_SERVER "/tmp/myfifo" </p>
82、<p><b> /* </b></p><p><b> * 程序入口 </b></p><p><b> * */ </b></p><p> int main(int argc,char** argv) </p><p><b> {
83、 </b></p><p><b> int fd; </b></p><p> char w_buf[100]; </p><p> int nwrite; </p><p> /*創(chuàng)建有名管道*/ </p><p> if((mkfifo(FIFO_SERVER,
84、O_CREAT|O_EXCL|O_RDWR)<0)&&(errno!=EEXIST)) </p><p><b> { </b></p><p> printf("cannot create fifoserver\n"); </p><p><b> } </b>&l
85、t;/p><p> /*打開管道*/ </p><p> fd=open(FIFO_SERVER,O_WRONLY |O_NONBLOCK,0); </p><p> if(fd==-1) </p><p><b> { </b></p><p> perror("open
86、"); </p><p> exit(1); </p><p><b> } </b></p><p> /*入參檢測*/ </p><p> if(argc==1) </p><p><b> { </b></p><p&
87、gt; printf("Please send something\n"); </p><p> exit(-1); </p><p><b> } </b></p><p> strcpy(w_buf,argv[1]); </p><p> /* 向管道寫入數據 */ </
88、p><p> if((nwrite=write(fd,w_buf,100))==-1) </p><p><b> { </b></p><p> if(errno==EAGAIN) </p><p> printf("The FIFO has not been read yet.Please try
89、 later\n"); </p><p><b> } </b></p><p><b> else </b></p><p><b> { </b></p><p> printf("write %s to the FIFO\n"
90、;,w_buf); </p><p><b> } </b></p><p> close(fd); //關閉管道 </p><p> return 0; </p><p><b> } </b></p><p><b> :總結</b&g
91、t;</p><p> 此次課程設計—管道通信,讓我實實在在地鍛煉了自己的動手能力,基本操作以熟練掌握。設計中地任務一比較簡單,只是設計一個程序實現管道通信,通過查資料可以順利完成;但是任務二—命名管道設計,涉及到了頭文件、服務器程序和客戶端程序,三者要在同一臺計算機中,兩個不同的終端上實現通信。服務器程序設計操作中沒有出現什么問題,但是在連接客戶端程序時,客戶端程序出錯,編譯出現錯誤,導致通信出現錯誤。通過向
92、老師請教和同學詢問,基本有些了解,但還是出現一些解決不了的問題,還需要多加聯系然后多查資料,認真克服困難。</p><p> 通過這次課程設計,我感覺到了,編程還是很有趣的一件事情,這次設計充分鍛煉了我的動手能力,思維能力,設計能力,更重要的是合作精神,大家基礎都有點差,但可以主動找不足,主動查詢資料,詢問同學和請教老師,充分體現了新時代新青年的團結和探索精神。</p><p><
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)課程設計--進程的軟中斷通信與管道通信
- 操作系統(tǒng)課程設計——操作系統(tǒng)課程設計模擬操作系統(tǒng)
- 操作系統(tǒng)課程設計-- 操作系統(tǒng)
- 操作系統(tǒng)課程設計
- 操作系統(tǒng)課程設計
- 操作系統(tǒng)課程設計
- 操作系統(tǒng)課程設計
- 操作系統(tǒng)課程設計
- 操作系統(tǒng)課程設計
- 內存管理(操作系統(tǒng))操作系統(tǒng)課程設計
- 操作系統(tǒng)課程設計題目
- 操作系統(tǒng)課程設計報告
- 操作系統(tǒng)課程設計論文
- 操作系統(tǒng)課程設計 (4)
- 操作系統(tǒng)課程設計1
- 課程設計報告--操作系統(tǒng)
- linux操作系統(tǒng)課程設計
- 操作系統(tǒng)課程設計報告
- 操作系統(tǒng)原理課程設計
- 操作系統(tǒng)課程設計--模擬操作系統(tǒng)的實現
評論
0/150
提交評論