亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? barber_ok.c

?? 改進的理發店問題
?? C
字號:
#include	<sys/types.h>
#include	<sys/ipc.h>
#include	<sys/sem.h>
#include	<sys/shm.h>
#include	<stdio.h>
#include	<unistd.h>

#define	DEFAULT_N		(15+3)	/*沒有參數時,缺省為15個顧客和3個理發師*/

/*宏定義wait和signal*/
#define SIGNAL(A,B)			V.sem_num = (A+B);if(semop(semid,&V,1)==-1) { perror("signal fail");exit(1);}
					
#define WAIT(A,B)			P.sem_num = (A+B);if(semop(semid,&P,1)==-1) { perror("wait fail");exit(1);}
				

union	semun
{
	int		val;/*for SETVAL*/
	struct semid_ds *buf;/*for IPC_STAT and IPC_SET*/
	ushort		*array;/*for GETALL and SETALL*/
};

enum
{
	MAX_CAPACITY=0,
	SOFA,
	BARBER_CHAIR,
	CASHIER=5,
	MUTEX,
	CUST_READY=7,
	LEAVE_B_CHAIR=10,
	PAYMENT=13,
	RECEIPT=16,
	FINISHED=19,
	queueLOCK=22
};

static struct	sembuf P = {0,-1,SEM_UNDO},V = {0,1,SEM_UNDO};
			/******wait和signal操作******/
static ushort	start_val[23] = {20,4,1,1,1,1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1};
			/******23個信號量的初值******/
static int		semid,shmid;/*信號量ID和共享內存ID*/

struct QueueType
{
	int	value[4];
	int out;
	int	in;
};


void	enqueue(struct QueueType* q,int val )/*入隊列*/
{
	if((q->in+1)%4==q->out)
	{
		printf("queue is full\n");
		return;
	}
	else
	{
		q->value[q->in] = val;
		q->in = (q->in+1)%4;
		printf("Barber %d(his pid is %d) is ready ,he wants to send No.%d to a customer\n",val,getpid(),val);
	}
			
}
void	dequeue(struct QueueType* q,int *val,int i)/*出隊列*/
{
	if(q->out==q->in)
	{
		printf("queue is empty\n");
		return;
	}
	else{
		*val = q->value[q->out];
		q->out = (q->out+1)%4;
		printf("Customer %d has got the No.%d\n",i,*val);
	}
}
void	enter_shop(int j)
{
	printf("Customer %d enter the barber shop.\n",j);
}

void	sit_on_sofa(int j)
{
	printf("Customer %d sit on the sofa.\n",j);
}

void	get_up_from_sofa(int j)
{
	printf("Customer %d get up from sofa.\n",j);
}

void	sit_in_barber_chair(int j)
{
	printf("Customer %d sit in the barber chair.\n",j);
}

void	leave_barber_chair(int j)
{
	printf("Customer %d leave the barber chair.\n",j);
}

void	pay(int  j)
{
	printf("Customer %d pay the money.\n",j);
}

void	exit_shop(int j)
{
	printf("Customer %d exit shop.\n",j);
}

void	accept_pay(int bnum)
{
	printf("Barber %d accept the payment .\n",bnum);
	printf("Barber %d has given the receipt .\n",bnum);
}

void	cut_hair(int bnum)
{
	sleep(0.5);
	printf("Barber %d is cutting hair.\n",bnum);
	printf("Barber %d has finished cutting hair.\n",bnum);
}

void	customer(struct QueueType *queue,int i)
{
	int chairnum;/*顧客取得的椅子號碼*/
	WAIT(MAX_CAPACITY,0);/*顧客等待進門*/
	enter_shop(i);/*進門*/
	WAIT(SOFA,0);/*等待沙發*/
	sit_on_sofa(i);/*顧客在沙發上等待*/
	WAIT(MUTEX,0);/***有空閑的理發師?***/
	WAIT(queueLOCK,0);/*確保顧客從等待隊列中取號碼不被打斷*/
		//WAIT(MUTEX,0);/***有空閑的理發師?***/
		dequeue(queue,&chairnum,i);/*顧客從隊列中取得椅子號碼*/
	SIGNAL(queueLOCK,0);/*確保顧客從等待隊列中取號碼不被打斷*/
	WAIT(BARBER_CHAIR,chairnum);/*顧客等待自己號碼的理發椅*/
	get_up_from_sofa(i);/*顧客離開沙發*/
	SIGNAL(SOFA,0);/*釋放沙發資源*/
	sit_in_barber_chair(i);/*顧客坐上理發椅*/
	SIGNAL(CUST_READY,chairnum);/*顧客告之已在自己號碼的理發椅上做好準備*/
	WAIT(FINISHED,chairnum);/*顧客等待理發完成*/
	leave_barber_chair(i);/*顧客離開理發椅*/
	SIGNAL(LEAVE_B_CHAIR,chairnum);/*釋放理發椅資源*/
	//WAIT(CASHIER,0);/*等待收銀員*/
	pay(i);/*付帳*/
	SIGNAL(PAYMENT,chairnum);/*顧客索要自己的收據*/
	WAIT(RECEIPT,chairnum);/*顧客等待自己應得的收據*/
	exit_shop(i);/*顧客離開理發店*/
	SIGNAL(MAX_CAPACITY,0);/*釋放理發店資源*/
}

