操作系統(tǒng)進程通信共享內(nèi)存課程設計_第1頁
操作系統(tǒng)進程通信共享內(nèi)存課程設計_第2頁
操作系統(tǒng)進程通信共享內(nèi)存課程設計_第3頁
操作系統(tǒng)進程通信共享內(nèi)存課程設計_第4頁
操作系統(tǒng)進程通信共享內(nèi)存課程設計_第5頁
已閱讀5頁,還剩21頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、河南城建學院操作系統(tǒng)課程設計說明書設計題目: 進程通信 專 業(yè): 計算機科學與技術(shù) 指導教師: 邵國金、郭猛、薛冰 班 級: 學 號: 姓 名: 同 組 人: 計算機科學與工程系2013年1 月 10 日前 言本設計是基于課程中學到的UNIX系統(tǒng)調(diào)用,使用操作系統(tǒng)環(huán)境是Red Hat Linux 9,言語開發(fā)環(huán)境是Linux的GNU C或C+。Linux操作系統(tǒng)是一個向用戶開放源碼的免費的類UNIX操作系統(tǒng)。它為在校學生學習操作系統(tǒng)課程提供了一個看得見摸得著的范例。對于學生正確理解,掌握操作系統(tǒng)的基本知識具有重要意義。鑒于此,本操作系統(tǒng)課程涉及的實驗均在Linux環(huán)境下進行。這就要求大家:(1

2、)熟悉Linux的操作和開發(fā)環(huán)境;(2)具有C語言知識(Linux操作系統(tǒng)大約90%的源碼是用C語言編寫)。我們的設計和實驗將在Windows xp環(huán)境下,基于虛擬機軟件VMWare軟件進行安裝。學習計算機軟件技術(shù),特別是計算機操作系統(tǒng)技術(shù),除了需要刻苦努力外,還需要掌握軟件和操作系統(tǒng)的原理與設計技巧。如何學習和掌握操作系統(tǒng)技術(shù)的原理與實際技巧呢?除了聽課和讀書之外,最好的方法恐怕就是在實踐中練習。例如,自己設計一個小型操作系統(tǒng),多使用操作系統(tǒng),多閱讀和分析操作源代碼等。但由于我們的條件和學時有限,在理論學習過程中沒有給同學們提供更多的實驗機會?;诠蚕韮?nèi)存的進程通信,通過在兩個進程間創(chuàng)建一塊

3、共享內(nèi)存,將共享內(nèi)存塊分為兩部分,標示位和數(shù)據(jù)域。通過實踐讓我們了解了什么是共享內(nèi)存通信機制,實現(xiàn)了程序進程間的通信。積極通過合作,完成任務。目錄一、系統(tǒng)開發(fā)環(huán)境- 4 -二、設計目的- 5 -三、設計題目及要求- 6 -四、總體設計- 7 -1、服務器功能- 7 -2、客戶端功能- 7 -3、文件讀取功能- 8 -4、界面顯示函數(shù)- 8 -5、組成框圖:- 9 -6.共享內(nèi)存分配- 9 -7.總體流程圖- 10 -五、詳細設計- 11 -1.主函數(shù)- 11 -2.菜單顯示- 11 -3.服務器端:- 12 -4.客戶端程序:- 14 -5、部分函數(shù)介紹- 15 -六、調(diào)試與測試- 17 -七

4、、執(zhí)行結(jié)果及分析- 18 -八、源程序清單- 20 -九、心得體會- 25 -十、參考文獻- 26 -一、系統(tǒng)開發(fā)環(huán)境Windows Xp系統(tǒng)、虛擬機上運行的Red Hat Linux 9系統(tǒng)運行環(huán)境。二、設計目的1、進一步了解什么是進程,以及創(chuàng)建進程的方式。2、實現(xiàn)UNIX/LINUX系統(tǒng)環(huán)境下的進程通信方式。3、熟練掌握C/S中的共享內(nèi)存通信機制。4、開辟一個共享區(qū),實現(xiàn)進程共享資源,互相通信。三、設計題目及要求利用UNIX系統(tǒng)提供的進程通信機制實現(xiàn)通信以及共享內(nèi)存區(qū)的實現(xiàn)(1) 共享存儲區(qū)的創(chuàng)建,附接和斷接使用系統(tǒng)調(diào)用shmget(),shmat(),msgdt(),shmctl(),編

