訊息緩衝是unix系統程序之間進行大量資料交換的機制之一。訊息緩衝是基於訊息佇列的。傳送程序將訊息掛入接收程序的訊息佇列,接收程序從訊息佇列中接收訊息。訊息是指具有型別和數量的乙個資料。訊息分共有和私有的,如果訊息為私有的,只能被建立訊息佇列的程序和其子程序訪問;如果是公有的,可以被系統中知道訊息佇列名的所有程序訪問。訊息可以按型別訪問,因此,不必按序訪問。關於這方面的好多知識,我也不是特別了解,有需要的可以自行google.
為了理解程序利用訊息緩衝的通訊過程,下面給出兩個例子
一、建立乙個私有訊息佇列,乙個程序自己傳送訊息和接收訊息。建立乙個訊息佇列,之後將乙個訊息「hello,world」放入訊息佇列。在從訊息佇列進行接收,並列印出所接受的訊息。
#include#include#include#define _use_gnu
#include#include#includestruct msgbuf;
int main(int argc,char *argv)
printf("the created message's id ='%d'.\n",queue_id);
//分配乙個訊息結構"hello world!"
msg = (struct msgbuf *)malloc(sizeof(struct msgbuf)+strlen("hello,world"));
msg -> mtype = 1;//訊息佇列的索引賦值為1
strcpy(msg -> mtext,"hello world");//將字串複製到訊息體中
//傳送訊息
rc = msgsnd(queue_id,msg,strlen(msg -> mtext) + 1,0);
//這裡的+1是指字串的結束符
if(rc == -1)
else
printf("%d\n",rc);
free(msg);//釋放訊息占用的空間
printf("message is placed on message's queue\n");
//接收訊息
recv_msg = (struct msgbuf *)malloc(sizeof(struct msgbuf)+strlen("hello world")+1);
msgsz = strlen(recv_msg -> mtext) + 1;
rc = msgrcv(queue_id,recv_msg,msgsz,0,0);
if(rc == -1)
printf("received message's mtype is'%ld';mtext if '%s' \n",recv_msg->mtype,recv_msg->mtext);
msgctl(queue_id,ipc_rmid,null);//刪除訊息佇列
二、建立乙個公共訊息佇列,實現客戶程序和服務者程序之間進行通訊
客戶程序向服務者程序傳送訊息,請求服務。服務者程序接受訊息,完成客戶的服務請求後,再將服務結果以訊息方式傳送給客戶。其具體實現描述為:
①服務者程序用關鍵字svkey和標誌ipc_creat呼叫magget()建立乙個訊息佇列,得到佇列的識別符號msgid之後,用msgid呼叫msgrcv()接受型別為req的訊息。
②客戶程序用關鍵字svkey呼叫msgget()得到訊息佇列識別符號msgid,之後用msgid呼叫msgsnd()將自己的pid傳送到訊息佇列(svkey)中,表示其所請求的服務。然後呼叫msgrcv()等待服務結果訊息的到來。
③服務者程序接收到請求服務的訊息後進行服務工作,完成服務後向客戶程序發回一條訊息,訊息的型別為客戶的標識pid,訊息正文是服務者程序自己的標誌pid,
④客戶程序收到服務結果訊息後,顯示必要訊息後,結束兩者的通訊過程。
客戶程序的通訊過程
#include #include #include #include #define svkey 75
#define req 1
struct msgform;
int main()
服務者程序的通訊過程
UNIX緩衝機制
某日一朋友寫了乙個hello world 出不來結果,如下 include int main int argc,char argv 注意到,在 中printf語句列印的字串最後沒有帶換行符,而且最後呼叫了 exit函式,這導致了在終端螢幕上顯示不出來字串 hello world 首先介紹一下unix...
雙緩衝機制
最早解釋多緩衝區如何工作的方式,是通過乙個現實生活中的例項來解釋的。在乙個陽光明媚的日子,你想將水池裡的水換掉,而又找不到水管的時候,你就只能用木桶來灌滿水池。當木桶被水龍頭注滿的,關掉水龍頭,走到水池旁邊,將水到進去,然後走回到水龍頭旁邊繼續重複上述工作,如此往復直到將水池灌滿。這就類似單緩衝工作...
UNIX緩衝機制
某日一朋友寫了乙個hello world 出不來結果,如下 include int main int argc,char argv 注意到,在 中printf語句列印的字串最後沒有帶換行符,而且最後呼叫了 exit函式,這導致了在終端螢幕上顯示不出來字串 hello world 首先介紹一下unix...