




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
《物聯網工程領域應用綜合實訓》實驗報告《物聯網工程領域應用綜合實訓》實驗報告/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口口出必用于初始化信號量*/structmy_buffer{inthead;inttail;charstr[MAX_BUFFER_SIZE];intnum;〃緩沖區(qū)里字母數量intis_empty;};constint『CONSUMER=2;//消費者數量constintN_PRODUCER=2;//生產者數量constintN_BUFFER=10;//緩沖區(qū)容量constintN_WORKTIME=10;//工作次數intshm_id=-1;intsem_id=-1;pid_tchild;pid_tparent;〃得到10以內的一個隨機數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的一個隨機字母 | | |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表示信號量集合的id//sem_num表示要處理的信號量在信號量集合中的索引 ! ! !//P操作voidwaitSem(intsem_id,intsem_num){ I I I| | structsembufsb; | | |sb.sem_num=sem_num;| 工 sb.sem_op=-1;//表示要把信號量減一 | | |sb.sem_flg=SEM_UNDO;//〃第二個參數是sembuf[]類型的,表示數組TOC\o"1-5"\h\z〃第三個參數表示第二個參數代表的數組的大小 | | |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;〃第二個參數是sembuf[]類型的,表示數組〃第三個參數表示第二個參數代表的數組的大小 | | |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〃打印進程運行結果 i i i| |voidprintTime() III{ ill〃打印時間 i i itime_tnow;| | structtm*timenow; 〃實例化 tm結構指針 | | || 工 time(&now); | | || | timenow=localtime(&now); | |||printf("執(zhí)行時間:%s",asctime(timenow)); j jI IJintmain(intargc,char**argv)? ? f ■ ?I shm_id=shmget(IPC_PRIVATE,MAX_BUFFER_SIZE,SHM_MODE);〃申請共享內存if(shm_id<0); ; perror("createsharedmemoryfailed"); ; ;exit(1);I structmy_buffer*shmptr;shmptr=shmat(shm_id,0,0);〃將申請的共享內存附加到申請通信的進程空間! ! 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)建三個信號量,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的信號量設置為0-->SEM_FULL | |! ! perror("semsetvalueerror!\n"); ! !| | exit(1);}if(semctl(sem_id,SEM_EMPTY,SETVAL,10)==-1){〃將索引為1的信號量設置為10-->SEM_EMPTYperror("semsetvalueerror!\n");| |exit(1);}if(semctl(sem_id,MUTEX,SETVAL,1)==-1){〃將索引為3的信號量設置為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);〃將申請的共享內存附加到申請通信的進程空間| | 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個生產者進程,PID =%d\n", i + 1, getpid());| | /*生產產品*/charc=getRandChar();//隨機獲取字母| | shmptr->str[shmptr->tail]=c;shmptr->tail=(shmptr->tail+ 1) % MAX_BUFFER_SIZE;shmptr->is_empty=0;//寫入新產品! ! shmptr->num++;/*打印輸出結果*/printTime();//程序運行時間| | intp;I | printf("緩沖區(qū)數據(%d個):",shmptr->num);〃打印緩沖區(qū)中ii的數據| | 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生產者%d放入'%c'.\n",i+1,c);printf("n);fflush(stdout);sigSem(sem_id,MUTEX);sigSem(sem_id,SEM_FULL);}〃將共享段與進程之間解除連接shmdt(shmptr);exit(0);}}for(i=0;i<N_CONSUMER;i++){child=fork();if(child<0)//調用fork失敗{perror("theforkfailed");exit(1);}elseif(child==0){intcount=0;shmptr=shmat(shm_id,0,0);〃將申請的共享內存附加到申請通信的進程空間| | 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個消費者進程,PID=%d\n",i+1,getpid());/*消費數據*/I| charlt=shmptr->str[shmptr->head];shmptr->head=(shmptr->head+1)%MAX_BUFFER_SIZE;shmptr->is_empty=(shmptr->head==shmptr->tail);//' ' shmptr->num一一;/*打印輸出結果*/! ! printTime();〃程序運行時間| | intp;| | printf("緩沖區(qū)數據(%d個):",shmptr->num);//打印緩沖區(qū)中! !的數據|| 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消費者%d取出'%c'.\n",i+1,It);jjprintf(" \n);fflush(stdout);sigSem(sem_id,MUTEX);sigSem(sem_id,SEM_EMPTY);i — —}〃將共享段與進程之間解除連接shmdt(shmptr);exit(0);}}〃主進程最后退出| |while(wait(0)!=-1);〃將共享段與進程之間解除連接shmdt(shmptr);〃對共享內存區(qū)執(zhí)行控制操作| |shmctl(shm_id,IPC_RMID,0);//當cmd為IPC_RMID時,刪除該共享段! !shmctl(sem_id,IPC_RMID,0);printf("主進程運行結束!\n");| | fflush(stdout);i i exit(0);! ! return0;}
實驗二:#include<sys/types.h>#include<unistd.h>#include<stdlib.h>#include<stdio.h>#include<pthread.h>#include<semaphore.h>#include<time.h>#define〃哲學家數量#define#define#define#defineLEFT(i)RIGHT(i)(i+N-1)%N〃左手邊哲學家編號(i+1)%N 〃右手邊哲家編號#define#define#defineHUNGRYTHINKINGEATING//饑餓//思考//吃飯#defineUSECOND1000000 //1秒對應的微秒數pthread_mutex_tmutex;//互斥量intstate[N];〃記錄每個哲學家狀態(tài)〃每個哲學家的思考時間,吃飯時間,思考開始時間,吃飯開始時間clocktthinking_time[N],eating_time[N],start_eating_time[N],start_thinking_time[N];〃線程函數void*thread_function(void*arg);intmain(){pthread_mutex_init(&mutex,NULL);pthread_ta,b,c,d,e;〃為每一個哲學家開啟一個線程,傳遞哲學家編號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");〃初始化隨機數種子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';〃根據傳遞參數獲取哲學家編號intrand_time;! !while⑴{〃關鍵代碼加鎖pthread_mutex_lock(&mutex);〃如果該哲學家處于饑餓并且左右兩位哲學家都沒有在吃飯就拿起叉子吃飯if(state[num]==HUNGRY&&state[LEFT(num)]!=EATING&&| |state[RIGHT(num)]!=EATING){| | 'state[num]=EATING;start_eating_time[num]=clock();//記錄開始吃飯時間eating_time[num]=(rand()%5+5)*U_SECOND;〃隨機生成吃飯時間〃輸出狀態(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){〃吃飯時間已到,開始思考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();/記錄開始思考時間thinking_time[num]=(rand()%10+10)*U_S
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2026學年臨猗縣數學三上期末學業(yè)質量監(jiān)測試題含解析
- 2024年云南省昆明市云南師范大學附屬小學數學三年級第一學期期末考試試題含解析
- 2024年湖南省長沙市望城縣三上數學期末考試試題含解析
- 臨床護理流程試題及答案概覽
- 2025年醫(yī)師考試案例分析與解讀試題及答案
- 2025年行政管理??莆幕耪摽荚囋囶}及答案提綱
- 2025年執(zhí)業(yè)醫(yī)師考試考生經驗試題及答案
- 2025年文化節(jié)的管理與策劃試題及答案
- 執(zhí)業(yè)護士考試小組復習方法試題及答案
- 行政管理??粕Z文測試復習試題及答案
- 低壓電工考證培訓教程
- 思想道德與法治2023版教學設計第二章 追求遠大理想 堅定崇高信念
- 21ZJ111 變形縫建筑構造
- 個人不擔當不作為問題清單及整改措施
- 《口袋妖怪漆黑的魅影》圖文攻略全周目
- 《網店美工實訓教程》教學教案
- 兒科護理學第二章生長發(fā)育
- 德語四級真題2023
- 2023屆高考模擬作文“人生有兩段路要走”漫畫作文導寫及范文
- 機電安裝施工工藝及質量驗收標準
- JB/T 20051-2018炒藥機
評論
0/150
提交評論