【申明:本文僅限於自我歸納總結和相互交流,有纰漏還望各位指出。 聯系郵箱:[email protected]】 消息隊列就是消息的列表。我們可以把它想象成一個鏈表隊列,用戶可以從消息中添加消息或讀取消息,從這樣看它具有FIFO的特性,但它可以實現消息的隨機查詢,因而比FIFO具有更大的優勢,消息隊列存在於內核中,由“隊列ID”來標識。 消息隊列特點: 一、既可以用於親緣關系的進程(線程)中,有可以用於非親緣關系的進程(線程)中。 二、可以順序訪問、隨機訪問數據。 三、系統V消息隊列是隨內核持續的,只有在內核重起或者顯式刪除一個消息隊列時,該消息隊列才會真正被刪除。 下面兩個代碼演示功能: server.c:創建一個消息隊列,並獲取鍵盤輸入內容然後寫入到消息隊列中。 client.c :打開server.c創建的消息隊列,讀取消息隊列中內容然後顯示到屏幕上。 服務端: [cpp] #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <string.h> #define BUFFER_SIZE 512 struct message { long msg_type; char msg_text[BUFFER_SIZE]; }; int main() { int qid; key_t key; struct message msg; /*根據不同的路徑和關鍵字產生標准的key*/ if((key = ftok(".", 512)) == -1) { perror("ftok"); exit(1); } /*創建消息隊列*/ if((qid = msgget(key, IPC_CREAT|0666)) == -1) { perror("msgget"); exit(1); } printf("Open queue %d\n", qid); while(1) { printf("input some message to the queue:"); if((fgets(msg.msg_text, BUFFER_SIZE, stdin)) == NULL) { puts("no message"); exit(1); } msg.msg_type = getpid(); /*添加消息到消息隊列中*/ if((msgsnd(qid, &msg, strlen(msg.msg_text), 0)) <0) { perror("message posted"); exit(1); } if(strncmp(msg.msg_text, "quit", 4) == 0) { break; } } exit(0); } 客服端: [cpp] #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <string.h> #define BUFFER_SIZE 512 struct message { long msg_tpye; char msg_text[BUFFER_SIZE]; }; int main() { int qid; key_t key; struct message msg; /*根據不同的路徑和關鍵字產生標准的key*/ if((key = ftok(".", 512)) == -1) { perror("ftok"); exit(1); } if((qid = msgget(key, IPC_CREAT|0666)) <0) { perror("msgget"); exit(1); } printf("Open queue %d\n", qid); do { memset(msg.msg_text, 0, BUFFER_SIZE); if((msgrcv(qid, (void*)&msg, BUFFER_SIZE, 0, 0)) <0) { perror("msgrcv"); exit(1); } printf("The message form process %d: %s", msg.msg_tpye, msg.msg_text); }while(strncmp(msg.msg_text, "quit", 4)); if((msgctl(qid, IPC_RMID, NULL)) <0) { perror("msgctl"); exit(1); } exit(0); }