試驗10共享內存試驗_第1頁
試驗10共享內存試驗_第2頁
試驗10共享內存試驗_第3頁
試驗10共享內存試驗_第4頁
試驗10共享內存試驗_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、南昌大學實驗報告學生姓名:王維學號:6100212202專業(yè)班級:網工 121班實驗類型:口 驗證 口綜合口設計口 創(chuàng)新 實驗日期:6/11實驗成績:一、 實驗項目名稱實驗10:共享內存實驗二、實驗目的通過編寫共享內存實驗, 可以進一步了解使用共享內存的具體步驟,同時也進一步加深對共享內存的理解。在本實驗中,采用信號量作為同步機制完善兩個進程(“生產者”和“消費者”)之間的通信。其功能類似于“消息隊列”中的實例。在實例中使用的與信號量相關 的函數(shù)。三、實驗內容該實現(xiàn)要求利用共享內存實現(xiàn)文件的打開和讀寫操作。四、實驗步驟(1)畫出流程圖 該實驗流程圖如圖所示:流程圖(2)編寫代碼下面是共享內存緩

2、沖區(qū)的數(shù)據(jù)結構的定義/* shm_com.h */#include #include #include #include #include #include #include #define SHM_BUFF_SZ 2048struct shm_buffint pid;char bufferSHM_BUFF_SZ;以下是信號量數(shù)據(jù)結構定義及其操作代碼/* sem_com.h */#include #include #include union semunint val;struct semid_ds *buf;unsigned short *array;/*1.信號量初始化(賦值)函數(shù) */i

