版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年高職軟件工程(軟件編碼框架工具)試題及答案
- 2025年高職第一學(xué)年(食品營(yíng)養(yǎng))三大營(yíng)養(yǎng)素搭配階段測(cè)試試題及答案
- 2025年大學(xué)公共關(guān)系學(xué)(公關(guān)理論)試題及答案
- 2025年高職會(huì)計(jì)(財(cái)務(wù)軟件應(yīng)用)試題及答案
- 2025年中職機(jī)電技術(shù)應(yīng)用(機(jī)電應(yīng)用)試題及答案
- 2025年中職第一學(xué)年(市場(chǎng)營(yíng)銷實(shí)訓(xùn))產(chǎn)品推銷實(shí)操階段測(cè)試試題及答案
- 2025年高職種植業(yè)機(jī)械安裝(種植業(yè)機(jī)械安裝)試題及答案
- 2025年大學(xué)二年級(jí)(作物生產(chǎn)與品質(zhì)改良)品質(zhì)提升綜合測(cè)試題及答案
- 2025年高職物聯(lián)網(wǎng)工程(物聯(lián)網(wǎng)設(shè)計(jì))試題及答案
- 2025年大學(xué)大四(草業(yè)科學(xué))草地生態(tài)修復(fù)畢業(yè)模擬測(cè)試卷
- 2025浙江紹興越城黃酒小鎮(zhèn)旅游開發(fā)有限公司編外人員第二次招聘總筆試歷年典型考點(diǎn)題庫(kù)附帶答案詳解2套試卷
- DB54∕T 0378-2024 牦牛短期育肥技術(shù)規(guī)范
- 2025 年中國(guó)裝配式裝修產(chǎn)業(yè)發(fā)展研究報(bào)告
- 戶外拓展活動(dòng)中中級(jí)攀巖指導(dǎo)員職責(zé)分工計(jì)劃
- 數(shù)據(jù)中心配電知識(shí)培訓(xùn)課件
- 數(shù)據(jù)標(biāo)注員專業(yè)技能考核試卷及答案
- 傳染病信息報(bào)告管理規(guī)范2025版
- 海南自貿(mào)港課件
- 北京市東城區(qū)2026屆數(shù)學(xué)九上期末考試試題含解析
- 叉車盲區(qū)安全培訓(xùn)記錄課件
- 自然資源部所屬單位2025年度公開招聘工作人員(第三批)筆試模擬試題含答案詳解
評(píng)論
0/150
提交評(píng)論