void	barber(int num,struct QueueType* queue)/*理發師同時兼職收銀員*/
{
	WAIT(queueLOCK,0);/*確保理發師發放顧客號碼時不被打斷*/
		enqueue(queue,num);
		SIGNAL(MUTEX,0);/***已有空閑的理發師***/
	SIGNAL(queueLOCK,0);/*確保理發師發放顧客號碼時不被打斷*/
	
	while(1) {
		WAIT(CUST_READY,num);/*理發師等待,直到有一個顧客坐上自己的理發椅*/
		cut_hair(num);/*理發過程*/
		SIGNAL(FINISHED,num);/*告之自己的顧客已完成理發*/
		WAIT(LEAVE_B_CHAIR,num);/*理發師等待自己的顧客從理發椅中站起*/
		SIGNAL(BARBER_CHAIR,num);/*理發師在它的理發椅空時發信號*/
		WAIT(PAYMENT,num);/*理發師接著等待收銀*/
		accept_pay(num);/*提供收據*/
		SIGNAL(RECEIPT,num);/*告之自己的顧客已發出收據*/
		//SIGNAL(CASHIER,0);/*確保收銀過程不被打斷*/
		WAIT(queueLOCK,0);/*確保理發師取顧客號碼時不被打斷*/
			enqueue(queue,num);
		SIGNAL(MUTEX,0);/*已有空閑的理發師*/	
		SIGNAL(queueLOCK,0);/*確保理發師取顧客號碼時不被打斷*/
	
	}
}

void create_barber(struct QueueType *queue,char* shmptr,pid_t pid)
{
int i;
for( i=0; i<3; i++ )
	{
		if( (pid = fork())<0 )
			perror("fork error");
		else if( pid == 0 )/*子進程*/
				{
				if( (shmptr = (char*) shmat(shmid,(char*)0,0) ) ==(char*)-1) 
					{
					perror("get mermory shmat in child");
					exit(4);
					}
				queue = (struct QueueType *)shmptr;
				barber(i+1,queue);
				shmdt(shmptr);/*刪除物理鏈接*/
				sleep(3);
				_exit(0);
				}
	}
}

void create_customer1(struct QueueType *queue,char* shmptr,pid_t pid,int max)
{
int i;
for( i=0; i<max-3; i++ )
	{
		if( (pid = fork())<0 )
			perror("fork error");
		else if( pid == 0 )/*子進程*/
				{
				if( (shmptr = (char*) shmat(shmid,(char*)0,0) ) ==(char*)-1) 
					{
					perror("get mermory shmat in child");
					exit(4);
					}
				queue = (struct QueueType *)shmptr;
				customer(queue,i+1);
				shmdt(shmptr);/*刪除物理鏈接*/
				sleep(3);
				_exit(0);
				}
	}
}

void create_customer2(struct QueueType *queue,char* shmptr,pid_t pid,int max,int av)
{
int i,upbound;
upbound=2*av+1;
srand( (unsigned int)time(NULL) );
for( i=0; i<max-3; i++ )
	{
		if( (pid = fork())<0 )
			perror("fork error");
		else if( pid == 0 )/*子進程*/
				{
				sleep( rand() % upbound );
				if( (shmptr = (char*) shmat(shmid,(char*)0,0) ) ==(char*)-1) 
					{
					perror("get mermory shmat in child");
					exit(4);
					}
				queue = (struct QueueType *)shmptr;
				customer(queue,i+1);
				shmdt(shmptr);/*刪除物理鏈接*/
				sleep(3);
				_exit(0);
				}
	}
}

