⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 control.c

📁 进一步研究和实践操作系统中关于并发进程同步与互斥操作的一些经典问题的解法
💻 C
字号:
#include "ipc.h"int count;int waitingroom;int chair;int flag;int number;int main(int argc,char *argv[]){		Msg_buf msg_arg;				//建立一条请求消息队列,存放理发师的请求与新顾客的请求   	quest_flg = IPC_CREAT| 0644;   	quest_key = 201;   	quest_id = set_msq(quest_key,quest_flg);   		//联系一个响应消息队列  		respond_flg = IPC_CREAT|0644;   	respond_key = 202;   	respond_id = set_msq(respond_key,respond_flg);		//建立理发椅子队列  		My_flg1 = IPC_CREAT|0644;   	queen_key1 = 203;   	queen_id1= set_msq(queen_key1,My_flg1);		//建立沙发队列  		My_flg2 = IPC_CREAT|0644;   	queen_key2 = 204;   	queen_id2= set_msq(queen_key2,My_flg2);		//建立大厅队列  		My_flg3 = IPC_CREAT|0644;   	queen_key3 = 205;   	queen_id3= set_msq(queen_key3,My_flg3);		//控制进程准备接收和响应读写者的消息   	printf("Wait quest \n");		quest_flg = IPC_NOWAIT; //以非阻塞方式接收请求消息		count=0;		waitingroom=0;		chair=0;		flag=1;			while(1)		{						if(flag)						{								if(msgrcv(quest_id,&msg_arg,sizeof(msg_arg),RECIEVEMONEY,quest_flg) >= 0)//是否有理发师需要记账								{																		msg_arg.mtype = msg_arg.mid;									number =msg_arg.mid;              					msgsnd(respond_id,&msg_arg,sizeof(msg_arg),0);//允许记账									flag=0;								}												}						else if(msgrcv(quest_id,&msg_arg,sizeof(msg_arg),number,quest_flg))						{									flag=1;									chair--;									printf("%d 号理发师记完了帐\n",msg_arg.mid);																if(msgrcv(queen_id2,&msg_arg,sizeof(msg_arg),0,quest_flg) >= 0)//响应第一条消息									{										chair++;										count--;										msgsnd(queen_id1,&msg_arg,sizeof(msg_arg),0);										printf("%d 号客户从沙发坐上理发椅,等待理发\n",msg_arg.mid);																			msg_arg.mtype = msg_arg.mid;										msg_arg.mid = CHAIR;										msgsnd(respond_id,&msg_arg,sizeof(msg_arg),0);												if(msgrcv(queen_id3,&msg_arg,sizeof(msg_arg),0,quest_flg) >= 0)//响应第一条消息										{											count++;											waitingroom--;											msgsnd(queen_id2,&msg_arg,sizeof(msg_arg),0);											printf("%d 号客户从大厅坐上了沙发,等待理发\n",msg_arg.mid);																					msg_arg.mtype = msg_arg.mid;											msg_arg.mid = SOFA  ;											msgsnd(respond_id,&msg_arg,sizeof(msg_arg),0);											if(msgrcv(quest_id,&msg_arg,sizeof(msg_arg),CUSTOMERREQUEST,quest_flg) >= 0)											{												waitingroom++;												msgsnd(queen_id3,&msg_arg,sizeof(msg_arg),0);																											printf("%d 号客户走进大厅\n",msg_arg.mid);																						msg_arg.mtype = msg_arg.mid;												msg_arg.mid = WAITINGROOM;												msgsnd(respond_id,&msg_arg,sizeof(msg_arg),0);											}										}																			}									printf("%d chair\n",chair);																	printf("%d sofa\n",count);									printf("%d waitingroom\n",waitingroom);									}						if(msgrcv(quest_id,&msg_arg,sizeof(msg_arg),CUSTOMERREQUEST,quest_flg) >= 0)						{								printf("%d chair\n",chair);																printf("%d sofa\n",count);								printf("%d waitingroom\n",waitingroom);										if(chair<3)										{											chair++;											msgsnd(queen_id1,&msg_arg,sizeof(msg_arg),0);											printf("%d 号客户坐上理发椅\n",msg_arg.mid);																				msg_arg.mtype = msg_arg.mid;											msg_arg.mid = CHAIR;											msgsnd(respond_id,&msg_arg,sizeof(msg_arg),0);											}										else if(count<4)										{											count++;											msgsnd(queen_id2,&msg_arg,sizeof(msg_arg),0);											printf("%d 号客户坐上沙发\n",msg_arg.mid);																					msg_arg.mtype = msg_arg.mid;											msg_arg.mid = SOFA  ;											msgsnd(respond_id,&msg_arg,sizeof(msg_arg),0);										}										else if(waitingroom<13)										{											waitingroom++;											msgsnd(queen_id3,&msg_arg,sizeof(msg_arg),0);																										printf("%d 号客户走进大厅\n",msg_arg.mid);																					msg_arg.mtype = msg_arg.mid;											msg_arg.mid = WAITINGROOM;											msgsnd(respond_id,&msg_arg,sizeof(msg_arg),0);										}										else 										{											printf("%d 号客因人多没有理发离开\n",msg_arg.mid);																						msg_arg.mtype = msg_arg.mid;											msg_arg.mid = -1;											msgsnd(respond_id,&msg_arg,sizeof(msg_arg),0);											}						}		}	return EXIT_SUCCESS;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -