實(shí)驗(yàn)10-共享內(nèi)存實(shí)驗(yàn)_第1頁(yè)
實(shí)驗(yàn)10-共享內(nèi)存實(shí)驗(yàn)_第2頁(yè)
實(shí)驗(yàn)10-共享內(nèi)存實(shí)驗(yàn)_第3頁(yè)
實(shí)驗(yàn)10-共享內(nèi)存實(shí)驗(yàn)_第4頁(yè)
實(shí)驗(yàn)10-共享內(nèi)存實(shí)驗(yàn)_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

實(shí)驗(yàn)10共享內(nèi)存實(shí)驗(yàn)1.實(shí)驗(yàn)?zāi)康耐ㄟ^編寫共享內(nèi)存實(shí)驗(yàn),可以進(jìn)一步了解使用共享內(nèi)存的具體步驟,同時(shí)也進(jìn)一步加深對(duì)共享內(nèi)存的理解。在本實(shí)驗(yàn)中,采用信號(hào)量作為同步機(jī)制完善兩個(gè)進(jìn)程〔“生產(chǎn)者〞和“消費(fèi)者〞〕之間的通信。其功能類似于“消息隊(duì)列〞中的實(shí)例。在實(shí)例中使用的與信號(hào)量相關(guān)的函數(shù)。2.實(shí)驗(yàn)內(nèi)容該實(shí)現(xiàn)要求利用共享內(nèi)存實(shí)現(xiàn)文件的翻開和讀寫操作。3.實(shí)驗(yàn)步驟〔1〕畫出流程圖該實(shí)驗(yàn)流程圖如下圖:流程圖〔2〕編寫代碼下面是共享內(nèi)存緩沖區(qū)的數(shù)據(jù)結(jié)構(gòu)的定義/*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];};以下是信號(hào)量數(shù)據(jù)結(jié)構(gòu)定義及其操作代碼/*sem_com.h*/#include<sys/types.h>#include<sys/ipc.h>#include<sys/sem.h>unionsemun{intval;structsemid_ds*buf;unsignedshort*array;};/*1.信號(hào)量初始化〔賦值〕函數(shù)*/intinit_sem(intsem_id,intinit_value)/*用init_value值作初值來(lái)初始化標(biāo)識(shí)為sem_id的信號(hào)量〕*/{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)中刪除信號(hào)量的函數(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;/*單個(gè)信號(hào)量的編號(hào)應(yīng)該為0*/sem_b.sem_op=-1;/*表示P操作*/sem_b.sem_flg=SEM_UNDO;/*系統(tǒng)自動(dòng)釋放將會(huì)在系統(tǒng)中殘留的信號(hào)量*/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;/*單個(gè)信號(hào)量的編號(hào)應(yīng)該為0*/sem_b.sem_op=1;/*表示V操作*/sem_b.sem_flg=SEM_UNDO;/*系統(tǒng)自動(dòng)釋放將會(huì)在系統(tǒng)中殘留的信號(hào)量*/if(semop(sem_id,&sem_b,1)==-1){perror("Voperationerror");return-1;}return0;}以下是“生產(chǎn)者〞局部代碼/*producer.c*/#include"shm_com.h"#include"sem_com.h"#include<signal.h>intignore_signal(void){/*忽略一些信號(hào),免得非法退出程序*/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();/*防止程序非正常退出*//*定義信號(hào)量,用于實(shí)現(xiàn)訪問共享內(nèi)存的進(jìn)程之間的互斥*/semid=semget(ftok(".",'a'),1,0666|IPC_CREAT);/*創(chuàng)立一個(gè)信號(hào)量*/if(semid==-1){perror("semgeterror!");exit(1);}if(init_sem(semid,1)==-1)/*初始值為1*/{perror("sem_initerror!");del_sem(semid);exit(1);}/*創(chuàng)立共享內(nèi)存*/shmid=shmget(ftok(".",'b'),sizeof(structshared_use_st),0666|IPC_CREAT);if(shmid==-1){perror("shmgetfailed");del_sem(semid);exit(1);}/*將共享內(nèi)存地址映射到當(dāng)前進(jìn)程地址空間*/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);/*獲得共享內(nèi)存的映射地址*/shm_buff_inst=(structshared_use_st*)shared_memory;do{sem_p(semid);printf("Entersometexttothesharedmemory(enter'quit'toexit):");/*向共享內(nèi)存寫入數(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);/*刪除信號(hào)量*/del_sem(semid);/*刪除共享內(nèi)存到當(dāng)前進(jìn)程地址空間中的映射*/if(shmdt(shared_memory)==1){perror("shmdterror");exit(1);}exit(0);}以下是“消費(fèi)者〞局部代碼/*customer.c*/#include"shm_com.h"#include"sem_com.h"intmain(){void*shared_memory=NULL;structshared_use_st*shm_buff_inst;intshmid,semid;/*獲得信號(hào)量*/semid=semget(ftok(".",'a'),1,0666);if(semid==-1){perror("Produceris'ntexist");exit(1);}/*獲得共享內(nèi)存*/shmid=shmget(ftok(".",'b'),sizeof(structshared_use_st),0666|IPC_CREAT);if(shmid==-1){perror("shmget");exit(1);}/*將共享內(nèi)存地址映射到當(dāng)前進(jìn)程地址空間*/shared_memory=shmat(shmid,(void*)0,0);if(shared_memory==(void*)-1){perror("shmat");exit(1);}printf("Memoryattachedat%X\n",(int)shared_memory);/*獲得共享內(nèi)存的映射地址*/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);/*刪除共享內(nèi)存到當(dāng)前進(jìn)程地址空間中的映射*/if(shmdt(shared_memory)==-1){perror("shmdt");exit(1);}/*刪除共享內(nèi)存*/if(shmctl(shmid,IPC_RMID,NULL)==-1){

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論