5、制一長度為1K的消息發(fā)送和接收的程序。1)為了便于操作和觀察結(jié)果,用一個程序作為“引子”,先后fork()兩個子進程,SERVER和CLIENT,進行通信。SERVER和CLIENT也可分別為2個各自獨立的程序。2)SERVER端建立一個Key為375的共享區(qū),并將第一個字節(jié)置為-1,作為數(shù)據(jù)空的標志,等待其他進程發(fā)來的消息。當該字節(jié)的值發(fā)生變化時,表示收到了信息,并進行處理。然后再次把它的值設為-1。如果遇到的值為0,則視為結(jié)束信號,取消該隊列,并退出SERVER。SERVER每接收到一次數(shù)據(jù)后顯示“(server)received”。3)CLIENT端建立一個Key為375的共享區(qū),當共享

6、取得第一個字節(jié)為-1時,SERVER端空閑,可發(fā)送請求。CLIENT隨即填入9到0。期間等待Server端的再次空閑。進行完這些操作后,CLIENT退出。CLIENT每發(fā)送一次數(shù)據(jù)后顯示“(client)sent”。4)父進程在SERVER和CLIENT均退出后結(jié)束。(2)功能擴展:在sever端創(chuàng)建一個服務函數(shù),從而形成C/S通訊模式要求SERVER每接收到一次數(shù)據(jù)后不僅僅顯示“(server)received”,而是做一些其它事情,比如讀取或查詢某個文件等。此功能可由設計者自己定義。四、總體設計1.服務器功能服務器共有四塊共享內(nèi)存,分別用addr1,addr2,addr3,addr4接收,

7、其中addr1為整形指針,addr1,addr2,addr3為結(jié)構(gòu)體型指針,結(jié)構(gòu)體的定義如下:Typedef strcut addressInt mark; Char ch20;address;其中的mark成員用來作為標記為標示共享內(nèi)存塊的狀態(tài),-1表示該內(nèi)存塊空閑,服務端可以發(fā)送服務請求,1,2,3這分別表示服務器正在處理不同的服務請求,客戶端需等待。而字符數(shù)組成員ch則用來將各個客戶端的文件中的數(shù)據(jù)放入對應的共享內(nèi)存塊中,與服務器交換數(shù)據(jù)。而內(nèi)存塊之所以既能實現(xiàn)客戶端與服務器的通信,又能相互之間交換數(shù)據(jù),在于shmat函數(shù)的返回值為void*,可以將其轉(zhuǎn)化為任意類型的指針變量,該函數(shù)調(diào)用

8、如下:Addr1=(address*)shmat(shmid1,1024,0);Addr2=(address*)shmat(shmid2,1024,0);Addr3=(address*)shmat(shmid31024,0);該四塊共享內(nèi)存分別用于實現(xiàn)接受各個客戶端的服務請求,處理客戶端1,客戶端2,客戶端3的服務請求。各個共享內(nèi)存模塊的處理方法基本一致,即服務器處理完客戶端的請求,將addr置為-1,即表示自己已空閑,可以接受服務請求;客戶端發(fā)出服務請求后,等待服務器處理,一旦服務得到相應,將addr置為1或2或3。2.客戶端功能可具體分成3個客戶端,每個客戶端均包含兩塊共享內(nèi)存,第一塊用于

9、發(fā)送請求,其鍵值為各個客戶端所知,第二塊用于與服務器交互階段的數(shù)據(jù)傳遞,其鍵值僅有本客戶端與服務器知道。每塊共享內(nèi)存一包含兩部分:1用于表示共享內(nèi)存塊的狀態(tài)的addr1-mark,2用于保存本客戶端數(shù)據(jù)信息的數(shù)據(jù)域。其所在的進程完成自己的請求后,調(diào)用exit(0)退出本進程。其分配共享內(nèi)存塊的系統(tǒng)的調(diào)用函數(shù)為:Shmid1=shmget(SHMKEY,1024,0777|IPC_CREAT);Shmid2=shmget(SHMKEY,1024,0777|IPC_CREAT);Shmid3=shmget(SHMKEY,1024,0777|IPC_CREAT);至于內(nèi)存共享的實現(xiàn)方式,與服務器相同

