1. 程式人生 > >Linux作業系統之程序通訊——使用訊息緩衝佇列實現client程序與server程序之間的通訊

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 <sys/types.h> 
#include <sys/msg.h> 
#include <sys/ipc.h> 
#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); 
}