版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
實驗10共享內存實驗1.實驗目的通過編寫共享內存實驗,可以進一步了解使用共享內存的具體步驟,同時也進一步加深對共享內存的理解。在本實驗中,采用信號量作為同步機制完善兩個進程〔“生產者〞和“消費者〞〕之間的通信。其功能類似于“消息隊列〞中的實例。在實例中使用的與信號量相關的函數(shù)。2.實驗內容該實現(xiàn)要求利用共享內存實現(xiàn)文件的翻開和讀寫操作。3.實驗步驟〔1〕畫出流程圖該實驗流程圖如下圖:流程圖〔2〕編寫代碼下面是共享內存緩沖區(qū)的數(shù)據(jù)結構的定義/*shm_com.h*/#include<unistd.h>#include<stdlib.h>#include<stdio.h>#include<string.h>#include<sys/types.h>#include<sys/ipc.h>#include<sys/shm.h>#defineSHM_BUFF_SZ2048structshm_buff{intpid;charbuffer[SHM_BUFF_SZ];};以下是信號量數(shù)據(jù)結構定義及其操作代碼/*sem_com.h*/#include<sys/types.h>#include<sys/ipc.h>#include<sys/sem.h>unionsemun{intval;structsemid_ds*buf;unsignedshort*array;};/*1.信號量初始化〔賦值〕函數(shù)*/intinit_sem(intsem_id,intinit_value)/*用init_value值作初值來初始化標識為sem_id的信號量〕*/{unionsemunsem_union;sem_union.val=init_value;/*init_value為初始值*/if(semctl(sem_id,0,SETVAL,sem_union)==-1){perror("Initializesemaphoreerror!");return-1;}return0;}/*2.從系統(tǒng)中刪除信號量的函數(shù)*/intdel_sem(intsem_id){unionsemunsem_union;if(semctl(sem_id,0,IPC_RMID,sem_union)==-1){perror("Deletesemaphoreerror");return-1;}return0;}/*3.P操作函數(shù)*/intsem_p(intsem_id){structsembufsem_b;sem_b.sem_num=0;/*單個信號量的編號應該為0*/sem_b.sem_op=-1;/*表示P操作*/sem_b.sem_flg=SEM_UNDO;/*系統(tǒng)自動釋放將會在系統(tǒng)中殘留的信號量*/if(semop(sem_id,&sem_b,1)==-1){perror("Poperationerror");return-1;}return0;}/*4.V操作函數(shù)*/intsem_v(intsem_id){structsembufsem_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("Voperationerror");return-1;}return0;}以下是“生產者〞局部代碼/*producer.c*/#include"shm_com.h"#include"sem_com.h"#include<signal.h>intignore_signal(void){/*忽略一些信號,免得非法退出程序*/signal(SIGINT,SIG_IGN);signal(SIGSTOP,SIG_IGN);signal(SIGQUIT,SIG_IGN);return0;}intmain(){void*shared_memory=NULL;structshared_use_st*shm_buff_inst;charbuffer[BUFSIZ];intshmid,semid;ignore_signal();/*防止程序非正常退出*//*定義信號量,用于實現(xiàn)訪問共享內存的進程之間的互斥*/semid=semget(ftok(".",'a'),1,0666|IPC_CREAT);/*創(chuàng)立一個信號量*/if(semid==-1){perror("semgeterror!");exit(1);}if(init_sem(semid,1)==-1)/*初始值為1*/{perror("sem_initerror!");del_sem(semid);exit(1);}/*創(chuàng)立共享內存*/shmid=shmget(ftok(".",'b'),sizeof(structshared_use_st),0666|IPC_CREAT);if(shmid==-1){perror("shmgetfailed");del_sem(semid);exit(1);}/*將共享內存地址映射到當前進程地址空間*/shared_memory=shmat(shmid,(void*)0,0);if(shared_memory==(void*)-1){perror("shmaterror");del_sem(semid);exit(1);}printf("Memoryattachedat%X\n",(int)shared_memory);/*獲得共享內存的映射地址*/shm_buff_inst=(structshared_use_st*)shared_memory;do{sem_p(semid);printf("Entersometexttothesharedmemory(enter'quit'toexit):");/*向共享內存寫入數(shù)據(jù)*/if(fgets(shm_buff_inst->buffer,SHM_BUFF_SZ,stdin)==NULL){perror("fgetserror");sem_v(semid);break;}shm_buff_inst->pid=getpid();sem_v(semid);}while(strncmp(shm_buff_inst->buffer,"quit",4)!=0);/*刪除信號量*/del_sem(semid);/*刪除共享內存到當前進程地址空間中的映射*/if(shmdt(shared_memory)==1){perror("shmdterror");exit(1);}exit(0);}以下是“消費者〞局部代碼/*customer.c*/#include"shm_com.h"#include"sem_com.h"intmain(){void*shared_memory=NULL;structshared_use_st*shm_buff_inst;intshmid,semid;/*獲得信號量*/semid=semget(ftok(".",'a'),1,0666);if(semid==-1){perror("Produceris'ntexist");exit(1);}/*獲得共享內存*/shmid=shmget(ftok(".",'b'),sizeof(structshared_use_st),0666|IPC_CREAT);if(shmid==-1){perror("shmget");exit(1);}/*將共享內存地址映射到當前進程地址空間*/shared_memory=shmat(shmid,(void*)0,0);if(shared_memory==(void*)-1){perror("shmat");exit(1);}printf("Memoryattachedat%X\n",(int)shared_memory);/*獲得共享內存的映射地址*/shm_buff_inst=(structshared_use_st*)shared_memory;do{sem_p(semid);printf("Sharedmemorywaswrittenbyprocess%d:%s",shm_buff_inst->pid,shm_buff_inst->buffer);if(strncmp(shm_buff_inst->buffer,"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){
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 科技賦能下的家庭中醫(yī)保健新模式研究
- 江西2025年江西應用工程職業(yè)學院招聘7人筆試歷年參考題庫附帶答案詳解
- 昭通云南昭通市應急管理局招聘應急救援指戰(zhàn)員和駕駛員12人筆試歷年參考題庫附帶答案詳解
- 文山云南文山富寧縣農業(yè)農村和科學技術局考察調(流)動工作人員筆試歷年參考題庫附帶答案詳解
- 2025年蘇教版九年級歷史下冊月考試卷
- 2025年外研版三年級起點八年級地理下冊月考試卷含答案
- 2025年外研版二年級英語下冊月考試卷含答案
- 2025年蘇科版選擇性必修1物理上冊階段測試試卷
- 2025年冀教版九年級歷史下冊階段測試試卷含答案
- 2025年牛津譯林版選修4地理上冊月考試卷含答案
- 2024屆上海高考語文課內古詩文背誦默寫篇目(精校版)
- DL-T5024-2020電力工程地基處理技術規(guī)程
- 2024年度-美團新騎手入門培訓
- 初中數(shù)學要背誦記憶知識點(概念+公式)
- 駕照體檢表完整版本
- 農產品農藥殘留檢測及風險評估
- 農村高中思想政治課時政教育研究的中期報告
- 20100927-宣化上人《愣嚴咒句偈疏解》(簡體全)
- 4-熔化焊與熱切割作業(yè)基礎知識(一)
- 單元教學評一體化設計的探索與實踐以統(tǒng)編語文教材四年級下冊第一單元為例
- 醫(yī)院標識牌方案設計2
評論
0/150
提交評論