Linux操作系统之进程通信——使用消息缓冲队列实现client进程与server进程之间的通信

使用消息缓冲队列来实现client进程和server进程之间的通信。

 问题描述如下:

 

    • server进程先建立一个关键字为SVKEY(如75)的消息队列,然后等待接收类型为REQ(如1)的消息;在收到请求消息后,它便显示字符串“serving for client”和接收到的client进程的进程标识数,表示正在为client进程服务;然后再向client进程发送一应答消息,该消息类型是client进程的进程标识数,而正文则是server进程自己的标识数。
    • client进程则向消息队列发送类型为REQ的消息(消息的正文为自己的进程标识数)以取得server进程的服务,并等待server进程发来的应答;然后显示字符串“receive reply form”和接收到的server进程的标识符。

 代码如下:

#include  
#include  
#include  
#define SVKEY 75 //定义关键字SVKEY
struct msgform  //消息结构
{
   long mtype; 
   char mtext[250];  //文本长度
}msg; 
int msgqid,pid,*pint,i; 
void client() 
{ 
   msgqid=msgget(SVKEY,0777);  //打开 75#消息队列
   pid=getpid();  //获取client进程标识符
   pint=(int *)msg.mtext;  //把正文的内容传给 pint,并强制转换类型
   *pint=pid;  //pint指针指向client进程标识符
   msg.mtype=1;  //消息类型为 1
   msgsnd(msgqid,&msg,sizeof(int),0);  //发送消息msg入msgqid消息队列
   msgrcv(msgqid,&msg,250,pid,0);  //从队列msgqid接收消息msg 
   printf("(client):receive reply from pid=%d\n",*pint);  //显示 server进程标识数
   exit(0); 
} 
void server( ) 
{ 
   msgqid=msgget(SVKEY,0777|IPC_CREAT);  //创建 75#消息队列 
   msgrcv(msgqid,&msg,250,1,0);  //接收client进程标识数消息 
   pint=(int *)msg.mtext;  //把正文的内容传给 pint,并强制转换类型 
   pid=*pint;  //获得 cilent 进程标识数
   printf("(server):serving for client pid=%d\n",pid); 
   msg.mtype=pid;  //消息类型为 client 进程标识数
   *pint=getpid();  //获取 server 进程标识数 
   msgsnd(msgqid,&msg,sizeof(int),0);  //发送消息 
   exit(0); 
} 
main() 
{ 
   while((i=fork())==-1);  //创建进程 1 
   if(!i)server(); 
   while((i=fork())==-1); //创建进程 2 
   if(!i) client(); 
   wait(0); 
   wait(0); 
}

 

你可能感兴趣的:(OS)