int main( int argc, char *argv[] )
{
	pid_t		pid;
	union semun	arg;
	int		order;
	int		max;
	int		i=0;
	key_t		key;
	char 		*shmptr;
	static struct QueueType q;
	struct QueueType 	*queue;

	q.out = q.in = 0;
	
	if(argc>2)
	{
		printf("usage: barbershop [number]\n");
		exit(1);
	}
		
	max = (argc==1)?DEFAULT_N:(atoi(argv[1])+3);
	
	if( (semid = semget( IPC_PRIVATE,23,IPC_CREAT|IPC_EXCL|0600))!=-1)
		/*創建23個信號量,返回信號量ID*/
	{
		arg.array = start_val;
		if( semctl( semid, 0, SETALL, arg )==-1 ) 
		/*按arg.array指向的數組中的值設置該集合中所有信號量的值*/
		{
			perror("semctl error");
			exit(1);
		}
	}
	else if( ( semid = semget( IPC_PRIVATE, 23, 0 ))==-1 ) /*返回信號量ID*/
	{
		perror("semget error");
		exit(2);
	}
	
	if( (shmid = shmget( IPC_PRIVATE, sizeof(q), IPC_CREAT|0600)) != -1) 
	/*創建共享存儲區,返回一個共享存儲標識符*/
	{
		if( (shmptr = (char*)shmat(shmid,0,0)) == (char*)-1 )/*連接到物理地址*/
		{
			perror("shmptr_parent_attach");
			exit(1);
		}
		memcpy(shmptr,(char*)&q,sizeof(q));/*復制存儲區*/
	}
	else
	{
		perror("shmid_parent_creation");
		exit(2);
	}


	printf("\n***** Welcome to XMUCSD Barber Shop, cheap but best in the world! *****\n\n");
	create_barber(queue,shmptr,pid);
	//create_customer1(queue,shmptr,pid,max);
	create_customer2(queue,shmptr,pid,max,2);
	sleep(5);
	shmctl(shmid,IPC_RMID,0);/*從系統中刪去共享存儲段*/

	while(wait(0) != -1 && i++ < max-3);
	if( semctl(semid,0,IPC_RMID,0)==-1 ) /*刪除信號量集合*/
	{
		perror("semctl delete error");
		exit(4);
	}
	return 0;
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品乱码久久久久久黑人| 日韩免费观看高清完整版在线观看| 蜜桃视频在线一区| 久久66热re国产| 久久99久久99精品免视看婷婷 | 婷婷六月综合亚洲| 免费在线观看精品| 国产麻豆成人精品| 成人久久久精品乱码一区二区三区| 国产精品一卡二卡在线观看| 成人性生交大片免费看视频在线| 成人免费黄色大片| 91高清视频在线| 日韩精品专区在线| 中文字幕在线不卡一区二区三区 | 久久精品国产精品青草| 高清成人在线观看| 欧美日韩国产123区| 26uuuu精品一区二区| 亚洲成人在线观看视频| 日韩一区欧美小说| 日本女优在线视频一区二区| 狠狠狠色丁香婷婷综合久久五月| 福利一区福利二区| 欧美色图在线观看| 中文字幕第一页久久| 亚洲va欧美va人人爽午夜| 国产真实乱子伦精品视频| 白白色 亚洲乱淫| 欧美成人a在线| 午夜精品爽啪视频| 91同城在线观看| 精品美女被调教视频大全网站| 亚洲人123区| 国产suv一区二区三区88区| 91精品国产色综合久久不卡电影| 中文字幕一区二区三区在线观看 | 国产丶欧美丶日本不卡视频| 制服.丝袜.亚洲.中文.综合| 亚洲人123区| 日本韩国欧美一区| 一区二区三区中文字幕精品精品| 国产麻豆视频一区二区| 日韩欧美一区中文| 美女性感视频久久| 国产亚洲精品bt天堂精选| 激情久久五月天| 一区在线播放视频| 欧美三级日韩三级国产三级| 亚洲香肠在线观看| 日韩女同互慰一区二区| 韩国在线一区二区| 国产精品久久久久久久午夜片| 国产成人啪免费观看软件| 成人欧美一区二区三区| 欧美午夜视频网站| 国产一区二区在线看| 国产精品的网站| 欧美日韩亚洲综合一区二区三区 | 精品视频一区三区九区| 亚洲国产精品久久久久秋霞影院| 欧美色网一区二区| 国产精品一卡二| 一区二区三区欧美| 日本一区二区在线不卡| 色婷婷狠狠综合| 婷婷一区二区三区| 亚洲三级在线播放| 久久亚区不卡日本| 欧美日韩视频在线第一区| 国产二区国产一区在线观看| 亚洲午夜精品17c| 中文子幕无线码一区tr| 538在线一区二区精品国产| av中文字幕在线不卡| 精品一区二区三区免费毛片爱| 伊人色综合久久天天人手人婷| 国产婷婷色一区二区三区在线| 色94色欧美sute亚洲13| 成人国产精品免费观看视频| 激情综合五月婷婷| 精品在线观看视频| 日本欧美肥老太交大片| 日韩不卡一二三区| 日韩电影在线免费| 麻豆成人av在线| 久久精品国产一区二区三区免费看| 亚洲综合激情网| 亚洲自拍欧美精品| 亚洲成av人在线观看| 亚洲国产欧美日韩另类综合| 亚洲一区二区三区在线| 亚洲成人你懂的| 麻豆精品一区二区| 国产老肥熟一区二区三区| 国产成人综合网站| 91在线观看污| 欧美一卡在线观看| 国产色综合久久| 亚洲欧美一区二区不卡| 午夜亚洲福利老司机| 蜜桃视频在线观看一区二区| 国产一区三区三区| 中文字幕av一区二区三区免费看| 综合分类小说区另类春色亚洲小说欧美| 国产精品免费网站在线观看| 亚洲日本青草视频在线怡红院 | 国产在线不卡一区| 色婷婷精品久久二区二区蜜臀av| 欧美日韩国产免费一区二区| 精品国产自在久精品国产| 亚洲欧洲在线观看av| 另类欧美日韩国产在线| 色婷婷激情久久| 自拍视频在线观看一区二区| 老司机免费视频一区二区| 一本到不卡免费一区二区| 精品三级在线看| 午夜av一区二区三区| 91麻豆国产福利在线观看| 久久久久久久综合日本| 丝袜脚交一区二区| 在线观看亚洲精品视频| 中文字幕av在线一区二区三区| 日本欧美久久久久免费播放网| 欧美图片一区二区三区| 亚洲午夜免费福利视频| 色综合久久久久久久久| 亚洲免费av观看| 色综合天天综合网天天狠天天| 久久精品人人做人人爽97| 国产一区在线精品| 国产欧美一二三区| 97精品电影院| 亚洲精品免费电影| 欧美日韩国产高清一区| 日韩影院在线观看| 在线不卡欧美精品一区二区三区| 美女国产一区二区三区| 久久免费午夜影院| 91首页免费视频| 亚洲成人在线网站| 精品国产成人在线影院| 91女厕偷拍女厕偷拍高清| 97超碰欧美中文字幕| 亚洲六月丁香色婷婷综合久久 | 国产亚洲精品久| 91免费观看在线| 老司机一区二区| 一区在线观看视频| 日韩美女一区二区三区| 国产91精品精华液一区二区三区| 日韩毛片精品高清免费| 欧美一级二级三级蜜桃| 91麻豆国产自产在线观看| 日韩精品一区第一页| 成人欧美一区二区三区视频网页 | 一区二区三区精密机械公司| 26uuu色噜噜精品一区二区| 欧美色综合天天久久综合精品| 国产九色sp调教91| 精品在线免费观看| 日韩成人午夜精品| 亚洲大片在线观看| 亚洲图片欧美色图| 1024成人网色www| 国产天堂亚洲国产碰碰| 久久久久久久久久久久久女国产乱| 在线影视一区二区三区| 不卡电影一区二区三区| 国产传媒一区在线| 国产寡妇亲子伦一区二区| 国产制服丝袜一区| 国产福利精品导航| 不卡电影免费在线播放一区| 国产一区二区美女诱惑| 成人午夜伦理影院| 99久久久无码国产精品| 99久久伊人精品| 精品视频全国免费看| 在线亚洲精品福利网址导航| 在线观看亚洲精品视频| 欧美久久久久久久久中文字幕| 欧美精选一区二区| 久久久精品tv| 亚洲欧美视频在线观看视频| 亚洲综合精品久久| 国产精品一区三区| 色婷婷av一区二区三区软件 | 亚洲www啪成人一区二区麻豆| 午夜精品一区在线观看| 国产精品一区在线观看你懂的| 99热在这里有精品免费| 日韩午夜中文字幕| 亚洲日本va在线观看| 日韩国产成人精品| 国产不卡免费视频| 91麻豆精品国产91久久久久| 日韩美女视频一区二区在线观看| 国产精品家庭影院|