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

📄 control.c

📁 进一步研究和实践操作系统中关于并发进程同步与互斥操作的一些经典问题的解法
💻 C
字号:
#include "ipc.h"int main(int argc,char *argv[]){   int i;   int rate;   int w_mid;   int count = MAXVAL;   Msg_buf msg_arg;   struct msqid_ds msg_inf;   //建立一个共享内存先写入一串 A 字符模拟要读写的内容   buff_key = 101;   buff_num =STRSIZ+1;   shm_flg = IPC_CREAT | 0644;   buff_ptr = (char *)set_shm(buff_key,buff_num,shm_flg);   for(i=0; i<STRSIZ; i++) buff_ptr[i] = 'A';   buff_ptr[i] = '\0';     //建立一条请求消息队列   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);   //控制进程准备接收和响应读写者的消息   printf("Wait quest \n");   while(1)	{ 		       //当 count 大于 0 时说明没有新的读写请求,查询是否有任何新请求         if(count > 0)			{		           quest_flg = IPC_NOWAIT; //以非阻塞方式接收请求消息		           if(msgrcv(quest_id,&msg_arg,sizeof(msg_arg),FINISHED,quest_flg) >= 0)					    {			                		//有读者完成               		 count++;               		 printf("%d reader finished\n",msg_arg.mid);   		       			    }         		  else  if(msgrcv(quest_id,&msg_arg,sizeof(msg_arg),READERQUEST,quest_flg)>=0)//如果quest_flg=0,则会使写者饿死						{            							//有读者请求,允许读者读              				count --;              				msg_arg.mtype = msg_arg.mid;              				msgsnd(respond_id,&msg_arg,sizeof(msg_arg),0);              				printf("%d quest read\n",msg_arg.mid);        					}        				else if(msgrcv(quest_id,&msg_arg,sizeof(msg_arg),WRITERQUEST,quest_flg) >=0)						{          							//有写者请求         		 			w_mid = msg_arg.mid;         		 			count -= MAXVAL;         							 //有读者正在读,则等待所有读者读完          					while(count < 0)								{              								//以阻塞方式接收读完成消息              					msgrcv(quest_id,&msg_arg,sizeof(msg_arg),FINISHED,0);              					count ++;              					printf("%d reader finish\n",msg_arg.mid);          							}          							//允许写者写          					msg_arg.mtype = w_mid;          					msgsnd(respond_id,&msg_arg,sizeof(msg_arg),0);          					printf("%d quest write \n",msg_arg.mid);     			 			}  			   }  			//当 count 等于 0 时说明写者正在写,等待写完成		  if(count == 0)		    {        			//以阻塞方式接收消息        		msgrcv(quest_id,&msg_arg,sizeof(msg_arg),FINISHED,0);        		count = MAXVAL;        		printf("%d write finished\n",msg_arg.mid);        		if(msgrcv(quest_id,&msg_arg,sizeof(msg_arg),READERQUEST,quest_flg) >=0)				{			        		//有读者请求,允许读者读           		   count --;              		msg_arg.mtype = msg_arg.mid;              		msgsnd(respond_id,&msg_arg,sizeof(msg_arg),0);              		printf("%d quest read\n",msg_arg.mid);		        	}    		       }  	}  return EXIT_SUCCESS;}

⌨️ 快捷键说明

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