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

📄 customer.c~

📁 进一步研究和实践操作系统中关于并发进程同步与互斥操作的一些经典问题的解法
💻 C~
字号:
#include "ipc.h"int main(int argc,char *argv[]){	int pid[50]={0}; //存放子进程号	int status[50]={0}; //存放子进程返回状态	int i;	int bar;   	int rate;   	Msg_buf msg_arg;	if(argv[1] != NULL) rate = atoi(argv[1]);  	else rate = 3;	//建立一条请求消息队列,存放理发师的请求与新顾客的请求   	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);	quest_flg = IPC_NOWAIT; //以非阻塞方式接收请求消息		for(i=0;i<50;i++)	{		if((i+1)%15==0)		{			sleep(rate);		}		if((pid[i]=fork())==0)		{			i=getpid();						msg_arg.mtype = CUSTOMERREQUEST;			msg_arg.mid=i;						msgsnd(quest_id,&msg_arg,sizeof(msg_arg),0);//请求理发			msgrcv(respond_id,&msg_arg,sizeof(msg_arg),i,0);//等待			if(msg_arg.mid==CHAIR)			{								printf("%d 号客户坐上理发椅\n",i);								msgrcv(queen_id1,&msg_arg,sizeof(msg_arg),i,0);				bar=msg_arg.mid;				printf("%d 号客户接受%d 号理发师理发\n",i,bar);				msgrcv(queen_id1,&msg_arg,sizeof(msg_arg),i,0);				msg_arg.mtype = i;				msg_arg.mid=12;//付12元钱					msgsnd(queen_id1,&msg_arg,sizeof(msg_arg),0);//付费				printf("%d 号客户付%d 号理发师%d 元钱\n",i,bar,msg_arg.mid);				}			else if(msg_arg.mid==SOFA)			{				printf("%d 号客户坐上沙发\n",i);									msgrcv(respond_id,&msg_arg,sizeof(msg_arg),i,0);//等待				if(msg_arg.mid==CHAIR)				{									printf("%d 号客户坐上理发椅\n",i);									msgrcv(queen_id1,&msg_arg,sizeof(msg_arg),i,0);					bar=msg_arg.mid;					printf("%d 号客户接受%d 号理发师理发\n",i,bar);					msgrcv(queen_id1,&msg_arg,sizeof(msg_arg),i,0);					msg_arg.mtype = i;					msg_arg.mid=12;//付12元钱						msgsnd(queen_id1,&msg_arg,sizeof(msg_arg),0);//付费					printf("%d 号客户付%d 号理发师%d 元钱\n",i,bar,msg_arg.mid);					}			}			else if(msg_arg.mid== WAITINGROOM)			{				printf("%d 号客户走进客厅\n",i);									msgrcv(respond_id,&msg_arg,sizeof(msg_arg),i,0);//等待				if(msg_arg.mid==SOFA)				{					printf("%d 号客户坐上沙发\n",i);										msgrcv(respond_id,&msg_arg,sizeof(msg_arg),i,0);//等待					if(msg_arg.mid==CHAIR)					{										printf("%d 号客户坐上理发椅\n",i);										msgrcv(queen_id1,&msg_arg,sizeof(msg_arg),i,0);						bar=msg_arg.mid;						printf("%d 号客户接受%d 号理发师理发\n",i,bar);						msgrcv(queen_id1,&msg_arg,sizeof(msg_arg),i,0);						msg_arg.mtype = i;						msg_arg.mid=12;//付12元钱							msgsnd(queen_id1,&msg_arg,sizeof(msg_arg),0);//付费						printf("%d 号客户付%d 号理发师%d 元钱\n",i,bar,msg_arg.mid);						}				}			}			else				printf("%d 号客户没有理发,直接离开\n",i);			}	}	if(pid[0]>0)	{		for(i=0;i<50;i++)		{			waitpid(pid[i],&status[i],0);		}		}	return EXIT_SUCCESS;}

⌨️ 快捷键说明

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