版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
《物聯(lián)網(wǎng)工程領(lǐng)域應(yīng)用綜合實(shí)訓(xùn)》實(shí)驗(yàn)報(bào)告《物聯(lián)網(wǎng)工程領(lǐng)域應(yīng)用綜合實(shí)訓(xùn)》實(shí)驗(yàn)報(bào)告/18#defineSHM_MODE0600#defineSEM_MODE0600#defineSEM_FULL0#defineSEM_EMPTY1#defineMUTEX2/*#ifdefined(__GNU_LIBRARY__)&&!defined(_SEM_SEMUN_UNDEFINED)//unionsemunisdefinedbyincluding<sys/sem.h>#else//accordingtoX/OPENwehavetodefineitourselvesunionsemun{intval;structsemid_ds*buf;I... ? . 1 1.Junsignedshort*array;};#endifunionsemunsu;//sem口口出必用于初始化信號(hào)量*/structmy_buffer{inthead;inttail;charstr[MAX_BUFFER_SIZE];intnum;〃緩沖區(qū)里字母數(shù)量intis_empty;};constint『CONSUMER=2;//消費(fèi)者數(shù)量constintN_PRODUCER=2;//生產(chǎn)者數(shù)量constintN_BUFFER=10;//緩沖區(qū)容量constintN_WORKTIME=10;//工作次數(shù)intshm_id=-1;intsem_id=-1;pid_tchild;pid_tparent;〃得到10以內(nèi)的一個(gè)隨機(jī)數(shù)intget_random()JTOC\o"1-5"\h\z: :intdigit; : : :srand((unsigned)(getpid()+time(NULL)));digit=rand()%10; I I Iiireturndigit; i i iI[CI 〃得到A?Z的一個(gè)隨機(jī)字母 | | |i i char getRandChar() i i ir■《| | charletter; | | || | srand((unsigned)(getpid() +time(NULL))); I I I! ! letter=(char)((rand()% 26)+'A'); ! ! !returnletter; | | |J//sem_id表示信號(hào)量集合的id//sem_num表示要處理的信號(hào)量在信號(hào)量集合中的索引 ! ! !//P操作voidwaitSem(intsem_id,intsem_num){ I I I| | structsembufsb; | | |sb.sem_num=sem_num;| 工 sb.sem_op=-1;//表示要把信號(hào)量減一 | | |sb.sem_flg=SEM_UNDO;//〃第二個(gè)參數(shù)是sembuf[]類型的,表示數(shù)組TOC\o"1-5"\h\z〃第三個(gè)參數(shù)表示第二個(gè)參數(shù)代表的數(shù)組的大小 | | |if(semop(sem_id,&sb,1)<0){ii perror("waitSemfailed"); i i iexit(1); j j jJ! !} ! ! !//V操作voidsigSem(intsem_id,intsem_num){iistructsembufsb; i!!?_!!!sb.sem_num—sem_num;sb.sem_op—1;sb.sem_flg—SEM_UNDO;〃第二個(gè)參數(shù)是sembuf[]類型的,表示數(shù)組〃第三個(gè)參數(shù)表示第二個(gè)參數(shù)代表的數(shù)組的大小 | | |TOC\o"1-5"\h\z| | if(semop(sem_id,&sb,1)<0){ I I II Iperror("sigSemfailed"); I I Iexit(1); ? ? ?Ji i} i i i〃打印進(jìn)程運(yùn)行結(jié)果 i i i| |voidprintTime() III{ ill〃打印時(shí)間 i i itime_tnow;| | structtm*timenow; 〃實(shí)例化 tm結(jié)構(gòu)指針 | | || 工 time(&now); | | || | timenow=localtime(&now); | |||printf("執(zhí)行時(shí)間:%s",asctime(timenow)); j jI IJintmain(intargc,char**argv)? ? f ■ ?I shm_id=shmget(IPC_PRIVATE,MAX_BUFFER_SIZE,SHM_MODE);〃申請(qǐng)共享內(nèi)存if(shm_id<0); ; perror("createsharedmemoryfailed"); ; ;exit(1);I structmy_buffer*shmptr;shmptr=shmat(shm_id,0,0);〃將申請(qǐng)的共享內(nèi)存附加到申請(qǐng)通信的進(jìn)程空間! ! if (shmptr == (void*)-1) ! !r? ? j ? ?? ? I ? ?| | perror("add buffer to usingprocessspacefailed!\n"); | |exit(1);J! !if((sem_id=semget(IPC_PRIVATE,3,SEM_MODE))<0) ] !{〃創(chuàng)建三個(gè)信號(hào)量,SEM_EMPTY,SEM_FULL和MUTEX! ! perror("createsemaphorefailed!\n"); ' 'I I exit(1); i i}j j if(semctl(sem_id,SEM_FULL,SETVAL,0)==-1) j j| | {〃將索引為0的信號(hào)量設(shè)置為0-->SEM_FULL | |! ! perror("semsetvalueerror!\n"); ! !| | exit(1);}if(semctl(sem_id,SEM_EMPTY,SETVAL,10)==-1){〃將索引為1的信號(hào)量設(shè)置為10-->SEM_EMPTYperror("semsetvalueerror!\n");| |exit(1);}if(semctl(sem_id,MUTEX,SETVAL,1)==-1){〃將索引為3的信號(hào)量設(shè)置為1-->MUTEXperror("semsetvalueerror!\n");exit(1);}shmptr->head=0;■ ■shmptr->tail=0;shmptr->is_empty=1;| | shmptr->num=0;: : inti;for(i=0;i<N_PRODUCER;i++){parent=fork();IIif(parent<0){! ! perror("theforkfailed");'' exit(1);}! ! elseif(parent==0){iI shmptr=shmat(shm_id,0,0);〃將申請(qǐng)的共享內(nèi)存附加到申請(qǐng)通信的進(jìn)程空間| | if(shmptr==(void*)-1){| | perror("addbuffertousingprocessspacefailed!\n");| | exit(1);}| | intcount=0;intj;for(j=0;j<N_WORKTIME;j++){waitSem(sem_id,SEM_EMPTY);; ; waitSem(sem_id,MUTEX);sleep(getrandom());printf(" \n);| | printf("我是第%d個(gè)生產(chǎn)者進(jìn)程,PID =%d\n", i + 1, getpid());| | /*生產(chǎn)產(chǎn)品*/charc=getRandChar();//隨機(jī)獲取字母| | shmptr->str[shmptr->tail]=c;shmptr->tail=(shmptr->tail+ 1) % MAX_BUFFER_SIZE;shmptr->is_empty=0;//寫入新產(chǎn)品! ! shmptr->num++;/*打印輸出結(jié)果*/printTime();//程序運(yùn)行時(shí)間| | intp;I | printf("緩沖區(qū)數(shù)據(jù)(%d個(gè)):",shmptr->num);〃打印緩沖區(qū)中ii的數(shù)據(jù)| | p=(shmptr->tail-1>=shmptr->head)?(shmptr->tail-1):I ](shmptr->tailT+MAX_BUFFER_SIZE); |for(p;!(shmptr->is_empty)&&p>=shmptr->head;p--){printf("%c",shmptr->str[p%MAX_BUFFER_SIZE]);}printf("\t生產(chǎn)者%d放入'%c'.\n",i+1,c);printf("n);fflush(stdout);sigSem(sem_id,MUTEX);sigSem(sem_id,SEM_FULL);}〃將共享段與進(jìn)程之間解除連接shmdt(shmptr);exit(0);}}for(i=0;i<N_CONSUMER;i++){child=fork();if(child<0)//調(diào)用fork失敗{perror("theforkfailed");exit(1);}elseif(child==0){intcount=0;shmptr=shmat(shm_id,0,0);〃將申請(qǐng)的共享內(nèi)存附加到申請(qǐng)通信的進(jìn)程空間| | if(shmptr==(void*)-1){i i perror("addbuffertousingprocessspacefailed!\n");j j exit(1);}intj;for(j=0;j<N_WORKTIME;j++){waitSem(sem_id,SEM_FULL);; ; waitSem(sem_id,MUTEX);sleep(get_random());| |printf(" \printf("我是第%d個(gè)消費(fèi)者進(jìn)程,PID=%d\n",i+1,getpid());/*消費(fèi)數(shù)據(jù)*/I| charlt=shmptr->str[shmptr->head];shmptr->head=(shmptr->head+1)%MAX_BUFFER_SIZE;shmptr->is_empty=(shmptr->head==shmptr->tail);//' ' shmptr->num一一;/*打印輸出結(jié)果*/! ! printTime();〃程序運(yùn)行時(shí)間| | intp;| | printf("緩沖區(qū)數(shù)據(jù)(%d個(gè)):",shmptr->num);//打印緩沖區(qū)中! !的數(shù)據(jù)|| p=(shmptr->tail-1>=shmptr->head)?(shmptr->tail-1):II(shmptr->tail-1+MAX_BUFFER_SIZE);for(p;!(shmptr->is_empty)&&p>=shmptr->head;p--){printf("%c",shmptr->str[p%MAX_BUFFER_SIZE]);}| | printf("\t消費(fèi)者%d取出'%c'.\n",i+1,It);jjprintf(" \n);fflush(stdout);sigSem(sem_id,MUTEX);sigSem(sem_id,SEM_EMPTY);i — —}〃將共享段與進(jìn)程之間解除連接shmdt(shmptr);exit(0);}}〃主進(jìn)程最后退出| |while(wait(0)!=-1);〃將共享段與進(jìn)程之間解除連接shmdt(shmptr);〃對(duì)共享內(nèi)存區(qū)執(zhí)行控制操作| |shmctl(shm_id,IPC_RMID,0);//當(dāng)cmd為IPC_RMID時(shí),刪除該共享段! !shmctl(sem_id,IPC_RMID,0);printf("主進(jìn)程運(yùn)行結(jié)束!\n");| | fflush(stdout);i i exit(0);! ! return0;}
實(shí)驗(yàn)二:#include<sys/types.h>#include<unistd.h>#include<stdlib.h>#include<stdio.h>#include<pthread.h>#include<semaphore.h>#include<time.h>#define〃哲學(xué)家數(shù)量#define#define#define#defineLEFT(i)RIGHT(i)(i+N-1)%N〃左手邊哲學(xué)家編號(hào)(i+1)%N 〃右手邊哲家編號(hào)#define#define#defineHUNGRYTHINKINGEATING//饑餓//思考//吃飯#defineUSECOND1000000 //1秒對(duì)應(yīng)的微秒數(shù)pthread_mutex_tmutex;//互斥量intstate[N];〃記錄每個(gè)哲學(xué)家狀態(tài)〃每個(gè)哲學(xué)家的思考時(shí)間,吃飯時(shí)間,思考開始時(shí)間,吃飯開始時(shí)間clocktthinking_time[N],eating_time[N],start_eating_time[N],start_thinking_time[N];〃線程函數(shù)void*thread_function(void*arg);intmain(){pthread_mutex_init(&mutex,NULL);pthread_ta,b,c,d,e;〃為每一個(gè)哲學(xué)家開啟一個(gè)線程,傳遞哲學(xué)家編號(hào)pthread_create(&a,NULL,thread_function,"0");pthread_create(&b,NULL,thread_function,"1");pthread_create(&c,NULL,thread_function,"2");pthread_create(&d,NULL,thread_function,"3");pthread_create(&e,NULL,thread_function,"4");〃初始化隨機(jī)數(shù)種子srand((unsignedint)(time(NULL)));iiwhile(1){TOC\o"1-5"\h\zii i? ? i::, :}}void*thread_function(void*arg){char*a=(char*)arg;intnum=a[0]-'0';〃根據(jù)傳遞參數(shù)獲取哲學(xué)家編號(hào)intrand_time;! !while⑴{〃關(guān)鍵代碼加鎖pthread_mutex_lock(&mutex);〃如果該哲學(xué)家處于饑餓并且左右兩位哲學(xué)家都沒有在吃飯就拿起叉子吃飯if(state[num]==HUNGRY&&state[LEFT(num)]!=EATING&&| |state[RIGHT(num)]!=EATING){| | 'state[num]=EATING;start_eating_time[num]=clock();//記錄開始吃飯時(shí)間eating_time[num]=(rand()%5+5)*U_SECOND;〃隨機(jī)生成吃飯時(shí)間〃輸出狀態(tài)printf("state:%d%d%d%d%d\n",state[0],state[1],state[2],state[3],state[4]);//printf("%diseating'n",num);}II elseif(state[num]==EATING){〃吃飯時(shí)間已到,開始思考if(clock()-start_eating_time[num]>=eating_time[num])//{I | state[num]=THINKING;! ! //printf("%disthinking'n",num);| |printf("state:%d%d%d%d%d\n",state[0],state[l],state[2],state[3],stat| |e[4]);start_thinking_time[num]=clock();/記錄開始思考時(shí)間thinking_time[num]=(rand()%10+10)*U_S
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 幼兒園元旦活動(dòng)計(jì)劃8篇
- 2024年版企業(yè)勞動(dòng)協(xié)議參考文本版B版
- 2022幼兒手工教案
- 小區(qū)物業(yè)工作計(jì)劃
- 2024-2030年中國酚醛樹脂涂料行業(yè)發(fā)展運(yùn)行現(xiàn)狀及投資潛力預(yù)測報(bào)告
- 半導(dǎo)體激光治療儀項(xiàng)目可行性分析報(bào)告
- 大班健康活動(dòng)教案四篇
- 大學(xué)班主任工作計(jì)劃
- 美術(shù)教師個(gè)人工作總結(jié)5篇
- 醫(yī)學(xué)類實(shí)習(xí)報(bào)告模板九篇
- 大學(xué)生勞動(dòng)教育課件:發(fā)展專業(yè)技能進(jìn)行創(chuàng)造性勞動(dòng)
- 2024年意識(shí)形態(tài)工作專題會(huì)議記錄【6篇】
- 北師大版九年級(jí)《數(shù)學(xué)》上冊(cè)全冊(cè)教案
- 人民大會(huì)堂介紹課件
- 建行家裝貸產(chǎn)品介紹
- 護(hù)理分級(jí)標(biāo)準(zhǔn)2023版(新舊標(biāo)準(zhǔn)對(duì)比詳解)
- 《比特幣完整介紹》課件
- 機(jī)電運(yùn)輸安全基本知識(shí)
- XX藥業(yè)公司受試者日記卡
- 連鎖藥店GSP質(zhì)量管理體系詳細(xì)文件
- 《電氣工程講》課件
評(píng)論
0/150
提交評(píng)論