![操作系統(tǒng)利用信號量實現(xiàn)銀行叫號排隊系統(tǒng)課程設(shè)計實驗報告_第1頁](http://file4.renrendoc.com/view/a84056932cc46642feade6b227400d44/a84056932cc46642feade6b227400d441.gif)
![操作系統(tǒng)利用信號量實現(xiàn)銀行叫號排隊系統(tǒng)課程設(shè)計實驗報告_第2頁](http://file4.renrendoc.com/view/a84056932cc46642feade6b227400d44/a84056932cc46642feade6b227400d442.gif)
![操作系統(tǒng)利用信號量實現(xiàn)銀行叫號排隊系統(tǒng)課程設(shè)計實驗報告_第3頁](http://file4.renrendoc.com/view/a84056932cc46642feade6b227400d44/a84056932cc46642feade6b227400d443.gif)
![操作系統(tǒng)利用信號量實現(xiàn)銀行叫號排隊系統(tǒng)課程設(shè)計實驗報告_第4頁](http://file4.renrendoc.com/view/a84056932cc46642feade6b227400d44/a84056932cc46642feade6b227400d444.gif)
![操作系統(tǒng)利用信號量實現(xiàn)銀行叫號排隊系統(tǒng)課程設(shè)計實驗報告_第5頁](http://file4.renrendoc.com/view/a84056932cc46642feade6b227400d44/a84056932cc46642feade6b227400d445.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
操作系統(tǒng)課程設(shè)計題目:進程通信與進程同步機制實踐所在學(xué)院:計算機學(xué)院所在班級:軟件1201學(xué)生姓名:學(xué)生學(xué)號:指導(dǎo)教師:薛安榮2015年1月題目某銀行提供5個服務(wù)窗口(3個對私服務(wù)窗口,1個對公服務(wù)窗口,1個理財服務(wù)窗口)和10個供顧客等待的座位。顧客到達銀行時,若有空座位,則到取號機上領(lǐng)取一個號,等待叫號;若沒有空座位,則在門外等待或離開。取號機每次僅允許一位顧客使用,有對公、對私和理財三類號,每位顧客只能選取其中一個。當(dāng)營業(yè)員空閑時,通過叫號選取一位顧客,并為其服務(wù)。請用P、V操作寫出進程的同步算法。目的1、掌握基本的同步與互斥算法。2、學(xué)習(xí)使用Linux中基本的同步對象,掌握相關(guān)API的使用方法。3、了解Linux中多任務(wù)的并發(fā)執(zhí)行機制,實現(xiàn)進程的同步與互斥。實驗環(huán)境LinuxCentOS編譯器GCC編程語言C語言要求當(dāng)有顧客取號的時候,不允許其他顧客取號。當(dāng)服務(wù)窗口滿的情況下,其他人必須等待。當(dāng)沒有顧客的情況下,服務(wù)窗口必須等待。打?。篈、初始狀態(tài)B、中間變化的狀態(tài)信息C、以及最終狀態(tài)信息。原理及算法本程序中設(shè)計6個信號量,其中signal_A、signal_B和signal_C分別是對私、對公、理財窗口的同步信號量。若信號量值的等于0,說明當(dāng)前沒有空閑空口,顧客需要等待。另設(shè)置一個signal_seat同步信號量,記錄當(dāng)前的座位情況,若該信號量等于0,說明當(dāng)前沒有空座位,顧客需要等待。另有一個signal_customer同步信號量用于記錄當(dāng)前已經(jīng)取過票的總?cè)藬?shù),用于生成票號信息。還有一個mutex互斥信號量,用于實現(xiàn)各進程在對信號量進行操作時的互斥。顧客進入銀行之后,先看通過一個依據(jù)系統(tǒng)時間的隨機數(shù)來確定自己是需要對私、對公還是理財服務(wù)(在本程序中分別對應(yīng)于A類顧客,B類顧客和C類顧客),這三個類型的顧客的比例為3:1:1.然后顧客根據(jù)自己需要的服務(wù)類型,查看提供相應(yīng)類型服務(wù)的窗口是否空閑,若窗口有空閑,則系統(tǒng)直接按照signal_customer記錄的信息,生成票面信息;若窗口沒有空閑,則再去查看signal_seat信號量看看是否有空座位,若有空座位,則根據(jù)signal_customer記錄的信息,生成票面信息;若沒有空座位,則通過一個以系統(tǒng)時間為種子的隨機數(shù)生成器生成一個隨機數(shù),幫助顧客確定是要繼續(xù)等待還是離開,這兩種情況的比例為1:1.若顧客選擇離開,則相應(yīng)的進程退出。當(dāng)顧客取到票后,便開始查看對應(yīng)類型的窗口是否有空閑,如果有空閑,則上前辦理業(yè)務(wù)。顧客辦理業(yè)務(wù)需要的時長通過以系統(tǒng)時間為種子的隨機數(shù)生成器來確定,時長均在10秒到60秒之間。在程序執(zhí)行的過程中,顧客的狀態(tài)每有變換,都會有相應(yīng)的輸出提示信息,并在輸出的行尾輸出發(fā)生該動作時當(dāng)前的系統(tǒng)時間,以便于我們分析各個顧客進程的執(zhí)行情況。說明本實驗在Linux環(huán)境下完成,該程序是通過進程實現(xiàn)的。包含一個service可執(zhí)行文件,一個customer可執(zhí)行文件和一個deletesem可執(zhí)行文件。其中service可執(zhí)行文件用于在內(nèi)存中申請一個共享內(nèi)存空間,并將這個內(nèi)存空間與自身進程綁定;customer可執(zhí)行文件每執(zhí)行一次,就增加一個進程,即代表有一位顧客來到。通過多次執(zhí)行customer可執(zhí)行文件來模擬多位顧客;deletesem可執(zhí)行文件用于在service進程和customer進城都執(zhí)行完畢后,刪除內(nèi)存空間中的信號集。實驗中利用GCC編譯器,通過編寫Makefile文件來快速編譯源代碼生成以上三個可執(zhí)行文件。程序中各主要函數(shù)說明intcreateshm(char*pathname,intproj_id,size_tsize)創(chuàng)建共享內(nèi)存的函數(shù),操作成功則返回共享內(nèi)存標(biāo)識符,失敗返回-1.intcreatesem(constchar*pathname,intproj_id,intmembers,intinit_val[])在共享內(nèi)訓(xùn)中創(chuàng)建信號量的函數(shù),操作成功則返回信號集標(biāo)識符,失敗返回-1.intopensem(constchar*pathname,intproj_id)打開信號集函數(shù),操作成功則返回信號集標(biāo)識符,失敗返回-1.intsem_p(intsemid,intindex)P操作函數(shù),操作成功則返回0,失敗返回-1.intsem_v(intsemid,intindex)V操作函數(shù),操作成功則返回0,失敗返回-1.intwait_sem(intsemid,intindex)等待信號量為1函數(shù),操作成功返回1.intdelete_sem(intsemid)刪除信號集函數(shù),操作成功返回0.intget_sem_val(intsemid,intindex)獲取指定信號集中指定下標(biāo)的信號量的值,操作成功返回該信號量的值。intmy_random()自定義隨機數(shù)生成器,以系統(tǒng)時間為種子,每次執(zhí)行前延時1秒,以便于生成不同的隨機數(shù)。voidprint_time()打印當(dāng)前系統(tǒng)時間。intget_ticket(intsemid,charidentifyLabel,int*ticket,int*flag)顧客取票函數(shù),取票成功,返回1,失敗返回-1,,由于沒有空座,顧客選擇離開則返回0。voidservice(intsemid,charidentifyLabel,int*ticket,int*flag)顧客辦理業(yè)務(wù)函數(shù)。源程序清單sharemem.h文件#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/types.h>#include<sys/ipc.h>#include<sys/sem.h>#include<sys/shm.h>#include<errno.h>#include<time.h>#defineSHM_SIZE1024#defineINDEX_MUTEX0#defineINDEX_SIGNAL_SEAT1#defineINDEX_SIGNAL_CUSTOMER2#defineINDEX_SIGNAL_A3#defineINDEX_SIGNAL_B4#defineINDEX_SIGNAL_C5/*定義信號量*//*同步信號量一共有4個*/intsignal_A=3,signal_B=1,signal_C=1,signal_seat=3,signal_customer=0;/*互斥信號量mutex控制進程對每個同步信號量的操作*/intmutex=1;intsignal_count=6; //信號量計數(shù)器,記錄一共有多少信號量unionsemun{ intval; structsemid_ds*buf; unsignedshort*array;};/*創(chuàng)建共享內(nèi)存函數(shù)*/intcreateshm(char*pathname,intproj_id,size_tsize){ key_tshmkey; intsid; /*獲取鍵值*/ if((shmkey=ftok(pathname,proj_id))==-1) { perror("ftokerror!\n"); exit(1); return-1; } if((sid=shmget(shmkey,size,IPC_CREAT|0666))==-1) { perror("shmgetcallfailed.\n"); exit(1); return-1; } return(sid);}/*定義創(chuàng)建信號量的函數(shù)*/intcreatesem(constchar*pathname,intproj_id,intmembers,intinit_val[]){ key_tmsgkey; intindex,sid; unionsemunsemopts; if((msgkey=ftok(pathname,proj_id))==-1) { perror("ftokerror!\n"); exit(1); return-1; } if((sid=semget(msgkey,members,IPC_CREAT|0666))==-1) { perror("semgetcallfailed.\n"); exit(1); return-1; } /*對信號量進行初始化操作*/ for(index=0;index<members;index++) { semopts.val=init_val[index];//根據(jù)init_val數(shù)組中的值對各個信號量進行初始化 semctl(sid,index,SETVAL,semopts); } return(sid);}/*打開信號量函數(shù)*/intopensem(constchar*pathname,intproj_id){ key_tmsgkey; intsid; if((msgkey=ftok(pathname,proj_id))==-1) { perror("ftokerror!\n"); exit(1); return-1; } if((sid=semget(msgkey,0,IPC_CREAT|0666))==-1) { perror("semgetcallfailed.\n"); exit(1); return-1; } return(sid);}/*P操作函數(shù)*/intsem_p(intsemid,intindex){ structsembufbuf={0,-1,IPC_NOWAIT}; if(index<0) { perror("indexofarraycannotequalsaminusvalue!"); exit(1); return(-1); } buf.sem_num=index; if(semop(semid,&buf,1)==-1) { perror("awrongoperationtosemaphoreoccurred!"); exit(1); return-1; } return0;}/*V操作函數(shù)*/intsem_v(intsemid,intindex){ structsembufbuf={0,+1,IPC_NOWAIT}; if(index<0) { perror("indexofarraycannotequalsaminusvalue!"); exit(1); return(-1); } buf.sem_num=index; if(semop(semid,&buf,1)==-1) { perror("awrongoperationtosemaphoreoccurred!"); exit(1); return(-1); } return0;}/*等待信號量為1函數(shù)*/intwait_sem(intsemid,intindex){ while(semctl(semid,index,GETVAL,0)==0) { usleep(10000); } return1;}/*刪除信號集函數(shù)*/intdelete_sem(intsemid){ return(semctl(semid,0,IPC_RMID));}/*獲取指信號量的值*/intget_sem_val(intsemid,intindex){ returnsemctl(semid,index,GETVAL,0);}/*我的隨機數(shù)生成器*/intmy_random(){ usleep(1000000); //延時函數(shù),延時1秒,以便于生成不同的隨機數(shù) srand((unsigned)time(NULL)); //初始化隨機數(shù)生成器 return(rand()); //調(diào)用隨機數(shù)生成器生成并返回隨機數(shù)}/*獲取當(dāng)前系統(tǒng)時間并靠右輸出*/voidprint_time(){ time_tnow; //實例化time_t結(jié)構(gòu) structtm*timenow; //實例化tm結(jié)構(gòu)指針 time(&now); //time函數(shù)讀取現(xiàn)在的時間(國際標(biāo)準(zhǔn)時間非北京時間),然后傳值給now timenow=localtime(&now); //localtime函數(shù)把從time取得的時間now換算成你電腦中的時間(就是你設(shè)置的地區(qū)) printf("Time:%s\n",asctime(timenow)); //asctime函數(shù)把時間轉(zhuǎn)換成字符,通過printf()函數(shù)靠右輸出}/*顧客取票函數(shù),取票成功,返回1,失敗返回-1,,由于沒有空座,顧客選擇離開則返回0*/intget_ticket(intsemid,charidentifyLabel,int*ticket,int*flag){ intwait_num=0; switch(identifyLabel) { case'A': if(get_sem_val(semid,INDEX_SIGNAL_SEAT)==0) { if((wait_num=my_random()%10)<5) return0; //返回0表示顧客選擇離開 printf("目前沒有空座位,但該顧客選擇了等待。\n\n"); } if(get_sem_val(semid,INDEX_SIGNAL_A)>0) //檢查,如果有空窗口,則直接取票,不用判斷座位 { *flag=0; //將標(biāo)志為設(shè)為0,標(biāo)示沒有顧客在等待,不用排隊 gotogoto_A; //跳轉(zhuǎn)到直接取票 } if(wait_sem(semid,INDEX_SIGNAL_SEAT)) //如果沒有空座,則等待空座 sem_p(semid,INDEX_SIGNAL_SEAT); goto_A:if(wait_sem(semid,INDEX_MUTEX)) //等待操作信號量釋放 sem_p(semid,INDEX_MUTEX); //鎖定操作信號量 *ticket=get_sem_val(semid,INDEX_SIGNAL_CUSTOMER)+1; //分配票號(票號是根據(jù)當(dāng)天的總顧客數(shù)排的) wait_num=(signal_seat-get_sem_val(semid,INDEX_SIGNAL_SEAT))-1; //獲取當(dāng)前等待的人數(shù) printf("號碼:A%03d,",*ticket); if(wait_num==0||*flag==0) { printf("當(dāng)前沒有顧客正在等待。\t"); //wait_num大于等于0或者flag大于0,表示當(dāng)前無人等待 print_time(); } else { printf("有%d位顧客正在等待。\t",wait_num); print_time(); } printf("顧客A%03d正在等待辦理業(yè)務(wù)。\t",*ticket); print_time(); if(sem_v(semid,INDEX_SIGNAL_CUSTOMER)!=0) //記錄目前辦理過業(yè)務(wù)和等待辦理業(yè)務(wù)的顧客總數(shù) { printf("對不起,V操作失??!"); exit(1); return-1; } sem_v(semid,INDEX_MUTEX); //釋放控制進程訪問資源的信號量 break; case'B': if(get_sem_val(semid,INDEX_SIGNAL_SEAT)==0) { if((wait_num=my_random()%10)<5) return0; //返回0表示顧客選擇離開 printf("目前沒有空座位,但該顧客選擇了等待。\n\n"); } if(get_sem_val(semid,INDEX_SIGNAL_B)>0) //檢查,如果有空窗口,則直接取票,不用判斷座位 { *flag=0; //將標(biāo)志為設(shè)為0,標(biāo)示沒有顧客在等待,不用排隊 gotogoto_B; //跳轉(zhuǎn)到直接取票 } if(wait_sem(semid,INDEX_SIGNAL_SEAT)) //如果沒有空座,則等待空座 sem_p(semid,INDEX_SIGNAL_SEAT); goto_B:if(wait_sem(semid,INDEX_MUTEX)) //等待操作信號量釋放 sem_p(semid,INDEX_MUTEX); //鎖定操作信號量 *ticket=get_sem_val(semid,INDEX_SIGNAL_CUSTOMER)+1; //分配票號(票號是根據(jù)當(dāng)天的總顧客數(shù)排的) wait_num=(signal_seat-get_sem_val(semid,INDEX_SIGNAL_SEAT))-1; //獲取當(dāng)前等待的人數(shù) printf("號碼:B%03d,",*ticket); if(wait_num==0||*flag==0) { printf("當(dāng)前沒有顧客正在等待。\t"); //wait_num大于等于0或者flag大于0,表示當(dāng)前無人等待 print_time(); } else { printf("有%d位顧客正在等待。\t",wait_num); print_time(); } printf("顧客B%03d正在等待辦理業(yè)務(wù)。\t",*ticket); print_time(); if(sem_v(semid,INDEX_SIGNAL_CUSTOMER)!=0) //記錄目前辦理過業(yè)務(wù)和等待辦理業(yè)務(wù)的顧客總數(shù) { printf("對不起,V操作失??!"); exit(1); return-1; } sem_v(semid,INDEX_MUTEX); //釋放控制進程訪問資源的信號量 break; case'C': if(get_sem_val(semid,INDEX_SIGNAL_SEAT)==0) { if((wait_num=my_random()%10)<5) return0; //返回0表示顧客選擇離開 printf("目前沒有空座位,但該顧客選擇了等待。\n\n"); } if(get_sem_val(semid,INDEX_SIGNAL_C)>0) //檢查,如果有空窗口,則直接取票,不用判斷座位 { *flag=0; //將標(biāo)志為設(shè)為0,標(biāo)示沒有顧客在等待,不用排隊 gotogoto_C; //跳轉(zhuǎn)到直接取票 } if(wait_sem(semid,INDEX_SIGNAL_SEAT)) //如果沒有空座,則等待空座 sem_p(semid,INDEX_SIGNAL_SEAT); goto_C:if(wait_sem(semid,INDEX_MUTEX)) //等待操作信號量釋放 sem_p(semid,INDEX_MUTEX); //鎖定操作信號量 *ticket=get_sem_val(semid,INDEX_SIGNAL_CUSTOMER)+1; //分配票號(票號是根據(jù)當(dāng)天的總顧客數(shù)排的) wait_num=(signal_seat-get_sem_val(semid,INDEX_SIGNAL_SEAT))-1; //獲取當(dāng)前等待的人數(shù) printf("號碼:C%03d,",*ticket); if(wait_num==0||*flag==0) { printf("當(dāng)前沒有顧客正在等待。\t"); //wait_num大于等于0或者flag大于0,表示當(dāng)前無人等待 print_time(); } else { printf("有%d位顧客正在等待。\t",wait_num); print_time(); } printf("顧客C%03d正在等待辦理業(yè)務(wù)。\t",*ticket); print_time(); if(sem_v(semid,INDEX_SIGNAL_CUSTOMER)!=0) //記錄目前辦理過業(yè)務(wù)和等待辦理業(yè)務(wù)的顧客總數(shù) { printf("對不起,V操作失敗!"); exit(1); return-1; } sem_v(semid,INDEX_MUTEX); //釋放控制進程訪問資源的信號量 break; } return1;}/*顧客接受服務(wù)函數(shù)*/voidservice(intsemid,charidentifyLabel,int*ticket,int*flag){ intneed_time=0; //用于記錄該顧客需要的服務(wù)時間 switch(identifyLabel) { case'A': if(wait_sem(semid,INDEX_SIGNAL_A)) //等待有空閑窗口 sem_p(semid,INDEX_SIGNAL_A); //走向窗口,即將接受服務(wù) if(wait_sem(semid,INDEX_MUTEX)) //等待操作信號量釋放 sem_p(semid,INDEX_MUTEX); //鎖定操作信號量 printf("顧客A%03d開始在對私窗口辦理業(yè)務(wù)。\t",*ticket); print_time(); if(*flag==1) //如果該顧客在進入銀行取票后等待了窗口,那么顧客開始辦理業(yè)務(wù)時即走向了窗口,需要釋放座位 sem_v(semid,INDEX_SIGNAL_SEAT); sem_v(semid,INDEX_MUTEX); //釋放控制進程訪問資源的信號量 /*接受服務(wù)(服務(wù)時長為1分鐘以內(nèi)并且大于10秒的任意時間)*/ need_time=my_random()%50+10; printf("該顧客需要的服務(wù)時長為:%d秒。\t",need_time); print_time(); sleep(need_time); //將該顧客進程掛起need_time秒,模擬該顧客正在接受服務(wù) if(wait_sem(semid,INDEX_MUTEX)) //等待操作信號量釋放 sem_p(semid,INDEX_MUTEX); //鎖定操作信號量 printf("顧客A%03d業(yè)務(wù)辦理完畢。\t",*ticket); print_time(); sem_v(semid,INDEX_SIGNAL_A); //業(yè)務(wù)辦理完成,離開窗口 sem_v(semid,INDEX_MUTEX); //釋放控制進程訪問資源的信號量 break; case'B': if(wait_sem(semid,INDEX_SIGNAL_B)) //等待有空閑窗口 sem_p(semid,INDEX_SIGNAL_B); //走向窗口,即將接受服務(wù) if(wait_sem(semid,INDEX_MUTEX)) //等待操作信號量釋放 sem_p(semid,INDEX_MUTEX); //鎖定操作信號量 printf("顧客B%03d開始在對公窗口辦理業(yè)務(wù)。\t",*ticket); print_time(); if(*flag==1) //如果該顧客在進入銀行取票后等待了窗口,那么顧客開始辦理業(yè)務(wù)時即走向了窗口,需要釋放座位 sem_v(semid,INDEX_SIGNAL_SEAT); sem_v(semid,INDEX_MUTEX); //釋放控制進程訪問資源的信號量 /*接受服務(wù)(服務(wù)時長為1分鐘以內(nèi)并且大于10秒的任意時間)*/ need_time=my_random()%50+10; printf("該顧客需要的服務(wù)時長為:%d秒。\t",need_time); print_time(); sleep(need_time); //將該顧客進程掛起need_time秒,模擬該顧客正在接受服務(wù) if(wait_sem(semid,INDEX_MUTEX)) //等待操作信號量釋放 sem_p(semid,INDEX_MUTEX); //鎖定操作信號量 printf("顧客B%03d業(yè)務(wù)辦理完畢。\t",*ticket); print_time(); sem_v(semid,INDEX_SIGNAL_B); //業(yè)務(wù)辦理完成,離開窗口 sem_v(semid,INDEX_MUTEX); //釋放控制進程訪問資源的信號量 break; case'C': if(wait_sem(semid,INDEX_SIGNAL_C)) //等待有空閑窗口 sem_p(semid,INDEX_SIGNAL_C); //走向窗口,即將接受服務(wù) if(wait_sem(semid,INDEX_MUTEX)) //等待操作信號量釋放 sem_p(semid,INDEX_MUTEX); //鎖定操作信號量 printf("顧客C%03d開始在理財窗口辦理業(yè)務(wù)。\t",*ticket); print_time(); if(*flag==1) //如果該顧客在進入銀行取票后等待了窗口,那么顧客開始辦理業(yè)務(wù)時即走向了窗口,需要釋放座位 sem_v(semid,INDEX_SIGNAL_SEAT); sem_v(semid,INDEX_MUTEX); //釋放控制進程訪問資源的信號量 /*接受服務(wù)(服務(wù)時長為1分鐘以內(nèi)并且大于10秒的任意時間)*/ need_time=my_random()%50+10; printf("該顧客需要的服務(wù)時長為:%d秒。\t",need_time); print_time(); sleep(need_time); //將該顧客進程掛起need_time秒,模擬該顧客正在接受服務(wù) if(wait_sem(semid,INDEX_MUTEX)) //等待操作信號量釋放 sem_p(semid,INDEX_MUTEX); //鎖定操作信號量 printf("顧客C%03d業(yè)務(wù)辦理完畢。\t",*ticket); print_time(); sem_v(semid,INDEX_SIGNAL_C); //業(yè)務(wù)辦理完成,離開窗口 sem_v(semid,INDEX_MUTEX); //釋放控制進程訪問資源的信號量 break; }}service.c文件#include<math.h>#include"sharemem.h"intmain(){ intinit_val[]={mutex,signal_seat,signal_customer,signal_A,signal_B,signal_C}; //信號集初始化值數(shù)組 intsemid,shmid; //信號集標(biāo)識符semid和共享內(nèi)存區(qū)標(biāo)識符shmid char*shmaddr; //共享內(nèi)存附加點 intbeforenumber=0,afternumber=0,temp=0; /*申請創(chuàng)建共享內(nèi)存空間,創(chuàng)建信號集(創(chuàng)建的同時已經(jīng)對信號集進行了初始化)*/ if((shmid=createshm(".",'m',SHM_SIZE))==-1) { exit(1); } /*將共享內(nèi)存區(qū)附加到進程的地址空間*/ if((shmaddr=shmat(shmid,(char*)0,0))==(char*)-1) { exit(1); } /*在共享內(nèi)存空間中創(chuàng)建信號集*/ if((semid=createsem(".",'s',signal_count,init_val))==-1) { exit(1); } /*循環(huán)輸出客流情況*/ while(1) { afternumber=signal_seat-get_sem_val(semid,INDEX_SIGNAL_SEAT); //取得當(dāng)前在座的人數(shù) temp=afternumber-beforenumber; //計算前一次查看時與這次查看時的人數(shù)差 if(temp>0) { printf("新增顧客%d位。\t",temp); print_time(); } elseif(temp<0) { temp=abs(temp); printf("有%d位顧客辦完業(yè)務(wù)并離開。\t",temp); print_time(); } beforenumber=afternumber; usleep(100); //每隔一定時間進行一次查詢輸出 } return0;}customer.c文件#include"sharemem.h"intmain(){ intsemid,shmid; //信號集標(biāo)識符semid和共享內(nèi)存區(qū)標(biāo)識符shmid char*shmaddr; //共享內(nèi)存附加點 charidentifyLabel; //標(biāo)志該進程(顧客)是需要那種服務(wù)(對私:A;對公:B;理財:D) intticket,flag=1; //顧客的票號和用于標(biāo)示該顧客需不需要排隊的變量,flag值為1表示需要排隊等待,值為0表示不需要排隊 /*根據(jù)隨機數(shù),按照6:2:2的比例確定顧客需要的服務(wù)類型*/ intrandomNumber=((my_random())%1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 日文版勞動合同
- 游戲開發(fā)引擎授權(quán)使用及技術(shù)支持服務(wù)協(xié)議
- 三字經(jīng)學(xué)習(xí)感悟
- Oleic-acid-Standard-生命科學(xué)試劑-MCE
- 小學(xué)生經(jīng)典國學(xué)啟蒙讀后感
- 2-2-Dibutylpropane-1-3-diol-生命科學(xué)試劑-MCE
- 年終團隊建設(shè)活動安排
- 年度銷售部門工作總結(jié)報告新趨勢與成效分析
- 公司融資計劃及投資策略分析
- 試用期員工勞動合同
- 2025年工貿(mào)企業(yè)春節(jié)復(fù)工復(fù)產(chǎn)方案
- 【道法】歷久彌新的思想理念課件 2024-2025學(xué)年統(tǒng)編版道德與法治七年級下冊
- 民辦中學(xué)班主任工作考核細(xì)則
- 2024年初三數(shù)學(xué)競賽考試試題
- 物業(yè)保潔員培訓(xùn)專業(yè)課件
- 飲品店操作流程圖
- 風(fēng)居住的街道鋼琴二胡合奏譜
- 六年級《我的夢想》作文指導(dǎo)(課堂PPT)
- PADS元件封裝制作規(guī)范要點
- 膠水行業(yè)中最常用的英文術(shù)語
- citrix桌面虛擬化平臺健康檢查指南10
評論
0/150
提交評論