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

📄 基于消息的进程通讯.cpp

📁 基于消息的通讯系统设计 本设计的目的:是通过设计和调试一个基于消息的通讯系统
💻 CPP
字号:
#include"iostream.h"
#include"stdio.h"
#include"string.h"//头文件

const int M=3;    //消息队列长度:M条(由自己设定)
const int N=3;    //最大进程数目:N个(由自己设定)
int num=0,mutex=0;//进程数目num,临界区互斥量mutex

struct infom      //消息结构
{
	int inno,outno;  //输入,输出进程号
	char content[20];//内容
	infom *next;
}*q,*s,*r,*first;
struct process    //进程结构
{
	int no,in,out;   //自己,输入,输出进程号
	char content[20];//内容
}P[M];
void main()
{
	
	cout<<"说明:(1)本程序消息队列长度:"<<M<<"条"<<endl;
	cout<<"      (2)本程序最大进程数目:"<<N<<"个"<<endl;
	cout<<"      (3)本程序由操作者控制首先发送消息,然后再接收"<<endl;
	first=new infom;
	first->next=NULL; //初始化消息队列头指针
	do
	{
		if(num>0)
			cout<<"由于消息队列中有消息没被接收,继续循环!"<<endl;
	for(int i=0;i<N;i++) //设计进程运行循环体
	{
		int k=1;
		P[i].no=i; //初始化进程号
		cout<<"\n以下是对P["<<i<<"]的操作"<<endl;
		while(k)
		{
			if(num<=M) //判断消息数量是否满
			{
				cout<<"(1)发送 " <<endl ;
				cout<<"(2)接收 " <<endl ;
				cout<<"(0)退出 " <<endl ;
				cout<<"请选择:";
				cin>>k; //选择操作
				switch(k)
				{
				case 1:   //发送消息部分
					{
						if(num<M)
						{	
							cout<<"请输入接收进程号和内容:";
    						cin>>P[i].out>>P[i].content; //输入接收进程号和内容
						    if(mutex==0)
							{							    
    						  if(P[i].out>=0&&P[i].out<N) //判断接收消息号是否越界
							  {
								mutex=1;num++;  //互斥占用临界区变量mutex
        					    infom *mes;
        						mes=new infom;  //新申请消息指针
						       	mes->inno=P[i].no;
						       	mes->outno=P[i].out;
						       	strcpy(mes->content,P[i].content);
					        	if(num==1)
							    r=first;
						       	r->next=mes;  //利用尾插法新消息入队							
						        r=mes;	
						       	r->next=NULL;
						       	mutex=0;       //释放临界区变量mutex
						       	cout<<"进程P["<<i<<"]发送消息成功!"<<endl;
								cout<<"进程P["<<mes->outno<<"]请注意接收消息!"<<endl;//提醒进程同步接收
								if(mes->outno!=i&&mes->outno!=(i+1)&&(i+1)<M)  //判断消息是否等待接收
								cout<<"由于下一个运行的进程是P["<<i+1<<"],所以消息等待接收!"<<endl;//进程互斥等待
							  }
							    else
							    	cout<<"进程号越界!请重新选择!"<<endl;
							}
						    else
						    	cout<<"条件不满足(已经有进程在访问临界区),等待...."<<endl;
						}
						else
							cout<<"消息队列已满,请先接收,然后再发送!!!"<<endl;
						break;
					}
				case 2:    //接收消息部分
					{
						if(num>0)
						{
							s=first;
						    q=first->next;  //初始化工作指针
							while(q)
							{
								if(P[i].no==q->outno)//判断进程号是否相等
								{
									if(mutex==0)   //进程同步接收
									{
										mutex=1;num--;  //互斥占用临界区变量mutex
									    P[i].in=q->inno;
								        strcpy(P[i].content,q->content);
							    	    mutex=0;        //释放临界区变量mutex
							    	    cout<<"进程P["<<i<<"]接收消息成功!"<<endl;
									    cout<<"消息来自:"<<P[i].in<<"  内容是:"<<P[i].content<<endl;
										s->next=q->next;//删除已接收消息
									    break;    //接收一条消息后退出循环
									}
							        else
										cout<<"条件不满足(已经有进程在访问临界区),等待...."<<endl;
								}
								s=q;      //保存工作指针前驱
							    q=q->next;//工作指针下移
							}
							if(!q)
								cout<<"没有本进程的消息!"<<endl;
						}
						else
							cout<<"消息队列中没有消息,请先发送消息"<<endl;
						break;
					}
				default: break; //退出过程部分
				}
			}
			else
			{
				cout<<"消息队列已经放满!请先取出消息,然后再发送!"<<endl;
			    break;
			}
		}
	}
	}while(num>0);  //当消息队列中还有消息时,继续循环,直到没有消息为止
	cout<<"\n进程通讯过程结束! "<<endl;
}



/*
6、设计六  基于消息的通讯系统设计
目的与要求:
  本设计的目的:是通过设计和调试一个基于消息的通讯系统,来实现进程之间的间接通讯,
                使学生对进程间的通讯机制、进程间的同步机制有一个深入的理解。
具体要求如下:
  ⑴设计一个消息传递系统,使两进程以消息为单位进行数据交换;
  ⑵以间接方式进行这种传递,发送进程把消息发送到中间实体,接收进程从中取得消息;
  ⑶中间实体应能保留一定数量的消息(如,保留10条消息);
  ⑷两进程应保证同步与互斥。
*/

⌨️ 快捷键说明

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