3、nt init_sem(int sem_id, int init_value) /* 用 init_value 值作初值來初始化標識為 sem_id 的信號量)*/ union semun sem_union;sem_union.val = init_value; /* init_value 為初始值 */ if (semctl(sem_id, 0, SETVAL, sem_union) = -1) perror(Initialize semaphore error!);return -1;return 0;/* 2. 從系統(tǒng)中刪除信號量的函數(shù) */int del_sem(int sem_id

4、)union semun sem_union; if (semctl(sem_id, 0, IPC_RMID, sem_union) = -1) (perror(Delete semaphore error);return -1;return 0;/*3. P 操作函數(shù)*/int sem_p(int sem_id) (struct sembuf sem_b;sem_b.sem_num = 0; /*單個信號量的編號應該為0 */sem_b.sem_op = -1; /* 表示 P 操彳乍 */sem_b.sem_flg = SEM_UNDO; /*系統(tǒng)自動釋放將會在系統(tǒng)中殘留的信號量*/if

5、(semop(sem_id, &sem_b, 1) = -1) (perror(P operation error);return -1;return 0;/* 4. V 操作函數(shù)*/int sem_v(int sem_id) (struct sembuf sem_b;sem_b.sem_num = 0; /*單個信號量的編號應該為0 */sem_b.sem_op = 1; /* 表示 V 操彳乍 */sem_b.sem_flg = SEM_UNDO; /*系統(tǒng)自動釋放將會在系統(tǒng)中殘留的信號量*/if (semop(sem_id, &sem_b, 1) = -1) (perror(V oper

6、ation error);return -1; return 0;以下是“生產者”部分代碼/* producer.c */#include shm_com.h#include sem_com.h#include int ignore_signal(void)*/*忽略一些信號,免得非法退出程序signal(SIGINT, SIG_IGN);signal(SIGSTOP, SIG_IGN);signal(SIGQUIT, SIG_IGN);return 0;int main() void *shared_memory = NULL;struct shm_buff *shm_buff_inst;c

7、har bufferBUFSIZ;int shmid, semid;ignore_signal(); /*防止程序非正常退出 */*定義信號量,用于實現(xiàn)訪問共享內存的進程之間的互斥*/semid = semget(ftok(.,a),1,0666|IPC_CREAT);/* 創(chuàng)建一個信號量 */if(semid=-1) perror(semget error!);exit(1);if(init_sem(semid,1) = -1)/* 初始值為 1*/ perror(sem_init error!);del_sem(semid);exit(1);/*創(chuàng)建共享內存 */shmid = shmge

8、t(ftok(., b), sizeof(struct shm_buff), 0666|IPC_CREAT) ;if (shmid = -1)perror(shmget failed);del_sem(semid);exit(1);/*將共享內存地址映射到當前進程地址空間*/shared_memory = shmat(shmid, (void*)0, 0);if (shared_memory = (void*)-1)(perror(shmat error);del_sem(semid);exit(1);printf(Memory attached at %Xn, (int)shared_mem

9、ory);/*獲得共享內存的映射地址*/shm_buff_inst = (struct shm_buff *) shared_memory;do(sem_p(semid);printf(Enter some text to the shared memory(enter quit to exit):);/*向共享內存寫入數(shù)據(jù)*/if (fgets(shm_buff_inst-buffer, SHM_BUFF_SZ, stdin) = NULL) (perror(fgets error);sem_v(semid);break;shm_buff_inst-pid = getpid();sem_v(

10、semid); while(strncmp(shm_buff_inst-buffer, quit, 4) != 0);/*刪除信號量*/del_sem(semid);/*刪除共享內存到當前進程地址空間中的映射*/if (shmdt(shared_memory) = 1)(perror(shmdt error);exit(1);exit(0);以下是“消費者”部分代碼/* customer.c */#include shm_com.h#include sem_com.hint main() void *shared_memory = NULL;struct shm_buff *shm_buff_

11、inst;int shmid, semid;/*獲得信號量*/semid = semget(ftok(., a),1,0666);if (semid = -1)(perror(Producer isnt exist);exit(1);/*獲得共享內存*/shmid = shmget(ftok(., b), sizeof(struct shm_buff), 0666|IPC_CREAT);if (shmid = -1)(perror(shmget);exit(1);/*將共享內存地址映射到當前進程地址空間*/shared_memory = shmat(shmid, (void*)0, 0);if

12、 (shared_memory = (void*)-1)(perror(shmat);exit(1);printf(Memory attached at %Xn,(int)shared_memory);/*獲得共享內存的映射地址*/shm_buff_inst = (struct shm_buff *)shared_memory;do(sem_p(semid);printf(Shared memory was written by process %d :%s,shm_buff_inst-pid, shm_buff_inst-buffer);if (strncmp(shm_buff_inst-b

13、uffer, quit, 4) = 0)(break;shm_buff_inst-pid = 0;memset(shm_buff_inst-buffer, 0, SHM_BUFF_SZ);sem_v(semid);sleep(2); while(1);/*刪除共享內存到當前進程地址空間中的映射*/if (shmdt(shared_memory) = -1) perror(shmdt);exit(1);/*刪除共享內存*/if (shmctl(shmid, IPC_RMID, NULL) = -1) perror(shmctl(IPC_RMID);exit(1);exit(0);.編譯produ

14、cer.c和customer.c并運行,記錄結果,完成實驗報告.若將消費者部分中的代碼“sleep(2);”這行刪除,重新編譯運行,會出什么情況?解釋你看到的實驗結果。五、實驗結果打開兩個終端,終端1:jsllylocalhost bin5 ./producerMemory attached Enter some text Enter some text Enter some textat to to to797AOOO the shared the shared the sharedjellyGlocalhcst binSmemory(enter memory(enter memory(en

15、terrquit* to exit) :hello rqu.it to exit) :world rqu.it * to exit) : quit終端2:jLlyGloeaLhost bin$ ./eustom&rMemouy attached at 32053000Shared msitiory wa.s writt&n fay process 3132:world:quitShared memory was written by process 3132Shared memory was writt&n hy process 313-2 jellyG locaIhost- bin $六、實驗總結共享內存是System V的三種IPC類型之一。共享內存是最快的一種IPC方

溫馨提示

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

評論

0/150

提交評論