Linux作業系統之程序通訊——使用訊息緩衝佇列實現client程序與server程序之間的通訊
阿新 • • 發佈:2018-12-16
使用訊息緩衝佇列來實現client程序和server程序之間的通訊。
問題描述如下:
-
- server程序先建立一個關鍵字為SVKEY(如75)的訊息佇列,然後等待接收型別為REQ(如1)的訊息;在收到請求訊息後,它便顯示字串“serving for client”和接收到的client程序的程序標識數,表示正在為client程序服務;然後再向client程序傳送一應答訊息,該訊息型別是client程序的程序標識數,而正文則是server程序自己的標識數。
-
- client程序則向訊息佇列傳送型別為REQ的訊息(訊息的正文為自己的程序標識數)以取得server程序的服務,並等待server程序發來的應答;然後顯示字串“receive reply form”和接收到的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); }