📄 基于消息的进程通讯.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 + -