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

下載本文檔

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

文檔簡介

實驗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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論