10、。3.文件讀取功能 每個客戶端均設置此功能,例如購買手機卡時,客戶端1需檢索自己的文件中是否存在該號碼,如果已存在,則提示客戶改號碼已注冊,需重新選擇。該功能模塊涉及到:1讀文件2查找對于讀文件,首先需打開文件,該函數(shù)定義一個文件型指針fp,賦值操作為:Fp=fopen(“Info.txt”,”rw+”);打開文件成功后,利用fgetc()函數(shù)從文件中一個一個字符的讀取,當遇到n時,說明一個號碼已經(jīng)讀取完畢。其函數(shù)使用如下:C=fgetc();While(!feof(fp)If(c=n) Numberi=0; I=-1;Else Numberi=c;C=fgetc();+I;對于本系統(tǒng)的檢索功

11、能,因為文件的讀取操作較慢,很有可能使客戶端進程阻塞,故設置一個cellnumber()函數(shù),使其預先將本文件中的所有號碼全部讀出,放入一個字符型二維數(shù)組中,這樣當服務器需檢索文件中號碼時,直接從該二維數(shù)組中檢索即可,大大提高了檢索速度。檢索所采用的方法是順序查找法,可以達到預定的速度要求。4.界面顯示函數(shù) 即系統(tǒng)中的display()函數(shù),其包含四個功能選項:1:購買手機卡;2:手機充值;3;辦理網(wǎng)銀;4:;退出本系統(tǒng)前三項功能每一項對應一個客戶進程,具體哪項進程由choice變量控制。5.組成框圖: 總體服務 3個客戶端 display() cellnumber() 服務器端6.共享內(nèi)存分

12、配 共享內(nèi)存區(qū) -1 由SERVER端開辟一塊用來與各個客戶端通信的共享內(nèi)存區(qū) 共享內(nèi)存區(qū)-1 客戶1與服務器端共享內(nèi)存區(qū)。 共享內(nèi)存區(qū)-1 客戶2與服務器端共享內(nèi)存區(qū)共享內(nèi)存區(qū)-1 客戶3與服務器端共享內(nèi)存區(qū)。7.總體流程圖開始i=0i=fork()Cellnumber文件信息 Y N i=fork()Serverr服務器i=0 Y NClient()Client(1)Chioice=Client(2) YClient(3) N結(jié)束 總體流程圖1五、詳細設計1.主函數(shù)int main()int choice,i; char ch520; display(); do printf(請選擇一項功

13、能項:n); scanf(%d,&choice); fflush(stdin); while(choice!=1&choice!=2&choice!=3&choice!=4) printf(輸入有誤,請重新輸入:n); scanf(%d,&choice); fflush(stdin); if(choice=4) return 0; else while(i=fork()=-1); if(!i)server(ch); else while (i=fork()=-1); if(!i)client(choice); wait(0);wait(0); while(choice!=4);return 0

14、;2.菜單顯示void display()printf(-n);int i;for(i=1;imakr=-1; while(addr1-makr=-1);if(addr1-makr=1) c=fgetc(fp); int i=0; while (!feof(fp) if(c=n) numberi=0; i=-1; if(!strcmp(number,addr1-ch) printf(號碼已經(jīng)占用,請重新選擇一個:n); return ; else numberi=c; c=fgetc(fp); +i; printf(手機號碼已選定,請繳費100元:n);addr1-makr=-1;while(

15、addr1-makr=-1);if(addr1-makr=2)printf(交易完成,祝您愉快!n);shmctl(shmid1,IPC_RMID,0);if(*addr=2)shmid2=shmget(CLIENTTWO,1024,0777|IPC_CREAT);addr2=shmat(shmid2,0,0);printf(請輸入您的手機號碼:n);addr2-makr=-1;while(addr2-makr=-1);if(addr2-makr=1)printf(Input Your Payroll:n);addr2-makr=-1;while(addr2-makr=-1);if(addr2

16、-makr=2)printf(充值完成!n);shmctl(shmid2,IPC_RMID,0);if(*addr=3) shmid3=shmget(CLIENTTHREE,1024,0777|IPC_CREAT);addr3=shmat(shmid3,0,0);printf(請輸入您的身份證號:n);addr3-makr=-1;while(addr3-makr=-1);if(addr3-makr=1)printf(請輸入您的手機號碼:n);addr3-makr=-1;while(addr3-makr=-1);if(addr3-makr=2)printf(辦理完成,祝您愉快!n);shmctl

17、(shmid3,IPC_RMID,0);shmctl(shmid,IPC_RMID,0);4.客戶端程序:void client(int choice) int shmid1,shmid2,shmid3; int payroll;char ch120,ch250;shmid=shmget(SHMKEY,1024,0777|IPC_CREAT);addr=shmat(shmid,0,0); while(*addr!=-1);if(choice=1) *addr=1;shmid1=shmget(CLIENTONE,1024,0777|IPC_CREAT);addr1=shmat(shmid1,0,

18、0);while(addr1-makr!=-1);scanf(%s,addr1-ch);addr1-makr=1;while(addr1-makr!=-1);printf(已繳費100元!n);addr1-makr=2;if(choice=2)*addr=2;shmid2=shmget(CLIENTTWO,1024,0777|IPC_CREAT);addr2=shmat(shmid2,0,0);while(addr2-makr!=-1);scanf(%s,ch1);addr2-makr=1;while(addr2-makr!=-1); scanf(%d,&payroll);addr2-makr

19、=2; if(choice=3) *addr=3;shmid3=shmget(CLIENTTHREE,1024,0777|IPC_CREAT);addr3=shmat(shmid3,0,0);while(addr3-makr!=-1);scanf(%s,ch1);addr3-makr=1;while(addr3-makr!=-1);scanf(%s,ch2);addr3-makr=2;5.部分函數(shù)介紹1.int fork()創(chuàng)建一個新進程。用法:int fork()其中返回int取值意義如下:0:創(chuàng)建子進程,從子進程返回的id值0:從父進程返回的子進程id值-1:創(chuàng)建失敗2.int shmge

20、t(key,size,shmflg|IPC_CREAT)頭文件: #include #include參數(shù)定義:key:為申請共享內(nèi)存的標示符;size:為申請共享內(nèi)存的大??;shmflg:用戶設置的標識或訪問方式,與消息緩沖shmget中的含義相同,這實驗中可以使用0777|IPC_CREAT,表示任意進程可讀可寫。IPC_CREAT:當shmflg&IPC_CREAT為真時,如果內(nèi)核中不存在鍵值與key相等的共性內(nèi)存,則新建一個共享內(nèi)存;如果存在這樣的共享內(nèi)存,返回此共享內(nèi)存的標識符。利用此系統(tǒng)調(diào)用在內(nèi)存中開辟一塊共享區(qū)。用法: int shmget()返回值為開辟出來共享內(nèi)存的標號。3.v

21、oid *shmat(int shmid,const void *shmaddr,int shmflg)頭文件: #include #include參數(shù)定義:shmid:表示申請共享內(nèi)存空間的標示符。shmaddr:指定共享內(nèi)存出現(xiàn)在進程內(nèi)存地址什么位置,直接指定為NULL讓內(nèi)核自己決定一個合適的位置shmflg:SHM_RDONLY為只讀模式,其他為讀寫模式。返回值為共享內(nèi)存的首地址。4.int shmctl(int shmid,int cmd,strucr shmid_ds *buf)頭文件: #include #include參數(shù)定義:Shmid:共享內(nèi)存標識符。該系統(tǒng)使用了內(nèi)存共享機制

22、來實現(xiàn)進程之間的通信與數(shù)據(jù)傳遞,其包含四個大的功能模塊:1:服務器功能,即server函數(shù);2:客戶端功能,即client函數(shù);3:讀取各個客戶端文件功能,即cellnumber函數(shù)4:界面顯示函數(shù),即display函數(shù)下面是每個功能模塊的具體分析過程:六、調(diào)試與測試任務一編譯方法: 編譯:cc liulong.c執(zhí)行:./a.out任務二編譯方法是:編譯:cc o endend endend.c執(zhí)行./endend運行時,根據(jù)選擇不同的功能選項來啟動不同客戶端,而server端作為服務器仍將繼續(xù)運行,你再次啟動client來請求服務。七、執(zhí)行結(jié)果及分析當選這功能項1時,客戶1與服務器建立共享

23、區(qū)來建立通信,這里用到了和文件相關(guān)聯(lián),在當前目錄下有一個文件,文件中有五條電話號碼記錄,當客戶選擇自己的電話號碼是如果輸入的電話號碼和文件中五條記錄中的一項相同就會彈出“手機號碼已存在,請重新選擇!”這句話也就是說該號碼已被別人注冊并使用,提示用戶重新選擇自己的號碼。通過編譯后進入該程序,如果輸入的不是當前功能項提供的幾個選項會彈出來錯誤提示,提示用戶重新輸入想要選擇的功能項,這里用到了fflush(stdin)這個函數(shù),當輸入有誤時會清除掉緩沖區(qū)中的數(shù)據(jù)以便于用戶再次輸入。當選擇功能項2時,這是一個為用戶充值的服務,選中該功能項時客戶端2會和服務器建立基于共享內(nèi)存的通信,這是用戶可以輸入自己

24、的電話號碼,這里也可以關(guān)聯(lián)到文件,可以在當前目錄下創(chuàng)建一個文件,其中記錄了用戶的電話號碼和對應的余額,根據(jù)這個來為用戶提供要充值的服務。當選擇功能項3時,這是一個為用戶辦理網(wǎng)銀的服務,該功能也可以和文件相關(guān)聯(lián),在當前目錄下建立一個文件其中記錄了用戶的電話號碼、身份證號,根據(jù)用戶輸入共享區(qū)的數(shù)據(jù),把共享區(qū)中的數(shù)據(jù)取出和文件中已存在的數(shù)據(jù)作比較,可以得到是否該用戶已存在進而來為用戶提供辦理網(wǎng)銀的服務。當各項功能服務都不需要時,可以選擇退出本系統(tǒng),選擇功能項4時自動退出本服務系統(tǒng)。八、源程序清單#include#include#include#include#include#define SHMKE

25、Y 75#define CLIENTONE 100#define CLIENTTWO 150#define CLIENTTHREE 200void cellnumber(char phonenumber520)int j=0; char c;char number20=0;FILE *fp;if(fp=fopen(Info.txt,rw+)=NULL)printf(文件未能打開!n);return ;c=fgetc(fp);int i=0;while (!feof(fp)if(c=n)numberi=0;i=-1;strcpy(phonenumberj,number);j+;elsenumbe

26、ri=c;c=fgetc(fp);+i;typedef struct addreint makr;char ch50;addre;addre *addr1,*addr2,*addr3;int shmid,*addr;void server(char phonenumber520) char ch120;int shmid1,shmid2,shmid3,shmid4;int i;shmid=shmget(SHMKEY,1024,0777|IPC_CREAT);addr=shmat(shmid,0,0);*addr=-1;while(*addr=-1);if(*addr=1) shmid1=shm

27、get(CLIENTONE,1024,0777|IPC_CREAT);addr1=shmat(shmid1,0,0);printf(請輸入您喜歡的手機號碼:n);addr1-makr=-1;while(addr1-makr=-1);if(addr1-makr=1) for(i=0;ich)printf(手機號碼已存在,請重新選擇!n);return ; printf(手機號碼已選定,請繳費100元:n);addr1-makr=-1;while(addr1-makr=-1);if(addr1-makr=2)printf(交易完成,祝您愉快!n);shmctl(shmid1,IPC_RMID,0)

28、;if(*addr=2)shmid2=shmget(CLIENTTWO,1024,0777|IPC_CREAT);addr2=shmat(shmid2,0,0);printf(請輸入您的手機號碼:n);addr2-makr=-1;while(addr2-makr=-1);if(addr2-makr=1)printf(Input Your Payroll:n);addr2-makr=-1;while(addr2-makr=-1);if(addr2-makr=2)printf(充值完成!n);shmctl(shmid2,IPC_RMID,0);if(*addr=3) shmid3=shmget(C

29、LIENTTHREE,1024,0777|IPC_CREAT);addr3=shmat(shmid3,0,0);printf(請輸入您的身份證號:n);addr3-makr=-1;while(addr3-makr=-1);if(addr3-makr=1)printf(請輸入您的手機號碼:n);addr3-makr=-1;while(addr3-makr=-1);if(addr3-makr=2)printf(辦理完成,祝您愉快!n);shmctl(shmid3,IPC_RMID,0);shmctl(shmid,IPC_RMID,0);void client(int choice) int shm

30、id1,shmid2,shmid3; int payroll;char ch120,ch250;shmid=shmget(SHMKEY,1024,0777|IPC_CREAT);addr=shmat(shmid,0,0); while(*addr!=-1);if(choice=1) *addr=1;shmid1=shmget(CLIENTONE,1024,0777|IPC_CREAT);addr1=shmat(shmid1,0,0);while(addr1-makr!=-1);scanf(%s,addr1-ch);addr1-makr=1;while(addr1-makr!=-1);print

31、f(已繳費100元!n);addr1-makr=2;if(choice=2)*addr=2;shmid2=shmget(CLIENTTWO,1024,0777|IPC_CREAT);addr2=shmat(shmid2,0,0);while(addr2-makr!=-1);scanf(%s,ch1);addr2-makr=1;while(addr2-makr!=-1); scanf(%d,&payroll);addr2-makr=2; if(choice=3) *addr=3;shmid3=shmget(CLIENTTHREE,1024,0777|IPC_CREAT);addr3=shmat(

32、shmid3,0,0);while(addr3-makr!=-1);scanf(%s,ch1);addr3-makr=1;while(addr3-makr!=-1);scanf(%s,ch2);addr3-makr=2;exit(0);void display()printf(-n);int i;for(i=1;i=15;+i)if(i=3|i=6|i=9|i=12)if(i=3) printf(| 1.購買手機卡: |n);if(i=6) printf(| 2.手機充值: |n);if(i=9) printf(| 3.辦理網(wǎng)銀: |n);if(i=12) printf(| 4.退出本系統(tǒng): |n);elseprintf(| |n);prin

溫馨提示

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

評論

0/150

提交評論