?? 基于消息的進程通訊.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 + -