程序間通訊 (IPC) 使用訊息佇列


當我們已經擁有共享記憶體時,為什麼還需要訊息佇列?這可能出於多種原因,讓我們嘗試將其分解成多個要點以簡化理解:

  • 如我們所知,一旦一個程序接收了訊息,其他任何程序都將無法再訪問該訊息。而在共享記憶體中,多個程序可以訪問資料。

  • 如果我們希望使用較小的訊息格式進行通訊。

  • 當多個程序同時通訊時,需要使用同步機制來保護共享記憶體資料。

  • 如果使用共享記憶體進行讀寫操作的頻率很高,那麼實現該功能將非常複雜。在這種情況下,不值得使用它。

  • 如果並非所有程序都需要訪問共享記憶體,而只有少數幾個程序需要訪問,那麼使用訊息佇列來實現會更好。

  • 如果我們希望使用不同的資料包進行通訊,例如程序 A 向程序 B 傳送訊息型別 1,向程序 C 傳送訊息型別 10,向程序 D 傳送訊息型別 20。在這種情況下,使用訊息佇列來實現更簡單。為了簡化給定的訊息型別 1、10、20,它可以是 0 或正數或負數,如下所述。

  • 當然,訊息佇列的順序是 FIFO(先進先出)。第一個插入佇列的訊息將是第一個被檢索到的訊息。

使用共享記憶體或訊息佇列取決於應用程式的需求以及如何有效地利用它們。

使用訊息佇列進行通訊可以透過以下方式實現:

  • 一個程序寫入共享記憶體,另一個程序從共享記憶體讀取。我們知道,多個程序也可以進行讀取。

一個程序使用不同的資料包寫入共享記憶體,多個程序從中讀取,即根據訊息型別。

在瞭解了訊息佇列的一些資訊之後,現在是時候檢查支援訊息佇列的系統呼叫(System V)了。

要使用訊息佇列進行通訊,請執行以下步驟:

**步驟 1** - 建立訊息佇列或連線到已存在的佇列 (msgget())

**步驟 2** - 向訊息佇列寫入資料 (msgsnd())

**步驟 3** - 從訊息佇列讀取資料 (msgrcv())

**步驟 4** - 對訊息佇列執行控制操作 (msgctl())

這裡我們將建立兩個程序。一個可以寫入,另一個可以讀取。讓我們看看讀取器和寫入器程序是如何使用共享記憶體工作的。

示例程式碼

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>
// structure for message queue
struct msg_buffer {
   long msg_type;
   char msg[100];
} message;
main() {
   key_t my_key;
   int msg_id;
   my_key = ftok("progfile", 65); //create unique key
   msg_id = msgget(my_key, 0666 | IPC_CREAT); //create message queue and return id
   message.msg_type = 1;
   printf("Write Message : ");
   fgets(message.msg, 100, stdin);
   msgsnd(msg_id, &message, sizeof(message), 0); //send message
   printf("Sent message is : %s \n", message.msg);
}

示例程式碼

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>
// Define message queue structure
struct msg_buffer {
   long msg_type;
   char msg[100];
} message;
main() {
   key_t my_key;
   int msg_id;
   my_key = ftok("progfile", 65); //create unique key
   msg_id = msgget(my_key, 0666 | IPC_CREAT); //create message queue and return id
   msgrcv(msg_id, &message, sizeof(message), 1, 0); //used to receive message
   // display the message
   printf("Received Message is : %s \n", message.msg);
   msgctl(msg_id, IPC_RMID, NULL); //destroy the message queue
   return 0;
}

輸出

更新於: 2019年7月30日

3K+ 瀏覽量

啟動您的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.